linux 内核启动

来源:互联网 发布:淘宝上的评价怎么修改 编辑:程序博客网 时间:2024/05/16 09:47

这里先总的说明一下 Linux 操作系统启动部分的主要执行流程。当 PC 的电源打开后,80x86 结构的CPU 将自动进入实模式,并从地址 0xFFFF0 开始自动执行程序代码,这个地址通常是 ROM-BIOS 中的地址。PC 机的 BIOS 将执行某些系统的检测,并在物理地址 0 处开始初始化中断向量。此后,它将可启动设备的第一个扇区(磁盘引导扇区,512 字节)读入内存地址 0x7C00 处,并跳转到这个地方。启动设备通常是软驱或是硬盘。

        Linux 的最最前面部分是用 8086 汇编语言编写的(boot/bootsect.s),它将由 BIOS 读入到内存 0x7C00处,当它被执行时就会把自己移到绝对地址 0x90000 处,并将启动设备(boot/setup.s)的下 2kB 字节的代码读入内存 0x90200 处,而内核的其它部分(system 模块)则被读入到从地址 0x10000 开始处,因为当时system 模块的长度不会超过 0x80000(即 512KB),所以它不会覆盖在 0x90000 处开始的 bootsect 和 setup模块。

启动部分识别主机的某些特性以及 vga 卡的类型。如果需要,它会要求用户为控制台选择显示模式。然后将整个系统从地址 0x10000 移至 0x0000 处,进入保护模式并跳转至系统的余下部分(在 0x0000 处)。此时所有 32 位运行方式的设置启动被完成: IDT、GDT 以及 LDT 被加载,处理器和协处理器也已确认,分页工作也设置好了;最终调用 init/main.c 中的 main()程序。上述操作的源代码是在 boot/head.S 中的,这可能是整个内核中最有诀窍的代码了。注意如果在前述任何一步中出了错,计算机就会死锁。
原创粉丝点击