1.启动系统.当pc机加电开始启动时,80x86的处理器(cpu)在实模式下自检,开始执行物理地址0xffff0即rom-bios的起始地址处的代码.pc机的bios进行系统自检,初始化中断向量表到物理地址0x0.然后把引导设备的第一个扇区加载到地址0x7c00,执行此处的指令.到这里与linux无关,x86系列的硬件设置如此.
linux内核的最初部分代码是用汇编语言写的(文件是boot/bootsect.s).当这段程序开始执行的时候,它首先把自身这部分代码移到绝对地址0x90000,把下面的2k代码从引导设备加载到地址0x90200上,内核的其余部分加载到地址0x10000处.在加载系统时显示“loading...”. 【程序编程相关:TNS-12560的一次解决】
linux的内核本身是不能自举的,所以lilo与loadlin的作用就是加载系统内核.有关lilo的原理可以参考lilo的readme.从加电到内核加载的过程是:加电->执行bios->加载第一扇区->lilo->加载内核. 【推荐阅读:WebWork 2.1.1发布】
以上部分代码注释的极详细,如果你愿意k一下,源码附带的注释是你最好的帮助,另外,有人用中文注释了这些代码,似乎是在中国linux论坛上.你可以找找看. 【扩展信息:SOA的是一种架构,它的作用是为了解决S】然后,程序控制权交给另一个实模式汇编程序(boot/setup.s).这部分程序标识主机系统的一些特性与vga主板的类型.如果有必要,它让用户为控制台选择视频模式.接下来,此程序把整个系统从地址0x10000移到地址0x1000,进入保护模式.程序控制转给系统的其余部分即地址0x1000.
下一个步骤是系统内核的解压过程,这部分代码在地址0x1000(文件/boot/head.s),该段程序初始化寄存器,然后执行decompress_kernel(),这个函数源于zboot/inflate.c.zboot/unzip.c与zboot/misc.c三个文件.解压后数据放在地址0x100000 (1 meg),这就是为什么linux不能在少于2m内存下运行的主要原因.进行解压的代码在地址0x101000执行,完成所有的32位模式设置:加载idt, gdt 与ldt,标识处理器与协处理器,设置内存叶面大小;最后执行start_kernel().start_kernel()在init/main.c文件中,没有返回值.这没什么可解释的,如果你对保护模式有一点了解的话,可以很容易的读懂.如果你对保护模式不太了解的话,建议你读一下386/486汇编语言精要一书的第八章.那是一篇对保护模式的最好的入门文档.2. 系统运行. 进程表.进程的创建与撤销.
执行程序.不解释了,随便找本unix或linux的编程书看看.... 下一页