- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(Linux内核源代码漫游
Linux内核源代码漫游
Alessandro Rubini著, rubini@pop.systemy.it
赵炯 译,gohigh@sh163net, ()
本章试图以顺序的方式来解释Linux源代码,以帮助读者对源代码的体系结构以及很多相关的unix特性的实现有一个很好的理解。目标是帮助对Linux不甚了解的有经验的C程序员对整个Linux的设计有所了解。这也就是为什么内核漫游的入点选择为内核本身的启始点:系统引导(启动)。
这份材料需要对C语言以及对Unix的概念和PC机的结构有很好的了解,然而本章中并没有出现任何的C代码,而是直接参考(指向)实际的代码的。有关内核设计的最佳篇幅是在本手册的其它章节中,而本章仍趋向于是一个非正式的概述。
本章中所参阅的任何文件的路径名都是指主源代码目录树,通常是/usr/src/linux。
这里所给出的大多数信息都是取之于Linux发行版1.0的源代码。虽然如此,有时也会提供对后期版本的参考。这篇漫游中开头有 图标的任何小节都是强调1.0版本后对内核的新的改动。如果没有这样的小节存在,则表示直到版本1.0.9-1.1.76,没有作过改动。
有时候本章中会有象这样的小节,这是指向正确的代码以对刚讨论过的主题取得更多信息的指示符。当然,这里是指源代码。
引导(启动)系统
当PC的电源打开后,80x86结构的CPU将自动进入实模式,并从地址0xFFFF0开始自动执行程序代码,这个地址通常是ROM-BIOS中的地址。PC机的BIOS将执行某些系统的检测,在物理地址0处开始初始化中断向量。此后,它将可启动设备的第一个扇区读入内存地址0x7C00处,并跳转到这个地方。启动设备通常是软驱或是硬盘。这里的叙述是非常简单的,但这已经足够理解内核初始化的工作过程了。
Linux的最最前面部分是用8086汇编语言编写的(boot/bootsect.S),它将由BIOS读入到内存0x7C00处,当它被执行时就会把自己移到绝对地址0x90000处,并将启动设备(boot/setup.S)的下2kB字节的代码读入内存0x90200处,而内核的其它部分则被读入到地址0x10000处。在系统加载期间将显示信息Loading...。然后控制权将传递给boot/Setup.S中的代码,这是另一个实模式汇编语言程序。
启动部分识别主机的某些特性以及vga卡的类型。如果需要,它会要求用户为控制台选择显示模式。然后将整个系统从地址0x10000移至0x1000处,进入保护模式并跳转至系统的余下部分(在0x1000处)。
下一步是内核的解压缩。0x1000处的代码来自于zBoot/head.S,它初始化寄存器并调用decompress_kernel(),它们依次是由zBoot/inflate.c、zBoot/unzip.c和zBoot/misc.c组成。被解压的数据存放到了地址0x10000处(1兆),这也是为什么Linux不能运行于少于2兆内存的主要原因。[在1兆内存中解压内核的工作已经完成,见 Memory Savers--ED]
将内核封装在一个gzip文件中的工作是由zBoot目录中的Makefile以及工具完成的。它们是值得一看的有趣的文件。
内核发行版1.1.75将boot和zBoot目录下移到了arch/i386/boot中了,这个改动意味着对不同的体系结构允许真正的内核建造,不过我将仍然只讲解有关i386的信息。
解压过的代码是从地址0x10100处开始执行的[这里我可能忘记了具体的物理地址了,因为我对相应的代码不是很熟],在那里,所有32比特的设置启动被完成: IDT、GDT以及LDT被加载,处理器和协处理器也已确认,分页工作也设置好了;最终调用start_kernel子程序。上述操作的源代码是在boot/head.S中的,这可能是整个内核中最有诀窍的代码了。
注意如果在前述任何一步中出了错,计算机就会死锁。在操作系统还没有完全运转之前是处理不了出错的。
start_kernel()是位于init/main.c中的,并且没有任何返回结果。从现在起的任何代码都是用C语言编制的,除了中断管理和系统调用的入/出代码(当然,还有大多数的宏都嵌入了汇编代码)。
让轮子转动起来
在处理了所有错综复杂的问题之后,start_kernel()初始化了内核的所有部分,尤其是:
设置内存边界和调用paging_init();
初始化中断、IRQ通道和调度;
分析(解析)命令行;
如果需要,就分配一个数据缓冲区(profiling buffer)以及其它一些小部分;
校正延迟循环(计算“BogoMips”数);
检查中断16是否能与协处理器工作。
最后,为了生成初始进程,内核准备好了移至
您可能关注的文档
- [专家提问题目汇总.doc
- [专家点评2013年高考全国各地作文题.doc
- [专接本必看考点、考试公告、跨专业.doc
- (linux下遇到错误解决新手.doc
- (Linux中查找文件技术大全.doc
- [专科应用文练习题.doc
- (linux中的用户组和各种权限.doc
- [专科机械制造技术基础试卷.doc
- [专科模拟考试.doc
- [专科起点升本科招生专业与统一考试科目对照表.doc
- 《数字博物馆展览设计中的观众引导策略研究》教学研究课题报告.docx
- 初中历史教学中学生历史思维能力培养的实践研究教学研究课题报告.docx
- 《影视动画中传统文化符号的叙事技巧与传播效果研究》教学研究课题报告.docx
- 小学科学教学计划管理数字化改革与稳定性平衡策略教学研究课题报告.docx
- 国家智慧教育云平台在劳动教育中推动教育均衡发展的策略研究教学研究课题报告.docx
- 初中探究式学习课程中数字素养培养的教学策略优化研究教学研究课题报告.docx
- 初中化学教学:生活实例在化学环保中的应用效果研究教学研究课题报告.docx
- 《船舶智能制造中的智能监控与安全防护技术研究》教学研究课题报告.docx
- 心理健康教育在小学生同伴关系构建中的实践研究教学研究课题报告.docx
- 小学英语教师数字教学资源整合与应用策略研究教学研究课题报告.docx
文档评论(0)