阅读时间:2015年10月22日
阅读技巧:用手机截图的方式,把重要的内容重点理解,时常复习
阅读笔记:liunx的标准:
POSIX.1 仅规定了系统服务应用程序编程接口(API),仅概括了基本的系统服务标准,因此期望对 系统的其它功能也制定出标准。这样 IEEE POSIX 的工作就开始展开了。在 1990 年,刚开始有十个批准 的计划在进行,有近 300 多人参加每季度为期一周的会议。着手的工作有命令与工具标准(POSIX.2)、测 试方法标准(POSIX.3)、实时 API(POSIX.4)等。到了 1990 年上半年已经有 25 个计划在进行,并且有 16 个工作组参与了进来。与此同时,还有一些组织也在制定类似的标准,如 X/Open,AT&T,OSF 等。
本文将主要对 Linux 的早期内核 0.11 版进行详细描述和注释。Linux-0.11 版本是在 1991 年 12 月 8 日发布的。在发布时包括以下文件:
bootimage.Z - 具有美国键盘代码的压缩启动映像文件;
rootimage.Z - 以 1200kB 压缩的根文件系统映像文件;
linux-0.11.tar.Z- 内核源代码文件;
as86.tar.Z - linux bruce evans'二进制执行文件;
是 16 位的汇编程序和装入程序;
INSTALL-0.11 - 更新过的安装信息文件。
由于 Linux 内核是一种单内核模式的系统,因此,内核中所有的程序几乎都有紧密的联系,它们之 间的依赖和调用关系非常密切。所以在阅读一个源代码文件时往往需要参阅其它相关的文件。因此有必 要在开始阅读内核源代码之前,先熟悉一下源代码文件的目录结构和安排:
Makefile 简介
makefile 文件是 make 工具程序的配置文件。Make 工具程序的主要用途是能自动地决定一个含有很 多源程序文件的大型程序中哪个文件需要被重新编译。makefile 的使用比较复杂,这里只是根据上面的 makefile 文件作些简单的介绍。详细说明请参考 GNU make 使用手册。
为了使用 make 程序,你就需要 makefile 文件来告诉 make 要做些什么工作。通常,makefile 文件 会告诉 make 如何编译和连接一个文件。当明确指出时,makefile 还可以告诉 make 运行各种命令(例如, 作为清理操作而删除某些文件)。
make 的执行过程分为两个不同的阶段。在第一个阶段,它读取所有的 makefile 文件以及包含的 makefile 文件等,记录所有的变量及其值、隐式的或显式的规则,并构造出所有目标对象及其先决条件 的一幅全景图。在第二阶段期间,make 就使用这些内部结构来确定哪个目标对象需要被重建,并且使用 相应的规则来操作。
当 make 重新编译程序时,每个修改过的 C 代码文件必须被重新编译。如果一个头文件被修改过了, 那么为了确保正确,每一个包含该头文件的 C 代码程序都将被重新编译。每次编译操作都产生一个与源 程序对应的目标文件(object file)。最终,如果任何源代码文件被编译过了,那么所有的目标文件不管 是刚编译完的还是以前就编译好的必须连接在一起以生成新的可执行文件。
简单的 makefile 文件含有一些规则,这些规则具有如下的形式:
目标(target)... : 先决条件(prerequisites)...
命令(command) ...
...
其中'目标'对象通常是程序生成的一个文件的名称;例如是一个可执行文件或目标文件。目标也可 以是所要采取活动的名字,比如'清除'('clean')。'先决条件'是一个或多个文件名,是用作产生目标的 输入条件。通常一个目标依赖几个文件。而'命令'是 make 需要执行的操作。一个规则可以有多个命令, 每一个命令自成一行。请注意,你需要在每个命令行之前键入一个制表符!这是粗心者常常忽略的地方。
如果一个先决条件通过目录搜寻而在另外一个目录中被找到,这并不会改变规则的命令;它们将被 如期执行。因此,你必须小心地设置命令,使得命令能够在 make 发现先决条件的目录中找到需要的先决 条件。这就需要通过使用自动变量来做到。自动变量是一种在命令行上根据具体情况能被自动替换的变 量。自动变量的值是基于目标对象及其先决条件而在命令执行前设置的。例如,’$^’的值表示规则的 所有先决条件,包括它们所处目录的名称;’$<’的值表示规则中的第一个先决条件;’$@’表示目标 对象;另外还有一些自动变量这里就不提了。
有时,先决条件还常包含头文件,而这些头文件并不愿在命令中说明。此时自动变量’$<’正是第 一个先决条件。例如: foo.o : foo.c defs.h hack.h cc -c $(CFLAGS) $< -o $@
其中的’$<’就会被自动地替换成 foo.c,而$@则会被替换为 foo.o 为了让 make 能使用习惯用法来更新一个目标对象,你可以不指定命令,写一个不带命令的规则或者 不写规则。此时 make 程序将会根据源程序文件的类型(程序的后缀)来判断要使用哪个隐式规则。
后缀规则是为 make 程序定义隐式规则的老式方法。(现在这种规则已经不用了,取而代之的是使用 更通用更清晰的模式匹配规则)。下面例子就是一种双后缀规则。双后缀规则是用一对后缀定义的:源后 缀和目标后缀。相应的隐式先决条件是通过使用文件名中的源后缀替换目标后缀后得到。因此,此时下 面的’$<’值是*.c 文件名。而正条 make 规则的含义是将*.c 程序编译成*.s 代码。
.c.s:
$(CC) $(CFLAGS) -nostdinc -Iinclude -S -o $*.s $<
通常命令是属于一个具有先决条件的规则,并在任何先决条件改变时用于生成一个目标(target)文 件。然而,为目标而指定命令的规则也并不一定要有先决条件。例如,与目标'clean'相关的含有删除 (delete)命令的规则并不需要有先决条件。此时,一个规则说明了如何以及何时来重新制作某些文件, 而这些文件是特定规则的目标。make 根据先决条件来执行命令以创建或更新目标。一个规则也可以说明 如何及何时执行一个操作。
一个 makefile 文件也可以含有除规则以外的其它文字,但一个简单的 makefile 文件只需要含有适 当的规则。规则可能看上去要比上面示出的模板复杂得多,但基本上都是符合的。
makefile 文件最后生成的依赖关系是用于让 make 来确定是否需要重建一个目标对象。比如当某个 头文件被改动过后,make 就通过这些依赖关系,重新编译与该头文件有关的所有*.c 文件。这是打开这个文件的注释:
阅读后记:这是技术类的文章,需要对概念采取碎片话的时间加以理解。同时对整体需要有个大概得理解,就像是产品说明介绍一样对每个模块知识充分的认识。