b2c信息网

您现在的位置是:首页 > 热点问题 > 正文

热点问题

linux内核源码分析(linux内核源码分析工具)

hacker2022-06-27 14:09:27热点问题113
本文目录一览:1、Linux内核源代码情景分析适合初学linux的人吗2、

本文目录一览:

Linux内核源代码情景分析适合初学linux的人吗

非常的不适合,如果你是C语言工程师,有实际工作经验的那种能看的明白,如果是学生建议实际一点,算法我就不说了,你要会很多操作系统和数据结构的理论基础。不是学过就可以的

怎么使用,手上有一本linux内核2.4版源代码分析大全

一般在Linux系统中的/usr/src/linux*.*.*(*.*.*代表的是内核版本,如2.4.23)目录下就是内核源代码(如果没有类似目录,是因为还没安装内核代码)。另外还可从互连网上下载。注意,不要总到去下载,最好使用它的镜像站点下载。请在mirrors/里找一个合适的下载点,再到pub/linux/kernel/v2.6/目录下去下载2.4.23内核。

代码目录结构

在阅读源码之前,还应知道Linux内核源码的整体分布情况。现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序和网络等组成。Linux内核源码的各个目录大致与此相对应,其组成如下(假设相对于Linux-2.4.23目录):

1.arch目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录。PC机一般都基于此目录。

2.include目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下。

3.init目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件。这是研究核心如何工作的好起点。

4.mm目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下。

5.drivers目录中是系统中所有的设备驱动程序。它又进一步划分成几类设备驱动,每一种有对应的子目录,如声卡的驱动对应于drivers/sound。

6.ipc目录包含了核心进程间的通信代码。

7.modules目录存放了已建好的、可动态加载的模块。

8.fs目录存放Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext3文件系统对应的就是ext3子目录。

Kernel内核管理的核心代码放在这里。同时与处理器结构相关代码都放在arch/*/kernel目录下。

9.net目录里是核心的网络部分代码,其每个子目录对应于网络的一个方面。

10.lib目录包含了核心的库代码,不过与处理器结构相关的库代码被放在arch/*/lib/目录下。

11.scripts目录包含用于配置核心的脚本文件。

12.documentation目录下是一些文档,是对每个目录作用的具体说明。

一般在每个目录下都有一个.depend文件和一个Makefile文件。这两个文件都是编译时使用的辅助文件。仔细阅读这两个文件对弄清各个文件之间的联系和依托关系很有帮助。另外有的目录下还有Readme文件,它是对该目录下文件的一些说明,同样有利于对内核源码的理解。

在阅读方法或顺序上,有纵向与横向之分。所谓纵向就是顺着程序的执行顺序逐步进行;所谓横向,就是按模块进行。它们经常结合在一起进行。对于Linux启动的代码可顺着Linux的启动顺序一步步来阅读;对于像内存管理部分,可以单独拿出来进行阅读分析。实际上这是一个反复的过程,不可能读一遍就理解。

linux内核源代码情景分析 怎么样

这段时间一直在为毕业论文纠结,论文题目是关于Linux进程模块的源代码分析与研究。 以前拜读过《操作系统设计与实现》,《Linux内核设计与实现》,《understanding the linux kernel 3rd》等等,桌面还有大把的网络下下来的资料。 初识这本书,是大三时候一位同学跟我提起,当时觉得还没到阅读源代码的程度。一直到做这篇论文,在我最纠结的时候,忽然想起朋友说过这本书,于是下了电子版本。 理所当然,我完全被这本书吸引。 我难掩心中的激动,几乎要欢呼起来,这何尝不是一本可以当做小说阅读的书籍! 这本书不像前两本那样,仅仅只是罗列出Linux的特性,数据结构,相关的技术等等,他是在带领你去走进Linux源代码的世界,顺着代码的调用,一路斩荆披棘,最后带你到底目的地。途中虽然惊险,但一路过来,却是充满了趣味,更是享受到了智力上的成就感。 关于书的语言。 读这本书,仿佛是你的好朋友就坐在你面前跟你讲话,他把Linux源码中的枯燥的理论跟生活中普遍的事物联系起来,像进程的task_struct结构体,相当于我们的“户口本”,进程转换到"zombie”状态,“进程死亡了无法帮自己注销户口登记,要父进程帮忙”等等,这些解释非常地形象。所谓的大师也便是如此,用最通俗的语言把最深奥的道理讲明白,我想,这本书的作者做到了。 此书的不足。 这本书也存在着不足之处。第一点,此书是2001年出版的,所以是以2.4版本的源代码为基础的,而现在已经长期停留在2.6版本了;第二是,书中的图片严重不足,很多原理只要附加张图片便能让读者明了,可是作者花了不少的篇幅去解释而没有附加图片,这很让人费解,或者这是因为录入不是作者本人做的原因;第三,这跟很多国内书籍类似,没有索引,查找代码的讲解是件很痛苦的事情。 距离这本书第一次出版已经有八年的时间了,希望作者能抽出时间再修订,在此基础上做2.6版本源代码的分析。 这是我见过的国内比较好的真正用心去写的计算机书籍,在此之前也只读过一本关于汇编语言的书籍,作者是王爽。依稀还记得当年舍友都睡了的时候,一个人小心翼翼地趴在笔记本前仔细阅读的情景,如今甚是怀念。 这是本好书。

LINUX内核源代码情景分析(上册)

毫不犹豫的买下了,京东速度果然非常快的,从配货到送货也很具体,快递非常好,很快收到书了。书的包装非常好,没有拆开过,非常新,可以说无论自己阅读家人阅读,内核源代码情景分析(上册)采取类似于英语教学中行之有效的情景会话的教学方法,全面深入地剖析了最新版本核心源代码,并对核心的独特优点和需要进一步改进的问题作了精辟的评述。内核源代码情景分析(上册)包括预备知识、存储管理、中断和系统调用、进程和进程调度、文件系统以及传统的进程通讯共六章。收藏还是送人都特别有面子的说,特别精美各种十分美好虽然看着书本看着相对简单,但也不遑多让,塑封都很完整封面和封底的设计、绘图都十分好画让我觉得十分细腻具有收藏价值。书的封套非常精致推荐大家购买。打开书本,书装帧精美,纸张很干净,文字排版看起来非常舒服非常的惊喜,让人看得欲罢不能,每每捧起这本书的时候似乎能够感觉到作者毫无保留的把作品呈现在我面前。作业深入浅出的写作手法能让本人犹如身临其境一般,好似一杯美式咖啡,看似快餐,其实值得回味无论男女老少,第一印象最重要。从你留给别人的第一印象中,就可以让别人看出你是什么样的人。所以多读书可以让人感觉你知书答礼,颇有风度。多读书,可以让你多增加一些课外知识。培根先生说过知识就是力量。不错,多读书,增长了课外知识,可以让你感到浑身充满了一股力量。这种力量可以激励着你不断地前进,不断地成长。从书中,你往往可以发现自己身上的不足之处,使你不断地改正错误,摆正自己前进的方向。所以,书也是我们的良师益友。多读书,可以让你变聪明,变得有智慧去战胜对手。书让你变得更聪明,你就可以勇敢地面对困难。让你用自己的方法来解决这个问题。这样,你又向你自己的人生道路上迈出了一步。多读书,也能使你的心情便得快乐。读书也是一种休闲,一种娱乐的方式。读书可以调节身体的血管流动,使你身心健康。所以在书的海洋里遨游也是一种无限快乐的事情。用读书来为自己放松心情也是一种十分明智的。读书能陶冶人的情操,给人知识和智慧。所以,我们应该多读书,为我们以后的人生道路打下好的、扎实的基础!读书养性,读书可以陶冶自己的性情,使自己温文尔雅,具有书卷气读书破万卷,下笔如有神,多读书可以提高写作能力,写文章就才思敏捷旧书不厌百回读,熟读深思子自知,读书可以提高理解能力,只要熟读深思,你就可以知道其中的道理了读书可以使自己的知识得到积累,君子学以聚之。总之,爱好读书是好事。让我们都来读书吧。其实读书有很多好处,就等有心人去慢慢发现.最大的好处是可以让你

linux内核源码详解

Linux的内核源代码可以从很多途径得到。一般来讲,在安装的linux系统下,/usr/src/linux目录下的东西就是内核源代码。

对于源代码的阅读,要想比较顺利,事先最好对源代码的知识背景有一定的了解。对于linux内核源代码来讲,我认为,基本要求是:1、操作系统的基本知识; 2、对C语言比较熟悉,最好要有汇编语言的知识和GNU C对标准C的扩展的知识的了解。

另外在阅读之前,还应该知道Linux内核源代码的整体分布情况。我们知道现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序、网络等组成。看一下Linux内核源代码就可看出,各个目录大致对应了这些方面。Linux内核源代码的组成如下(假设相对于linux目录):

arch 这个子目录包含了此核心源代码所支持的硬件体系结构相关的核心代码。如对于X86平台就是i386。

include 这个目录包括了核心的大多数include文件。另外对于每种支持的体系结构分别有一个子目录。

init 此目录包含核心启动代码。

mm 此目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/-/mm目录下,如对应于X86的就是arch/i386/mm/fault.c 。

drivers 系统中所有的设备驱动都位于此目录中。它又进一步划分成几类设备驱动,每一种也有对应的子目录,如声卡的驱动对应于drivers/sound。

ipc 此目录包含了核心的进程间通讯代码。

modules 此目录包含已建好可动态加载的模块。

fs Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext2文件系统对应的就是ext2子目录。

kernel 主要核心代码。同时与处理器结构相关代码都放在arch/-/kernel目录下。

net 核心的网络部分代码。里面的每个子目录对应于网络的一个方面。

lib 此目录包含了核心的库代码。与处理器结构相关库代码被放在arch/-/lib/目录下。

scripts 此目录包含用于配置核心的脚本文件。

Documentation 此目录是一些文档,起参考作用。

求一段Linux操作系统源代码分析

Linux内核的配置系统由三个部分组成,分别是:

Makefile:分布在 Linux 内核源代码中的 Makefile,定义 Linux 内核的编译规则;

配置文件(config.in):给用户提供配置选择的功能;

配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于 Ncurses 图形界面以及基于 Xwindows 图形界面的用户配置界面,各自对应于 Make config、Make menuconfig 和 make xconfig)。

这些配置工具都是使用脚本语言,如 Tcl/TK、Perl 编写的(也包含一些用 C 编写的代码)。本文并不是对配置系统本身进行分析,而是介绍如何使用配置系统。所以,除非是配置系统的维护者,一般的内核开发者无须了解它们的原理,只需要知道如何编写 Makefile 和配置文件就可以。所以,在本文中,我们只对 Makefile 和配置文件进行讨论。另外,凡是涉及到与具体 CPU 体系结构相关的内容,我们都以 ARM 为例,这样不仅可以将讨论的问题明确化,而且对内容本身不产生影响。

2. Makefile

2.1 Makefile 概述

Makefile 的作用是根据配置的情况,构造出需要编译的源文件列表,然后分别编译,并把目标代码链接到一起,最终形成 Linux 内核二进制文件。

由于 Linux 内核源代码是按照树形结构组织的,所以 Makefile 也被分布在目录树中。Linux 内核中的 Makefile 以及与 Makefile 直接相关的文件有:

Makefile:顶层 Makefile,是整个内核配置、编译的总体控制文件。

.config:内核配置文件,包含由用户选择的配置选项,用来存放内核配置后的结果(如 make config)。

arch/*/Makefile:位于各种 CPU 体系目录下的 Makefile,如 arch/arm/Makefile,是针对特定平台的 Makefile。

各个子目录下的 Makefile:比如 drivers/Makefile,负责所在子目录下源代码的管理。

Rules.make:规则文件,被所有的 Makefile 使用。

用户通过 make config 配置后,产生了 .config。顶层 Makefile 读入 .config 中的配置选择。顶层 Makefile 有两个主要的任务:产生 vmlinux 文件和内核模块(module)。为了达到此目的,顶层 Makefile 递归的进入到内核的各个子目录中,分别调用位于这些子目录中的 Makefile。至于到底进入哪些子目录,取决于内核的配置。在顶层 Makefile 中,有一句:include arch/$(ARCH)/Makefile,包含了特定 CPU 体系结构下的 Makefile,这个 Makefile 中包含了平台相关的信息。

位于各个子目录下的 Makefile 同样也根据 .config 给出的配置信息,构造出当前配置下需要的源文件列表,并在文件的最后有 include $(TOPDIR)/Rules.make。

Rules.make 文件起着非常重要的作用,它定义了所有 Makefile 共用的编译规则。比如,如果需要将本目录下所有的 c 程序编译成汇编代码,需要在 Makefile 中有以下的编译规则:

%.s: %.c

$(CC) $(CFLAGS) -S $ -o $@

有很多子目录下都有同样的要求,就需要在各自的 Makefile 中包含此编译规则,这会比较麻烦。而 Linux 内核中则把此类的编译规则统一放置到 Rules.make 中,并在各自的 Makefile 中包含进了 Rules.make(include Rules.make),这样就避免了在多个 Makefile 中重复同样的规则。对于上面的例子,在 Rules.make 中对应的规则为:

%.s: %.c

$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$(*F)) $(CFLAGS_$@) -S $ -o $@

2.2 Makefile 中的变量

顶层 Makefile 定义并向环境中输出了许多变量,为各个子目录下的 Makefile 传递一些信息。有些变量,比如 SUBDIRS,不仅在顶层 Makefile 中定义并且赋初值,而且在 arch/*/Makefile 还作了扩充。

常用的变量有以下几类:

1) 版本信息

版本信息有:VERSION,PATCHLEVEL, SUBLEVEL, EXTRAVERSION,KERNELRELEASE。版本信息定义了当前内核的版本,比如 VERSION=2,PATCHLEVEL=4,SUBLEVEL=18,EXATAVERSION=-rmk7,它们共同构成内核的发行版本KERNELRELEASE:2.4.18-rmk7

2) CPU 体系结构:ARCH

在顶层 Makefile 的开头,用 ARCH 定义目标 CPU 的体系结构,比如 ARCH:=arm 等。许多子目录的 Makefile 中,要根据 ARCH 的定义选择编译源文件的列表。

3) 路径信息:TOPDIR, SUBDIRS

TOPDIR 定义了 Linux 内核源代码所在的根目录。例如,各个子目录下的 Makefile 通过 $(TOPDIR)/Rules.make 就可以找到 Rules.make 的位置。

SUBDIRS 定义了一个目录列表,在编译内核或模块时,顶层 Makefile 就是根据 SUBDIRS 来决定进入哪些子目录。SUBDIRS 的值取决于内核的配置,在顶层 Makefile 中 SUBDIRS 赋值为 kernel drivers mm fs net ipc lib;根据内核的配置情况,在 arch/*/Makefile 中扩充了 SUBDIRS 的值,参见4)中的例子。

4) 内核组成信息:HEAD, CORE_FILES, NETWORKS, DRIVERS, LIBS

Linux 内核文件 vmlinux 是由以下规则产生的:

vmlinux: $(CONFIGURATION) init/main.o init/version.o linuxsubdirs

$(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o

--start-group

$(CORE_FILES)

$(DRIVERS)

$(NETWORKS)

$(LIBS)

--end-group

-o vmlinux

可以看出,vmlinux 是由 HEAD、main.o、version.o、CORE_FILES、DRIVERS、NETWORKS 和 LIBS 组成的。这些变量(如 HEAD)都是用来定义连接生成 vmlinux 的目标文件和库文件列表。其中,HEAD在arch/*/Makefile 中定义,用来确定被最先链接进 vmlinux 的文件列表。比如,对于 ARM 系列的 CPU,HEAD 定义为:

HEAD := arch/arm/kernel/head-$(PROCESSOR).o

arch/arm/kernel/init_task.o

表明 head-$(PROCESSOR).o 和 init_task.o 需要最先被链接到 vmlinux 中。PROCESSOR 为 armv 或 armo,取决于目标 CPU。 CORE_FILES,NETWORK,DRIVERS 和 LIBS 在顶层 Makefile 中定义,并且由 arch/*/Makefile 根据需要进行扩充。 CORE_FILES 对应着内核的核心文件,有 kernel/kernel.o,mm/mm.o,fs/fs.o,ipc/ipc.o,可以看出,这些是组成内核最为重要的文件。同时,arch/arm/Makefile 对 CORE_FILES 进行了扩充:

# arch/arm/Makefile

# If we have a machine-specific directory, then include it in the build.

MACHDIR := arch/arm/mach-$(MACHINE)

ifeq ($(MACHDIR),$(wildcard $(MACHDIR)))

SUBDIRS += $(MACHDIR)

CORE_FILES := $(MACHDIR)/$(MACHINE).o $(CORE_FILES)

endif

HEAD := arch/arm/kernel/head-$(PROCESSOR).o

arch/arm/kernel/init_task.o

SUBDIRS += arch/arm/kernel arch/arm/mm arch/arm/lib arch/arm/nwfpe

CORE_FILES := arch/arm/kernel/kernel.o arch/arm/mm/mm.o $(CORE_FILES)

LIBS := arch/arm/lib/lib.a $(LIBS)

5) 编译信息:CPP, CC, AS, LD, AR,CFLAGS,LINKFLAGS

在 Rules.make 中定义的是编译的通用规则,具体到特定的场合,需要明确给出编译环境,编译环境就是在以上的变量中定义的。针对交叉编译的要求,定义了 CROSS_COMPILE。比如:

CROSS_COMPILE = arm-linux-

CC = $(CROSS_COMPILE)gcc

LD = $(CROSS_COMPILE)ld

......

CROSS_COMPILE 定义了交叉编译器前缀 arm-linux-,表明所有的交叉编译工具都是以 arm-linux- 开头的,所以在各个交叉编译器工具之前,都加入了 $(CROSS_COMPILE),以组成一个完整的交叉编译工具文件名,比如 arm-linux-gcc。

CFLAGS 定义了传递给 C 编译器的参数。

LINKFLAGS 是链接生成 vmlinux 时,由链接器使用的参数。LINKFLAGS 在 arm/*/Makefile 中定义,比如:

# arch/arm/Makefile

LINKFLAGS :=-p -X -T arch/arm/vmlinux.lds

6) 配置变量CONFIG_*

.config 文件中有许多的配置变量等式,用来说明用户配置的结果。例如 CONFIG_MODULES=y 表明用户选择了 Linux 内核的模块功能。

.config 被顶层 Makefile 包含后,就形成许多的配置变量,每个配置变量具有确定的值:y 表示本编译选项对应的内核代码被静态编译进 Linux 内核;m 表示本编译选项对应的内核代码被编译成模块;n 表示不选择此编译选项;如果根本就没有选择,那么配置变量的值为空。

2.3 Rules.make 变量

前面讲过,Rules.make 是编译规则文件,所有的 Makefile 中都会包括 Rules.make。Rules.make 文件定义了许多变量,最为重要是那些编译、链接列表变量。

O_OBJS,L_OBJS,OX_OBJS,LX_OBJS:本目录下需要编译进 Linux 内核 vmlinux 的目标文件列表,其中 OX_OBJS 和 LX_OBJS 中的 "X" 表明目标文件使用了 EXPORT_SYMBOL 输出符号。

M_OBJS,MX_OBJS:本目录下需要被编译成可装载模块的目标文件列表。同样,MX_OBJS 中的 "X" 表明目标文件使用了 EXPORT_SYMBOL 输出符号。

O_TARGET,L_TARGET:每个子目录下都有一个 O_TARGET 或 L_TARGET,Rules.make 首先从源代码编译生成 O_OBJS 和 OX_OBJS 中所有的目标文件,然后使用 $(LD) -r 把它们链接成一个 O_TARGET 或 L_TARGET。O_TARGET 以 .o 结尾,而 L_TARGET 以 .a 结尾。

发表评论

评论列表

  • 闹旅戏侃(2022-06-27 17:22:28)回复取消回复

    环境中输出了许多变量,为各个子目录下的 Makefile 传递一些信息。有些变量,比如 SUBDIRS,不仅在顶层 Makefile 中定义并且赋初值,而且在 arch/*/Makefile 还作了扩充。常用的变量有以下几类:1) 版本信息版本信息有:VERSION

  • 青迟语酌(2022-06-27 14:13:24)回复取消回复

    E),以组成一个完整的交叉编译工具文件名,比如 arm-linux-gcc。CFLAGS 定义了传递给 C 编译器的参数。LINKFLAGS 是链接生成 vmlinux 时,由链接器使用的参数。LINKFLAGS 在 arm/*/Makefile 中定义,比如:# arch/a