用来阅读linux内核,如何阅读Linux源码

a4c26d1e5885305701be709a3d33442f.png

如何阅读Linux源码

(2008-03-20 15:56:43)

标签:

linux

it

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)。

archMakefile 还作了扩充。

常用的变量有以下几类:

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;根据内核的配置情况,在 archMakefile

中定义,用来确定被最先链接进 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 中定义,并且由

archMakefile 中定义,比如:

# 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

结尾。

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

a4c26d1e5885305701be709a3d33442f.png

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值