Linux启动分析(2)— bootsect.S、setup.S、head.S分析

bootsect.S ,系统引导程序,一般不超过 512 字节。
PC 系统结构中,线性地址 0xA0000 以上,即 640K 以上用于图形接口卡和 BIOS 自身, 640K 以下为系统的基本内存。如果配置更多的内存,则 0x100000 ,即 1MB 处开始称为高内存。当 BIOS 引导一个系统时,总是把引导扇区读入到基本内存地址为 0x7c00 的地方,然后跳转到此执行引导扇区的代码。这段代码将自身搬运到 0x90000 处,并跳转到那继续执行,然后通过 BIOS 提供的读磁盘调用“ int 0x13”从磁盘上读入setup 和内核映像。其中 setup 的映像读入到 0x90200 处,然后跳转到 setup 的代码中。
0x90000 0xA0000 一共 64K bootsect 仅占 512 字节,所以 setup 大小理论上可到 63.5KB
Linux2.4 版本以前,在最前面的 512 字节里保护了一个 mini “boot loader” ,只要拷贝启动代码运行就可从软盘启动;但在 2.6 版本中不再保护这样的 ”boot loader” ,所以必须在第一个磁盘分区上存储一个合适的 boot loader 才能从软盘启动,软盘、硬盘和光驱启动都是一样的过程。
setup 进行映像的解压缩,从 BIOS 收集一些数据,在控制台显示一些信息。
基本内存中开头一部分空间是保留给 BIOS 自己用的,另一方面对于 Linux 内核的引导也需要保留一些运行空间,一共保存了 64K 。基本内存中用于内核映像的就是 8*64K=512K ,其中顶端留 4K 用于引导命令行及从 BIOS 获取需要传递给内核的数据。内核映像一般都经过压缩,压缩后的映像和引导扇区及辅助引导程序的映像拼接在一起,成为内核的引导映像。大小不超过 508K 的映像称为小映像 zImage ,早期版本放在 0x10000 位置处,否则称为大内核 bzImage ,放在 0x100000 位置处。
CPU bootsect 时处于 16 位实地址模式,然后在 setup 的执行过程中转入 32 位保护模式。
Setup BIOS 中读取系统数据(内存大小、显卡模式、磁盘等参数),将数据保存在 0x90000-0x901FF ,覆盖了 bootsect 的内容。设置 32 位运行方式:加载中断描述表寄存器 IDTR 、全局描述表寄存器 GDTR ;临时设置 IDT 表和 GDT 表,并在 GDT 表中设置内核代码段和数据段的描述符,在 Head.S 中会根据内核的需要重新设置这些描述符表;开启 A20 地址线;重新设置两个中断控制器 8259A ,将硬件中断号重新设置为 0x20 0x2f ;最后设置 CPU 的控制寄存器 CR0 (机器状态字)的保护模式比特( PE )位,从而进入 32 位保护模式运行;然后跳转到 head.S 中的 startup_32 执行。
对于小内核映像放在 0x10000 处, Setup 会把 system 0x10000 移到 0x0000 开始处。对于大内核映像, vmlinux
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值