Linux内核完全解读.pdf内容简介本书对初期Liuⅸ操作内核(v.11)全部代码文件进行了详尽全面的注释和说明,致力让该者才能在尽量短的时间内对Iinuⅸ的工作机理获得全面而深刻的理解,为进一步学习和研究Liux系统打下坚实的基础。其实所选择的版木较低,但该内核能否匚常编译运行,而且其中已包括了LINUⅹ工作原理的真谛。书中首先以Linux源代码版本的演进为主线,概要而有趣地介绍了Linux系统的发展历史,同时着亘说明了各个内核版本之间的主要区别和改进方面,绘岀了选择0.11(0.95)版内核源代码作为研究对象的诱因。之后在即将开始描述内核源代码之前,概要介绍了运行Linux系统的PC机的硬件组成结构、编制内核使用的汇编语言和¢溍言扩充邹分,并闬重点说明了80Ⅺ86处理器在保护模式下运行的编稈方式接着我们详尽介绍了Linx内核源代码日录树组织结构,并根据该组织结构对所有内核程序和文件进行了注释和详尽说明有关代码注释的章节安排基本上都分为具体硏究对象的概述、每个文作的功能介绍、代码内注释、代码中难点及相关资料介缃等部份逐渐展开。为了加深读者对内核工作原理的理解,书中最后一章给岀了围绕LiuκO.I系统的多个试验。
试验屮所使用的相关程序均可从本书配套网站()上下毂。木书适宜作为院校计算机专业中学生学习操作系統踝程的辅助和实践教材,也适宜Linux爱好者作为学习内核工作原理的自学参考书籍,还可供通常技术人员作为开发嵌入式系统的参考书使用版权说明作者保留本电子书籍的更改和即将出版的所有权不读者可以自由传播本书全部和部份章节的内容但须要标明出处因为近日木书一直处于不断改进阶毅,囚此其中肯定还存在一些错误和不足之处。希望读者能踊跃给与批评见谅或良好建议。反馈信息可以通过电子短信发给我:gohigh(@sh163net或,也可直接来信至:重庆复旦学院联通工程大学计算机系(江建慧院士收),或机械电∫工程硏究所(赵炯收)(北京四丬路1239号,邮编:20002)。o2002-2007byZhaoJiong◎2002-2007赵炯版权所有.RTFSC-ReadTheFxkx*kingSourceCodee!Linusbenedicttorvalds目录目录引言55LINUX的系统调用.16056系统时间和定时162本书的主要目标57LINUX进程控制164现有书籍不足之处…58LINUX系统中堆栈的使用方式…172阅读初期内核的其他用处59LNUx0.l1采用的文件系统l76阅读完整源代码的重要性和必要性∴5.10LNUX内核源代码的目录结构177怎么选择要阅读的内核代码版本511内核系统与应用程序的关系…阅读木书需具备的基础知识5.12LINUX/MAKEFILE文件使用初期版本是否过时?…445513本章小结FXT2文件系统与MINIX文件系统第6章引导启动程序(BOOTnn191第1章概述61总体功能1911.1LINUX的诞生和发展6,2BOOTSECTS程序1931.2内容综述1263SETUP.S程序2031.3木章小结…1664HEAD.S程序221第2章微型计算机组成结构…2341765本章小结2.1微型计算机组成原理17第7章初始化程序(NIT)………23522IO端口轮询和访问控制方法…197MAIN.C程序23523寻址储器、BIOS和CMOS储存器…….7.2环境初始化工作.……24724控制器和控制.237.3本章小结492.5本章小结…3第8章内核代码(KERNEL)…251第3章内核编程语言和环境328.1总体功能……3.1As86汇编器3282MAKEFILE文件25432GNUAS汇编3883ASMS程序….2563.3C语言程序.…4884TRAPS.C程序…26234C与汇编程序的互相调用…….….58.5SYSTEMCALL.S程序2673.5LNUx0.11目标文件格式86MKTIME.C程序36MAKE程序和MAKEFILE文件,7287SCHEDC程序281第4章80X86保护模式及其编程…17588SIGNAL.C程序30089EXI:C程序4.180X86系统寄存器和系统指令..758.10FORK.C程序…4linux内核完全剖析,2保护模式显存管理.8.ISYS.C程序3264.3分段机制,8.12VSPRINTFC程序33344分页机制8.13PRINTK.C程序3414.5保护998.|4PANICO程序3424.6中断和异常处理1108.15本章小结3434.7任务管理l2048保护模式编程初始化128第9章块设备驱动程序BLOCKDRIVER)…34549一个简单的多任务内核实例1319.总体功能.346第5章LINUX内核体系结构…14192MAKEFILE文件34993BLKH文件35151LNUx内核模式14194HDC程序52LINUX内核系统体系结构9.5LLC程序5.3LINUX内核对显存的管理和使用96RAMDISK.C程序38454中断机制…15797LOPPYO程序390目录第10章字符设备驱动程序CHARDRIVER)…,41714.12TIME,H文件…172210.1总体功能72441714.13UNISTD.H文件102MAKEFILE文件72942714.14UTIME.H文件10.3KEYBOARDS程序14.15INCLUDE/ASM/求下的文件173110.4CONSOLE.C程序.14.1610.H文什.73l44810.5SERIALC程序1417MEMORYH文件73247410.6Rso.s程序…48314.18SEGMENT.H文件……10.7TTYIO.C程序14.19SYSTEMH文件487…173510.8TTYIOCTL.C程序1420INCLUDE/LINUX/目录下的文件7391421CONFIG.H文件739第11章物理协处理器(MATH)5071422FDREG.H头文件……1741111MAKEFILE文件7445071423FSH文件++·11.2MATH-EMULATION.O程序5091424HDREGH文件7491425HEAD.H文件第12章文件系统(FS)…5111426KERNELH文件75312.1总体功能5111427MMH文件…754122MAKEFILE文件1428SCHD.H文件123BUFFERC程序5301429sYS.H文件761124BITMAP.C程序…5471430TTY.H文件.76312.5TRUNCTE.C程序.5531431INCLUDE/SYS/目录中的文件766126NODEC程序…14.32STATH文什127SUPERO程序∴5671433TIMES.H文件128NAMEL.C程序.5771434TYPES.H文件…76812.9FILETABLE.C程序60114.35UTSNAMEH文件.12.10BLOCKDEVO程序6011436wAmH文件77012.11FILEDEV.C程序605第15章库文件IB)77312.12PIPE.C程序60812.13CHARDEⅤC程序61215.1MAKEFILE文件……77412.14READWRITE.C稈序6ll51525152EXTC程序77612.15OPNC程序.621153CLOSE.C程序12.16EXEC.C程序627154CTYPE,C程序77712.17STATC程序….64755DUPC程序77812.18FCNTL.C程序156ERRNO.C程序77912.19IOCTL,C程序652157EXECVE.C程序…77915.8MALLOC.C程序780第13章显存管理(MM)…655159OPEN.C程序78913.1总体功能65515.10SETSID.O程序.…790132MAKEFILE文件66115.11STRINGC程序791133MEMORYC程序15.12wArC程序791134RAGF.S程序..67915.13wRC程序792第14章头文件(NCLUDE)…683第16章建造工具(TOOLS)…19514.1INCLUDE/日录下的文件…16.1BUDC程序79514.2A.OUT丑HI文件684第17章实验环境设置与使用方式802143CONST.H文件.…144CTYPE.H文件…69517.1BOCHS仿真系统0214.5ERRNO.H文件697172在BOCHS中运行LNUx0.11系统146FCNTL.H文件69917.3访问c盘映像文件中的信息.…147SIGNAL.H文件…170117.4编译运行简单内核示例程序∴815148STDARG.H文件17.5借助BOCHS调试内核149STDDEFE文件70417.6创建c盘映像文件.82414.10STRINGH文件70517.7制做根文件系统…14.11TERMIOS.H文件715178在LINUX0.11系统上编译0.11内核…83417.9在REDHAT9系统下编译LNUx0.11内核.835目录17.10内核引导启动+根文件系统红成的集成盘838附表2ASCⅡ码表…17.11从硬碟启动:借助SHOELACE引导软件.843附表3常用C0、CI控制字符表17.12借助GDB和BOCHS调试内核源代码…..846附表4常用通配符序列和控制序列865参考文献…853附表5第1套按键扫描码集∴…..-.-.-.868附表…索引∴869855附表1内核数据结构.855III前言前言本是一本有关Linux操作系统内核基本工作原理的入门读物。
本书的主要目标本书的主要目标是使用尽量少的篇幅或在有限的篇幅内,对完整的Linux内核源代码进行解剖,以期对操作系统的基本功能和实际实现方法获得仝方位旳理解。做到对linux内核有一个完整而深刻的理解,对inux操作系统的基本工作原理真正珒解和入门。本书读者群的定位是一些知晓Iinuⅹ系统的通常使用方汏或具有一定的编程基础,但比较欠缺阅读目前最新内核源代码的基础知识,又迫切希望才能一步理解UNX类操作系统内核工作原理和实际代码实现的爱好者。这部份读者的水平应当界于中级与初级水平之间。目前,这部份读者人数在Linux爱好者中所占的比列是很高的,而面向这部份读者以比较易懂和有效的手段讲解内核的书籍资料不多。现有书籍不足之处目前已有的描述Linux内核的书籍,均尽量选用最新Linux内核版本(比如Redhat7.0使用2.2.16、Fedoracore4使用2.6.11稳定版等)进行描述,但因为目前Linux内核整个源代码的大小早已十分得大(比如2.2.20版就已具有268万行代码!),因而这种书籍仅能对Linux内核源代码进行选择性地或原理性地说明,许多系统实现细节被忽视。
因而并不能给与读者对实狝Liμx内核有淸晰而完整的理解。Scottmaxwell著的一书巛Linux内核源代码剖析》(陆丽娜等译)基木上是面对Liu高级水丬的读者,须要较为全面的基础知识就能完全理解。并且可能是因为篇幅所限,该书并没有对所有Linux内核代码进行注释,略去了好多内核实现细节,比如其中内核中使用的各个头文件(*h)、生成内核代码映像文件的工具程序、各个make文件的作用和实现等均没有涉及。因而对于处于中学级水平之间的读者来说阅读该书有些困难四川学院出版的《Linuⅸx内核源代码情境剖析》一书linux学习视频,也基本有这种不足之处。甚全对于一些具有较高Linux系统应用水平的计算机专科高年级中学生,因为该书篇幅问题以及仅仅选择性地讲解内核源代码,也不能真正吃透内核的实际实现方法,因此常常刚开始阅读就舍弃了。该书刚面市时linux内核完全剖析,本人曾竭力劝阻中学生购之阅读,而在一个月后调查阅读学习情况时,基本都存在看不下去或不能理解等问题,大多数人都舍弃了。Johnlions著的《莱昂氏UNⅨ源代咼剖析》一书其实是一木学习UNIX类操仵系统内核源代码挺好的书籍,并且因为其采用的是UNXV6版,其中系统调用等部份代码是用已经废弃的PDP11系列机的汇编语言编制的,因而在阅读和理解与硬件部份相关的源代码时才会選到较大的困难。
A.S.Tanenbaum的书《操作系统:设计与实现》是一本有关操作系统内核实现挺好的入门书籍,但该书所表述的MNIX系统是·种基于消息传递的内核实现机制,与Linux内核的实现有所区别。因而在学习该书以后,并不能很顺利地即刻着手进一步学习较新的Liux内核代码实现、在使用这种书籍进行学习时会有一种“盲人摸象”的觉得,不能真正理解Liux内核系统具体实现的整体概念,尤其是对这些Linux系统初学者或刚学会怎样使用Linux系统的人在使用这些书学习内核原理时,内核的整体运作结构并不能淸晰地仁脑海中产生。这在本人多年的Iinuⅹ内核学习过程中也深自序有感受。在1991年10月份,Linux的创始人Linustorvald在开发出Linux0.03版后写的一篇文章中也提及了同样的问题。在这篇题为“LNUX-afreeunix-386kernel”l的文章中,他说:“开发Linux是为了这些操作系统爱好者和计算机科学系的中学生使用、学丬和娱乐”。“自由软件基金会的GNUHurd系统假如开发下来就早已变得太庞大而不适宜学习和理解。而现在流行的Linux系统要比当初GNU的Hurd系统更为庞大和复杂,因而同样也早已不适宜作为操作系统初学者的入门学习起点。
这也是作者基于Linux初期内核版本写作本书的动机之一。为了弥补这个空缺,本书的主要目标是使用尽量少的篇幅或在有限的篇幅内,对完整的Liux内核源代码进行全面解剖,以期对操作系统的基本功能和实际实现方法获得全方位的理解。做到对Linux内核有一个完整而深刻的理解redhat linux 9.0,对Linux操作系统的基本工作原理真正理解和入门。阅读初期内核的其他用处近日,早已出现不少基于Linux初期内核而开发的专门用于嵌入式系统的内核版本,如DJ的x86操作系统、Uclinux等(在上有专门目录),世界上也有许多人认识到通过初期Linux内核源代码学习的益处,目前国外乜早已有人正在组织人力注释出版类似本文的书籍。因而,通过阅读Linux初期内核版本的源代码,的确是学丬Linux系统的种行之有效的途径,但是对研究和应用Linux嵌入式系统也有很大的帮助在对初期内核源代码的注释过程中,作者发觉,初期内核源代码几乎就是目前所使用的较新内核的个精简版本。其中早已包括了目前新版本中几乎所有的基本功能原理的内容。正如《系统软件:系统编程简史》一书的作者LelandL.Beck在介绍系统程序以及操作系统设计时,引入了一和极度简化的简单指令计算机(SC)系统来说明所有系统程序的设计和实现原理,因而既避开了实际计算机系统的复杂性,乂能透彻地说明问题。
这儿选择Linux的初期内核版本作为学习对象,其指导思想与Leland的一致。这对Linux内核学习的入门者来说,是最理想的选择之一。才能在尽可能短的时间内深入理解Liux内核的基本工作原理对于这些早已比较熟悉内核工作原理的人,为了能让自己在实际工作中对系统的实际运转机制不形成一种空中楼阁的觉得,因而也有必要阅读内核源代码。其实,使用初期内核作为学习的对象也有不足之处。所选用的Linux初期内核版本不包含对虚拟文件系统ⅤFS的支持、对网路系统的支持、仅支持a.out执行文件和对其他一些现有内核中复杂子系统的说明。但因为本书是作为Linux内核工作机理实现的入门教材,因而这也正是选择初期内核版本的优点之一。通过学习本书,可以为进一步学习这种中级内容打下扎实的基础。阅读完整源代码的重要性和必要性正如Linuκ系统的创始人在篇新闻组投稿上所说的,要理解个软件系统的貞正运行机制,定要阅读其源代码(RTFSC-ReadTheFuckingSourceCode)。系统本身是一个完整的整体,具有好多看似不重要的细节冇在,而且若忽视那些细节,都会对整个系统的理解带来困难,但是不能真正了解一个实际系统的实现方式和手段。
尽管通过阅读一些操作系统原理精典书籍(比如M.J.Bach的《UNIX操作系统设计》)才能对UNX类操作系统的工作原理有些理论上的指导作用,但实际上对操作系统的貞正组成和内部关系实现的理解仍不是很淯晰。正如ΔST所说的,“许多操作系统教材都是重理论而轻实践”,“多数书籍和课程为调度算法花费大量旳时间和篇幅而完全忽视ⅠO,虽然,后者一般不足一页代码,而前者常常要占到整个原文可参见前言系统三分之一的代码总数。”内核中大量的重要细节均未提及。因而并不能让读者理解一个真正的操作系统实现的奥妙所仨。只有在详尽阅读过完整的内核源代码然后,就会对系统有一种恍然活泼的觉得,对整个系统的运作过程有深刻的理解。之后再选择最新的或较新内核源代码进行学丬吋,也不会位到大问题,基本上都能顺利地理解新代码的内容。怎么选择要阅读的内核代码版本这么,怎么选择既能达到上述要求,又不被太多的内容而搞乱脑子,选择一个适宜的Linux内核版本进行学习,提髙学习的效率呢?作者通过对大量内核版本进行比较和选择后,最终选择了与目前Linux内核基本功能较为相仿,又十分短小的0.11版内核作为入门学习的最佳版本。右图是对一些主要Linux内核版本行数的统计Linux内核各版木源代码行数1000100R105555555否5下F雨同雨再卜9内核版本号目前的Linux内核源代码量都在几百万行的数目上,2.60版内核代码行数约为592万行,非常庞大对这种版本进行完全注释和说明几乎是不可能的。
而0.11版内核不超过2万行代码量,因而完全可以在木书中解释和注释清楚。庥雀虽小,脏腑俱全。为」对所研究的系统有感性的∫解,并能借助实验来加深对原理的理解,作者还专门重建了基于该内核的可运行的Linux0.11系统。因为其中富含GNUgcc编译环境,因而使用该系统也能似一些简单的开发工作另外,使用该版本可以防止使用现有较新内核版本巾早已显得越米越复杂得各子系统部份的研究(如虚拟文件系统ⅤFS、εx口或εxt文件系统、网络子系统、新的复杂的显存管理机制等)阅读本书需具备的基础知识在阅读本书时,读者必须具备一些基本的C语言知识和IntelcPu汇编语言知识。有关C诰言最佳的参考资料一直是brainw.Kernighan和Dennism,Ritchie编撰的《TheCProgrammingLanguage》一书。而汇编语言的资料则可以参考仟意一本讲解与Intelcpu相关的汇编语言教材。另外还须要一些嵌入式汇编语言的资料。有关嵌入式汇编的权威信息都包含在GnUgcc编译器指南中。我们也可以从Internet
本文原创地址://gulass.cn/zqlczxtnhvbn.html编辑:刘遄,审核员:暂无