1.bootsect.S分析
a. 将自己从0x7C00复制到0x90000,然后跳到0x90000处运行
b. 读取setup-->用bios的int 0x13从磁盘的第2个扇区开始读取4个扇区到内存的0x90200处
c. 读取system-->原理同上,从磁盘的第(1+4)个扇区开始读取,结束是(es-0x1000)是否等于0x7F00
es的初始值是0x1000,将这固定的508K的数据从磁盘读到内存的0x10000处。
d. 跳到0x9020:0x0处执行,也就是跳到setup
注意:这儿判断结束不是直接es与(syssize=0x7F00)比较的,而是es-0x1000然后再与0x7F00比较的,
也就是说es的范围是[0-0x7F00],即system的长度是[0-0x7F000]=508K
2. setup.S分析
a. 运行在0x90200,int 0x15 取内存大小,并存在0x90002处; 获取显卡及硬盘的参数
b. 把system从[0x10000-0x90000]移动到[0x1000-0x81000]
c. 关中断
d. 设置8259A, 起始中断号为[0x20-0x28][0x28-0x30]
e. 进入保护模式,并跳到0x1000即zBoot/head.S上运行
3. zBoot/head.S分析
a. 运行开始地址-->0x1000,设置ds=es=fs=gs=ss=0x18,设置esp=stack_start
b. 检查A20是不是打开了,清BSS
c. 调用decompress_kernel,将内核解压到0x100000=1M处
d. 跳到1M处运行,即boot/head.S.
linux1.0的boot与linux0.11的boot变化不大。
为什么会把bootsect与setup放在0x90000处?
答: linux的system的大小不会超过0x80000=512K,bootsect把system加载到0x10000=64K处,
从[0x10000-0x90000]正好是512K, 不会超过0x90000,所以把bootsect与setup放在0x90000处没有问题,不会被覆盖。
0x7C00=31K 0x10000=64K
阅读(660) | 评论(0) | 转发(0) |