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]

posted @ 2008-10-04 21:13  BinSys  阅读(329)  评论(0编辑  收藏  举报