操作系统实验报告
一、实验名称:分析 arch/i386/boot/Setup.S
二、实验要求:
通过对 Linux_2.4.20 源代码分析,初步理解 Linux 操作系统内核各项特性。
设计思路及流程:
分析如下 3 段 Linux-2.4.20 源代码,并写出分析报告(格式自定)。
arch/i386/boot/Setup.S
三、 主要分析过程:
1、arch/i386/boot/Setup.S
setup.S 位于 arch/i386/boot/目录下。setup.S 的起始代码位于物理
地址 0x00090200,cpu 继续从这个地址取指执行。
setup 程式执行实模式下的初始化工作,主要完成:
BIOS 中断调用,获取关于硬件设备的各种参数,并存放到内存 INITSEG 段
(0x9000:0000)。
如果内核代码被装载到低端的内存中(物理地址 0x00010000),就把他搬
移到物理地址 0x00001000 处;如果内核是 bzImage,则已被装到高端内
存处(见上文),则省去本次搬移。
对 video 适配器和 8259 中断控制器 及协处理器进行初始化。
建立临时的中断描述符表和全局描述符表。
通过把 CR0 状态寄存器的 PE 位置 1,使 CPU 从实模式转换到保护模式。
使用操作码前缀 0x66 的方法使指针由 32 位变为 48 位,进入保护模式的线
性地址空间(注意此时还没有开启分页功能),并跳转到 arch/i386/boot/
compress/head.S 中的 startup_32()函数执行(物理地址 0x00010000
或 0x00100000)。
下面具体描述上述任务的完成过程。
代码签名检查
实际执行开始于 setup.S 中的 start_of_setup:
应用 BIOS 调用 INT 13h,取磁盘类型并复位磁盘。
检查位于 setup.S 代码末尾的签名标志“AA55”或“5A5A”,以确定 setup.S
代码是否全部装入 SETUPSEG 段。如果没有找到签名标志,说明 setup.S 并