概述
linux系统启动涉及三个汇编文件,bootsect.s,setup.s,head.s,下图为启动盘的代码模块布局
启动盘布局
主要流程
-
x86 pc电源启动时,cpu处于实模式,此时cs置为0xFFFF,IP置为0x0000,执行0xFFFF0代码,此区域为ROM BIOS映射区
-
ROM BIOS映射区代码会物理地址0处初始化中断向量表,检查RAM,键盘,显示器,软硬磁盘,并将磁盘0磁道0扇区(bootsect.s)读入0x7c00处,此代码为操作系统引导代码,设置cs=0x07c0,ip=0x0000
-
引导扇区代码将0x7c00的512字节移动到0x90000处(为后面system模块腾出内存),跳转到0x9000x处继续执行,将setup的4个扇区内容读到内存0x90200处,并继续将system模块加载到内存 0x10000处,跳转到setpup处执行
-
setup的代码主要作用是利用ROM BIOS中断读取机器数据,并将数据保存在0x90000处,然后将system模块移动到 0x00000处(system 模块中代码的地址也即等于实际的物理地址。便于对内核代码和数据的操作),临时设置中断描述符表( idt )和全局描述符表( gdt ),进入保护模式,跳转到system模块最前面的head.s处执行
setup.s结束后的内存映像
5.head的代码主要作用是重置中断描述符表( idt )和全局描述符表( gdt ),接着设置管理内存的分页处理机制,将页目录表放在绝对物理地址 0 开始处(本程序会被覆盖),最后去运行main函数
head.s结束后的内存映像
网友评论