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