-
2008-05-22
Redboot(i386)启动流程(三) - [源码分析]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://redboot.blogbus.com/logs/21382467.html
接上篇继续
_start之后的第一行是一个宏 hal_cpu_init, 该宏定义在package/hal/i386/pcmb/v2_0/include/pcmb.inc 文件中。 由于从软盘引导,所以 hal_cpu_init分为两部分: 一部分是引导分区部分(以0xAA55结束),另一部分的功能是使CPU进入保护模式。解释:PC上电后会进入BIOS, BIOS会检测磁盘(软盘和硬盘),如果软盘(或硬盘)的第一个分区是引导分区(以 0xAA55结束为标志)则将软盘的第一个分区内容加载到内存 0x7c00处,并运行它。
引导分区被运行之后,将整个redboot逐个分区地加载到0x3000为起始地址的内存空间。
注意:这个过程,引导分区内容会再次被加载到0x3000处,且马上会跳转到0x3000处执行引导分区的代码。而0x7c00处的内容会在后面被覆盖掉。
在执行加载工作前,会先执行两个小任务:
1. 设置栈,栈顶为0x3000
2. 通过BIOS提供的中断,得到扩展内存和标准内存大小,压入栈中
引导分区代码结束后,程序将进入保护模式。大概次序如下:
1. 关中断
2. 初始化GDT和IDT
3. 进入保护模式
4. 设置数据段
5. 重新设置栈段(因为保护模式和实模式,内存编址方式不同)GDT主要用两个Selector分别是 0x08 (code) 和 0x10 (data)。
寻址空间都是从0x00000000 - 0xFFFFFFFF
特权级(DPL)为 0
IDT的地址为:0x1000
这部分比较复杂,这里不在详细说明,如果有时间,会在讨论i386架构的文章里,详细说明。而有关这部分的资料也相当丰富,可以在网上搜寻。
到这里hal_cpu_init已经执行结束了 ,不过进入保护模式还需要 激活A20地址线 。不激活A20地址线只能访问1M空间内的内存,激活A20才能访问所有内存。这个任务在另外一个宏 hal_memc_init 中实现,它位于文件 packages/hal/i386/arch/v2_0/include/arch.inc
这样,就完成了加载和进入保护模式的任务。
随机文章:
Redboot(i386)启动流程(二) 2008-05-21Redboot 的链接脚本 2008-06-16Redboot 设备初始化说明 2008-06-15Redboot 常用命令详解(zt) 2008-06-06Redboot(i386)启动流程(一) 2008-05-20
收藏到:Del.icio.us
Redboot(i386)启动流程(四)
Blog:Redboot专栏2008-06-05 17:30:52








评论