- 4
- 0
- 约1.82万字
- 约 16页
- 2020-11-18 发布于天津
- 举报
通过前面几章,我们了解了 Windows内核基本的概念与基础知识 .从这一章开始,就要开始
真正的Windows内核源代码之旅了 .
本章介绍系统的启动与关机过程 ,也就是说,当你打开计算机的电源,一个 Windows操作
系统是如何被引导,做了哪些准备工作,直至向你呈现出一个图形界面 ,接受你的指令;而
当你点击 Windows开始菜单中的关机按钮里,Windows在停止CPU运转前,又要做哪些事 情.
启动
(一)BIOS
Intel 80386 CPU有三种工作模式:实模式,保持模式,虚拟实模式。加电时 CPU工作在实
模式下,这种模式相对简单,使用 20根的地址线,可访问 1M的存储空间。它的逻辑地址
由段(seg)和偏移(off)构成,逻辑地址到物理地址的转换方式是: seg 4 + off 。而中
断服务表在固定的内存地址 (0开始,每个表项四个字节,代表一个中断服务例程
(ISR),共255个表项。所以它并不需要像保护模式那样复杂, 拥有全局描述符表 (GDT)、
局部描述符表(LDT)、中断描述符表(IDT )、以及页表等等。起初,系统就是在这种工作 模式下完成自检与一些初始化工作的。
BIOS (Basic Input/Output System) 是计算机中的一块持久只读的存储芯片( ROM ),包含了 一些低级的实模式的控制程序与硬件驱动程序 .。
在硬件加电时,CPU的RESET引脚会收到一个信号,CPU会将它的CS:EIP(即指令指针寄存 器)设置成固定的值,以执行在物理地址 0xfffffff0处找到的指令,这段指令被映射到 BIOS
中,BIOS在接过控制权后,会做一些自检的工作,比如检查内存、与系统总线连接的硬件等 等。做完这些工作,BIOS会根据COMS中的设置找到一个有效的启动设备(硬盘、软盘、 CD-ROM等),并把第一个扇区(引导扇区)的内容加载到 0000:7c00这个地址,并把控制
权交给这段代码。
(二)NTLDR
我们仅以硬盘启动为例说明 NTLDR是如何被加载,以及NTLDR所做的工作.BIOS从指
定硬盘的0面0道第1扇区(称为主引导记录 MBR)读入512个字节,加载到0000:7c00这 个地址,并把控制权交给这段代码。 MBR包括一个分区表和一段控制代码,它的控制代码
首先将0000:7c1b处的0x1e5字节的指令移到 0000:061b,然后从引导分区加载 DBR (DOS Boot Recorder DOS引导记录)到0000:7c00,由DBR加载NTLDR 并把控制权交给 NTLDR 。 NTLDR获得控制权后要做的第一件事就是将使处理器进入保护模式, 并且开启分页,然后
分析boot.ini文件,以显示一个可选的操作系统菜单(如果只有一唯的一个可选项,这一
步将略过,直接应用该选项),确认选择后,ntldr开始继续下面的工作:
1清屏显示一个进度条。
2加载内核(通常为 ntoskrnl.exe )。
3加载HAL (通常为hal.dll)。
4加载注册表SYSTEM分支。
5读取SYSTEM 分支,加载标识为 SERVICE_BOOT_START (引导时启动)的驱动程序。
6将控制权交给内核的入口 ( KiSystemStartup )。
(*由于以下三个组件并不包含在 WRK中,我准备提供反汇编的分析,在考虑是放在这里
还是在附录中.)
MBR
(*补充)
DBR
(*补充)
NTLDR
(*补充)
(三)内核与执行体的初始化 调试手段
当NTLDR把控制权交给了内核,就到了我们能看到源代码的地方了,这时,我们的调试
器就可以发挥作用了, 不仅可以看到源代码, 而且我们可以清晰的看到流程与当时的系统状
O
首先我们来介绍一下调试启动过程的方法。 内核给我们的第一次中断代码执行的地方在下图
调用栈所示的位置(我们能看得到的源代码在: WRK\base\ntos\initos.c:437 ):
ntDbgEreakFeint
hal I HallmtSvsteni+OxSAhal!Ha1pGet Parame ters+0xb 0
hal I HallmtSvsteni+OxSA
nt I Ki Initial izeKernel 4-0x4 be
nt IKiSystenStartup+0x2d6
它在ExpInitializeExecutive 函数内部,将控制权交给 HAL 的HalInitSyytem 时。为了能在 这里停下来,我们必须在 boot.ini文件的引导选项中加入 /BREAK , HallnitSystem 将根据 这一选项来决定是否中断下来。 此时如果调试器已经激活,那么它将会停在这个断点处, 否 则系统停
原创力文档

文档评论(0)