购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第2章

Windows内核加载器(SU)

本章将介绍Windows内核加载器(NTOS Loader,NTLDR)前期的工作过程,包括NTLDR本身是如何被主引导记录(MBR)加载的,及其被加载之后进行的一系列初始化工作。保护模式部分是本章的重点和难点,我们将讲述如何通过引入段描述符保护机制来克服实模式下的一些缺陷。最后,还将着重介绍几个导出函数,导出函数主要供保护模式环境使用,它会切换到实模式下执行,完成工作后再切换回保护模式。另外,我们还将引导大家使用Bochs调试工具一步步去跟踪从主引导记录到NTLDR的执行过程,这对理解内核加载器前期的工作过程至关重要。

什么是Windows内核加载器?在Windows NT/XP/2003系统中,Windows内核加载器指的是NTLDR文件,而在Vista/Windows 7系统中,则指bootmgr文件。这里我们主要讲解NTLDR文件,它位于系统分区的根目录下,如C:\NTLDR,是一个隐藏的、只读系统文件,需要去除“隐藏受保护的操作系统文件”属性才能看到。NTLDR的主要作用是引导和加载操作系统。

NTLDR 是可执行的十六进制文件,由两部分组合而成:NTLDR 的前半部分是startup.com,称为SU模块(一部分是16位程序,在实模式下运行,另一部分是32位程序,在保护模式下运行);NTLDR的后半部分是osloader.exe,称为Loader模块(32位程序,主要在保护模式下运行)。值得注意的是,osloader.exe是一种标准的PE格式文件,其文件内有4D 5A(MZ)和50 45(PE)这两个签名标志。我们可以使用WinHex之类的十六进制编辑工具打开NTLDR,通过辨识这两个标志找到两个模块的分界线。本书配套资源包附带了这两个分离出来的文件:startup.com和osloader.exe。

本章包括两部分,第一部分讲解主引导记录(MBR),第二部分讲解startup.com。关于startup.com,微软主要使用了MASM汇编和C语言混合编写,但在这里我们重新编写的startup.com只使用了NASM汇编。从代码的可读性考虑,有一部分函数本来应该使用C语言编写,编译后再与NASM汇编部分链接生成startup.com。但是这些C代码需要编译成能在实模式下运行的16位程序,经过多次尝试,笔者仍未找到能使编写和链接一体化的有效方法。此外,使用C语言,生成的指令框架不容易定位,不利于调试。有些读者可能像我一样,喜欢从头观察代码运行的每一步过程,特别是系统刚开始时的启动过程,如主引导记录、检测物理内存、进入保护模式等这些关键步骤。这些步骤能被观察到得益于Bochs调试器。尽管Bochs提供的调试功能不是特别强大,但对于我们写的这点代码已经够用了。所以为了便于调试,startup.com全部使用NASM汇编进行编写。

汇编级调试是一件烦琐的事情,笔者尽量保证这部分代码的简洁性,为了便于理解和调试,而将一些不必要的判断去掉。如果我们设计的某个代码段运行结果与预期不符,系统很可能出现各种奇怪的现象,如不断重启、死机、画面乱七八糟。不过,经过多次修改,目前这个版本算是比较稳定了。一旦学习完SU模块,你也许会像笔者一样,不愿再看这部分汇编代码。毕竟,汇编代码怎么写都没有C语言代码漂亮。图2.1展示的是计算机开始启动时在MBR和SU阶段的执行流程。

图2.1

引导驱动器读取第一个扇区到0x7c00后,控制权交给MBR,MBR代码再搜索系统活动分区表,加载活动分区第一扇区到特定的内存地址(如物理内存地址0xd000)。这个扇区称为操作系统分区引导记录(Partition Boot Record,PBR,早期也称为DOS Boot Record,DBR)。MBR接着将控制权交给PBR。PBR代码解析FAT或NTFS格式找到引导内核的文件NTLDR,并将NTLDR文件加载到指定物理内存地址(0x20000),最后将控制权移交给NTLDR。NTLDR的SU模块首先获得控制权,前半部分主要是在实模式下工作,检测物理内存,开启A20地址线,重定位GDT和IDT。开启保护模式后,SU解析osloader.exe文件,将其加载到物理地址0x00400000,最后移交控制权给Loader。

原版MBR需找到操作系统分区引导记录,由PBR来加载NTLDR,但是由于我们只设置了一个系统分区(C:),这个系统分区使用的是LDFS格式,不需要解析。因此MBR代替PBR直接加载了NTLDR,这里省略了PBR的步骤。无论是MBR还是PBR,最终目的都是要找到NTLDR,并将NTLDR放到物理内存地址0x20000。 4N8MMdkMdf/w5xtAGk8qxnEt2MlufoLGoiXSx8/6JaHWgm7/YHs6Is89dMFHtQfu

点击中间区域
呼出菜单
上一章
目录
下一章
×