⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000035.htm

📁 一份很好的linux入门资料
💻 HTM
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人:&nbsp;lion&nbsp;(我要offer!),&nbsp;信区:&nbsp;Linux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;Linux内核源码指南&nbsp;&nbsp;<BR>发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Wed&nbsp;Oct&nbsp;18&nbsp;16:52:54&nbsp;2000)&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>找到一些好文,未敢独享,本着Internet精神,翻译出来大家同乐.&nbsp;<BR>本译文的发布遵守GPL规范.&nbsp;<BR>原文出处:Kernel&nbsp;Hackers&nbsp;Group<A HREF="http://khg.redhat.com/HyperNews/get/khg.html]">http://khg.redhat.com/HyperNews/get/khg.html]</A>&nbsp;<BR>从零开始&nbsp;<BR>PC机加电后,80x86的处理器把自己设置为实模式。并跳转到0xFFFF0,开始执行代码,&nbsp;<BR>正常情况下,那里正是ROM-BIOS的入口地址。PC的BIOS将进行一系列的系统检测并初始&nbsp;<BR>化从物理地址0开始的中断向量表。然后启动设备的第一个扇区的数据将被装载到0x7C0&nbsp;<BR>0处,并开始执行。启动设备通常是软驱或者硬盘。这个过程听上去不怎么复杂,确实不&nbsp;<BR>复杂,这就是我们进一步理解内核初始化工作之前必需的所有知识。&nbsp;<BR>Linux内核最开始的部分(boot/bootsect.S)是用8086汇编语言编写的,运行的时候,它&nbsp;<BR>把自己装载到绝对物理地址0x90000处,并继续从启动设备读入2K数据,装载到0x90200&nbsp;<BR>处,内核剩下的部分装载到0x10000处。在系统进行上述装载工作期间,屏幕会显示&quot;Lo&nbsp;<BR>ading...&quot;.装载完成后,系统把控制权交给另一段用汇编语言编写的程序--boot/Setup&nbsp;<BR>.S。&nbsp;<BR>setup阶段将识别一些系统特征和显示卡类型。需要的话,还会提示用户选择控制台的显&nbsp;<BR>示模式。然后它会把整个系统从0x10000处移动到0x1000处,并进入保护模式,转入0x1&nbsp;<BR>000执行剩下的代码。&nbsp;<BR>下一步是内核的解压缩。0x1000处的代码来自zBoot/head.S,它将初始化寄存器并调用&nbsp;<BR>decompress_kernel()过程,该过程将依次执行zBoot/inflate.c,&nbsp;zBoot/unzip.c&nbsp;和&nbsp;z&nbsp;<BR>Boot/misc.c。解压缩后的数据将从0x100000(1M处)开始存放,这就是为什么Linux不&nbsp;<BR>可能在小于2M内存的系统上运行的原因。[已经可以在1M内存的系统中使用不压缩内核;&nbsp;<BR>参见&nbsp;Memory&nbsp;Savers--ED]&nbsp;<BR>把内核压缩到一个GZIP文件中的工作,是由Makefile指定zBoot目录中的工具程序完成的&nbsp;<BR>,都是一些看上去很古怪的文件。&nbsp;<BR>从1.1.75版内核开始,boot&nbsp;and&nbsp;zBoot目录被下移到了arch/i386/boot。这个改变意味&nbsp;<BR>着我们可以同时生成多种指令系统的内核。但我们仍只考虑i386的情况。&nbsp;<BR>解压缩之后的代码将从0x1010000开始运行,所有的32bit相关的设置将在这里完成:装&nbsp;<BR>载IDT,GDT和LDT,识别处理器和协处理器,设置内存页。然后执行start_kernel程序。&nbsp;<BR>[Maybe&nbsp;I&quot;ve&nbsp;lost&nbsp;track&nbsp;of&nbsp;physical&nbsp;addresses,&nbsp;here,&nbsp;asI&nbsp;don&quot;t&nbsp;know&nbsp;very&nbsp;well&nbsp;<BR>&nbsp;gas&nbsp;source&nbsp;code]以上操作的源代码是boot/head.S。这可能是整个内核代码中最有灵&nbsp;<BR>感的部分。&nbsp;<BR>要说明的是,以上的任何一个步骤出现错误,系统都会锁起。操作系统在没有完整启动&nbsp;<BR>之前无法进行错误处理。&nbsp;<BR>函数start_kernel()是在init/main.c中定义的,这个函数永远不会返回。从现在开始的&nbsp;<BR>一切代码就都是C语言编写的了,当然要除去中断管理和enter/leave系统调用。(其实,&nbsp;<BR>&nbsp;大多数的宏都嵌入了汇编语言)&nbsp;<BR>对付完那些狡猾的问题之后,start_kernel()初始化内核的所有部分,特别是:·设置&nbsp;<BR>内存边界并调用paging_init()·初始化陷阱,IRQ通道和进程调度。&nbsp;<BR>·解析命令行参数.&nbsp;<BR>·如果需要,分配一个profiling缓冲。&nbsp;<BR>·初始化所有的设备驱动程序和磁盘缓冲,以及其他一些次要设备。&nbsp;<BR>·测量延时循环周期&nbsp;(计算&nbsp;CPU的&quot;BogoMips&quot;值)。&nbsp;<BR>·测试中断16是否分配给协处理器。&nbsp;<BR>最后,内核做好move_to_user_mode()(转入用户模式--译注)的准备,以便fork出init进&nbsp;<BR>程(出自同一个源文件)。接着0号进程启动,也就是所谓的摽战

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -