Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2150677
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: LINUX

2016-09-29 11:48:42

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) |
给主人留下些什么吧!~~