linux内核源代码漫游

linux内核源代码漫游

ID:12081016

大小:51.00 KB

页数:15页

时间:2018-07-15

linux内核源代码漫游_第1页
linux内核源代码漫游_第2页
linux内核源代码漫游_第3页
linux内核源代码漫游_第4页
linux内核源代码漫游_第5页
资源描述:

《linux内核源代码漫游》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、本章试图以顺序的方式来解释Linux源代码,以帮助读者对源代码的体系结构以及很多相关的unix特性的实现有一个很好的理解。目标是帮助对Linux不甚了解的有经验的C程序员对整个Linux的设计有所了解。这也就是为什么内核漫游的入点选择为内核本身的启始点:系统引导(启动)。这份材料需要对C语言以及对Unix的概念和PC机的结构有很好的了解,然而本章中并没有出现任何的C代码,而是直接参考(指向)实际的代码的。有关内核设计的最佳篇幅是在本手册的其它章节中,而本章仍趋向于是一个非正式的概述。本章中所参阅的任何文件的路径名都是指主源代码目录树,

2、通常是/usr/src/linux。这里所给出的大多数信息都是取之于Linux发行版1.0的源代码。虽然如此,有时也会提供对后期版本的参考。这篇漫游中开头有图标的任何小节都是强调1.0版本后对内核的新的改动。如果没有这样的小节存在,则表示直到版本1.0.9-1.1.76,没有作过改动。有时候本章中会有象这样的小节,这是指向正确的代码以对刚讨论过的主题取得更多信息的指示符。当然,这里是指源代码。引导(启动)系统当PC的电源打开后,80x86结构的CPU将自动进入实模式,并从地址0xFFFF0开始自动执行程序代码,这个地址通常是ROM-B

3、IOS中的地址。PC机的BIOS将执行某些系统的检测,在物理地址0处开始初始化中断向量。此后,它将可启动设备的第一个扇区读入内存地址0x7C00处,并跳转到这个地方。启动设备通常是软驱或是硬盘。这里的叙述是非常简单的,但这已经足够理解内核初始化的工作过程了。Linux的最最前面部分是用8086汇编语言编写的(boot/bootsect.S),它将由BIOS读入到内存0x7C00处,当它被执行时就会把自己移到绝对地址0x90000处,并将启动设备(boot/setup.S)的下2kB字节的代码读入内存0x90200处,而内核的其它部分则

4、被读入到地址0x10000处。在系统加载期间将显示信息"Loading..."。然后控制权将传递给boot/Setup.S中的代码,这是另一个实模式汇编语言程序。启动部分识别主机的某些特性以及vga卡的类型。如果需要,它会要求用户为控制台选择显示模式。然后将整个系统从地址0x10000移至0x1000处,进入保护模式并跳转至系统的余下部分(在0x1000处)。下一步是内核的解压缩。0x1000处的代码来自于zBoot/head.S,它初始化寄存器并调用decompress_kernel(),它们依次是由zBoot/inflate.c、

5、zBoot/unzip.c和zBoot/misc.c组成。被解压的数据存放到了地址0x10000处(1兆),这也是为什么Linux不能运行于少于2兆内存的主要原因。[在1兆内存中解压内核的工作已经完成,见MemorySavers--ED]将内核封装在一个gzip文件中的工作是由zBoot目录中的Makefile以及工具完成的。它们是值得一看的有趣的文件。内核发行版1.1.75将boot和zBoot目录下移到了arch/i386/boot中了,这个改动意味着对不同的体系结构允许真正的内核建造,不过我将仍然只讲解有关i386的信息。解压过

6、的代码是从地址0x10100处开始执行的[这里我可能忘记了具体的物理地址了,因为我对相应的代码不是很熟],在那里,所有32比特的设置启动被完成:IDT、GDT以及LDT被加载,处理器和协处理器也已确认,分页工作也设置好了;最终调用start_kernel子程序。上述操作的源代码是在boot/head.S中的,这可能是整个内核中最有诀窍的代码了。注意如果在前述任何一步中出了错,计算机就会死锁。在操作系统还没有完全运转之前是处理不了出错的。start_kernel()是位于init/main.c中的,并且没有任何返回结果。从现在起的任何代

7、码都是用C语言编制的,除了中断管理和系统调用的入/出代码(当然,还有大多数的宏都嵌入了汇编代码)。让轮子转动起来在处理了所有错综复杂的问题之后,start_kernel()初始化了内核的所有部分,尤其是:设置内存边界和调用paging_init();初始化中断、IRQ通道和调度;分析(解析)命令行;如果需要,就分配一个数据缓冲区(profilingbuffer)以及其它一些小部分;校正延迟循环(计算“BogoMips”数);检查中断16是否能与协处理器工作。最后,为了生成初始进程,内核准备好了移至move_to_user_mode()

8、,它的代码也是在同一个源代码文件中的。然后,所谓的空闲任务,进程号0就进入无限的空闲循环中运行。接着初始进程(initprocess)尝试着运行/etc/init、/bin/init或者/sbin/init。如果它们没有

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。