Bang! The world starts
 

作者: 陆麟
转载请征得作者同意.
2005.5.15



今天讲的乃是AMD64的LINUX BOOT过程。从启动,讲述到进入LONG MODE为止。参考的是2.6.11.9版KERNEL代码。
LONG MODE是AMD64多出来的那个模式,使用的是64位虚拟地址空间。
LINUX KERNEL还是老规矩,前1个扇区存参数,AMD64的LINUX KERNEL看代码不再支持把KERNEL复制到软盘0扇区从软盘启动,必须通过BOOTLOADRE来加载,而BOOTLOADER协议版本仍然为 2.03。下面就开始流水讲解了。:)
1。reset 硬盘
2。检查实模式部分代码尾部签名,确认BOOTLOADER完整加载了实模式部分代码。
3。检查BOOTLOADER是否正确将其余部分加载到0x100000处
4。通过CPUID指令确认CPU支持LONG MODE
5。如果CPU是AMD产品,写MSR强制打开SSE指令集
6。INT15H EAX=EC00,EBX=2 看注解是通知BIOS将要进入LONG MODE,可能这个CALL是BIOS厂商要求的。
7。通过E820/E801/88H INT15H BIOS调用获取内存大小。
8。通过INT16H设定键盘REPEAT速度为最快。
9。获取显示卡参数等。
10。获取硬盘信息
11。检查PS/2鼠标
12。如果在KERNEL编译时选择了ENHANCED DISK DRIVE SUPPORT,通过EDD BIOS确定硬盘信息。
13。切换到实模式(如果目前在V86模式,BOOTLOADER须提供切换到实模式的PROC地址)
14。移动自身实模式部分到规定的SEGMENT。
15。开A20
16。关中断控制器。
17。进保护模式(32BIT,没有PAGING)
18。跳转到0x100000
LINUX X64版本要分32BIT保护模式64BIT LONG MODE2步切换,到这边完成了第一步切换。
19。再度确认CPU支持LONG MODE
20。开启PAE/PGE
21。设定引导用得LEVEL 4页表。
22。开启LONG MODE
23。如果支持NX(数据执行保护),开启NX。
24。设定CR0新值,使得上面的更新生效。
25。加载64位的GDT。
26。发出跳转指令刷新指令缓冲,算是进入到了64位代码。
本次讲解到此告一段落。在进入x86_64_start_kernel启动KERNEL前,还有少量页面设定以及GDT设定的活,在这里就不写了。