freeldr引导Reactos的最后阶段
[分析环境reactos0.3.1 ,i386体系]
freeldr引导的最后阶段
freeldr简直就是ntoskrnl的先锋部队,他为ntoskrnl做好了充分的环境准备,ntoskrnl必须工作在保护模式下,并提供分页机制。不过ntoskrnl并不完全依赖于freeldr提供的GDT,IDT和分页机制,在ntoskrnl接管计算机并初始化自己时他会改变这些设置。
而freeldr之所以要切换到保护模式还有一个原因是因为它需要将ntoskrnl.exe、hal.dll以及注册表巢穴和其他一些在boot阶段必须转入内存给ntoskrnl的驱动程序,全部装入内存,而这些文件的总容量已经远远超过1M的大小。
在freeldr将ntoskrnl.exe,hal.dll和其他相关的引导文件在内存中安置好了以后,freeldr将完成最后的使命,然后将cpu移交给ntoskrnl。
在移交CPU之前由freeldr将分页机制建立好,即ntoskrnl执行内核初始化之前,freeldr会先建立好分页机制,看代码。
位于(srcroot\boot\freeldr\freeldr\arch\i386)目录的Loader.c文件,该文件中的函数
VOID
NTAPI
FrLdrStartup(ULONG Magic)
{
/* 关闭中断*/
_disable();
/* Re-initalize EFLAGS */
Ke386EraseFlags();
/* 判断启动选项是否保护PAE模式 */
FrLdrGetPaeMode();
/* 初始化页目录*/
FrLdrSetupPageDirectory();
/* Initialize Paging, Write-Protection and Load NTOSKRNL */
FrLdrSetupPae(Magic);
}
而同文件中的FrLdrSetupPae(ULONG Magic)函数
则完成将前面设置好的页表目录地址写入CR3寄存器并改变CR0寄存器的控制标志,启动分页模式(保护模式是在freeldr引导的最初阶段就已经启动好了的),然后进入ntoskrnl的入口函数,进行内核初始化阶段。
[如需转载请注明出处:(雄)blog.csdn.net/mickey139]