通过前面几章,我们了解.docVIP

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
通过前面几章,我们了解

通过前面几章, 我们了解了Windows内核基本的概念与基础知识. 从这一章开始, 就要开始真正的 Windows 内核源代码之旅了. 本章介绍系统的启动与关机过程, 也就是说, 当你打开计算机的电源, 一个Windows 操作系统是如何被引导, 做了哪些准备工作, 直至向你呈现出一个图形界面, 接受你的指令; 而当你点击 Windows 开始菜单中的关机按钮里, Windows 在停止CPU运转前, 又要做哪些事情. 一 启动 (一) BIOS Intel 80386 CPU 有三种工作模式:实模式,保持模式,虚拟实模式。加电时CPU工作在实模式下, 这种模式简单系统自检与初始化工作0000:7c00 这个地址, 并把控制权交给这段代码(称为主引导MBR)读入512个字节, 加载到 0000:7c00 这个地址, 并把控制权交给这段代码SERVICE_BOOT_START(引导时启动)的驱动程序。 6 将控制权交给内核的入口( KiSystemStartup )。 (* 由于以下三个组件并不包含在 WRK 中, 我准备提供反汇编的分析, 在考虑是放在这里,还是在附录中.) MBR (*补充) DBR (*补充) NTLDR (*补充) (三) 内核与执行体的初始化 调试手段 当 NTLDR 把 控制权交给了内核,就到了我们能看到源代码的地方了,这时,我们的调试器就可以发挥作用了,不仅可以看到源代码,而且我们可以清晰的看到流程与当时的系统状态。 首先我们来介绍一下调试启动过程的方法。内核给我们的第一次中断代码执行的地方在下图调用栈所示的位置(我们能看得到的源代码在:WRK\base\ntos\initos.c:437): 它在ExpInitializeExecutive函数内部,将控制权交给 HAL 的 HalInitSyytem 时。为了能在这里停下来,我们必须在 boot.ini 文件的引导选项中加入 /BREAK,HalInitSystem 将根据这一选项来决定是否中断下来。此时如果调试器已经激活,那么它将会停在这个断点处,否则系统停下来等待调试器的连接。 还有一个更好的方法来调试启动过程,那就是使用Debug版的ntldr, 你可以在ddk 中找到它(例如: \WINDDK\5112\debug\ntldr_dbg), 将原来引导分区根目录下的ntldr 文件改为其它名字(如:ntldr_free),然后将ntldr_dbg 拷贝过去,改名为 ntldr.,此时的ntldr将可以接受调试器的连接,并且显示更多的调试信息。 如果调试版本的ntldr 运行正常,你会看到如下的提示: 连接调试器,然后在启动菜单中选择: Windows 20003[WRK],此时,调试器将显示各个模块加载的过程,这一段时间我们是有机会将调试器断下来的。当我们看到WRKX86.exe 模块加载后,就可以在调试菜单中选择[Break](或者 CTRL+Break), 此时断点位于 ntldr 内部。现在我们已经可以在WRKX86模块中下断点了。 下完断点继续运行(g命令),几秒钟后,调试器将会中断在KiSystemStartup 处。大家可以看到,现在的符号无法匹配,这是由于ntldr在将控制权交给内核前,会有一次与调试器断开连接的操作,会导致模块列表清空,因而无法识别调试符号与源代码。但通过反汇编窗口的地址,我们可以确定(参看上面bl命令的输出),那里就是 WRKX86!KiSysytemStartup。 为了解决这个问题,这里我们手动的定义一个模块,以让调试器可以显示我们看起来比较舒服的调试符号与源代码。执行下面的命令: 此时源代码窗口中会如下图所示,代表符号与源代码匹配成功。 KiSystemStartup 上一小节中,我们的断点已经成功的下在了 KiSystemStartup (位于汇编文件WRK\base\ntos\i386\newsysbg.asm中)上, 并且可以进行源代码级的调试了,这一节我就借助调试器跟踪KiSystemStartup 整个的处理过程。 首先要说明的是,在多处理器系统上,KiSystemStartup 会被所有的处理器执行到,并且在不同的处理器上执行时,是有所不同的。在Intel 的手册里,将引导系统的处理器叫做BSP(Boot Strap Processer 引导绑定处理器),将其它的非引导处理器叫做AP(Application Processor 应用处理器),BSP是首先执行KiSystemStartup,并且在随后的过程中激活其它仍然正在停止状态的其它AP以执行KiSystemStartup。所以,刚刚我们在KiSystemStartu

文档评论(0)

sunhao111 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档