• Windows内核--调试内核源代码(1.5)


    Kernel编译和普通应用程序编译有差异吗?

    • 最终Kernel二进制档是给CPU执行的,只要用普通的C编译器能正常编译出给CPU执行的二进制程序即可,从编译角度,内核和应用程序无差别。
    • Windows内核是exe文件。

    内核与用户应用程序运行环境有差

    • Kernel运行环境和普通应用程序有差异,但它被硬件决定。
      • 用户应用程序可能运行在Ring 3, 内核在Ring 0(其实还有Ring 2和Ring 1, Windows内核选择了Ring 0), 这些通过特定指令切换完成。
    • Kernel需要处理好和硬件相关的Registers设定和中断/异常等,保证符合硬件Spec.
      • Intel、AMD、ARM硬件体系有差,软件也要跟着设定。
      • 内核代码会依照硬件要求做相应的适配,比如int进入trap或(软/硬)中断,压栈保存关键寄存器,内存虚拟映射段地址,内存页表物理基址CR3寄存器等等。

          

    WRK的编译和调试

           WRK有介绍编译和调试方法,不再赘述。WRK编译并不比普通工程更复杂,反而更简单。

            nmake.exe 

                    编译大总管,根据WRK makefile做编译,调用cl.exe, lib.exe和link.exe完成最终内核生成。

                    VC++爱好者再熟悉不过了...

                         

                            注: nmake -nologo amd64= 编译输出

                    wrkamd64.pdb或wrkx86.pdb需要复制到虚拟机System32目录?

                            > 不需要,pdb是给主机debugger使用。

            设定命名管道为COM1或COM2?

                    VMware默认会把打印机作为第一个串行端口, 新建串行端口是串行端口2. 此时要注意虚拟机启动参数pipe的设定要对应。

                            

                                    如上,XP 64bit虚拟机后来移除了打印机, 虽然内核调试还显示串行端口2,实际对应串行端口1.

                                    虚拟机boot.ini参数/port=com1就是正确的。(如果打印机没移除,就需要改为/prot=com2)

                                            

                                    我的Win10虚拟机因为存在打印机串口,bcdedit设定debugport就是2.

                                            

                                                    Bcdedit debugport

            fastdetect启动参数和内核调试冲突

                    XP系统默认启动参数带有/fastdetect, 当开启内核调试时,一定要关闭它,否则WinDbg没有机会连接到内核。

                    fastdetect本意是内核启动不检查串行口或并行口。

            /debug参数和内核

                    当开启了debug调试模式,内核变量KdDebuggerEnabled就变成TRUE. (详情参考: KD_DEBUGGER_ENABLED)

                            

                             注: 启动参数/nodebug会覆盖/debug.

            遇到WinDbg无法加载Kernel符号文件

                    

                    请确保虚拟机内核wrkamd64.exe与.pdb文件相符。

            WinDbg快捷方式

    windbg.exe -b -k com:pipe,port=\\.\pipe\com1,baud=115200,reconnect -y E:\other_symbols;SRV*E:\xp_symbols*http://msdl.microsoft.com/download/symbols

                    注:symbol路径请自定义.

    Source Insight工程无法识别Token Macro

            因SI工具预处理和C/C++预处理有差别,毕竟SI不是做预处理器,会出现误把一些macro当做函数。例如,如下DECLSPEC_ALIGN, SI是不认识的。

            

             SI提供的解决方法是写Token Macro.

                    

                    注: SI工具根目录c.tom增加DECLSPEC_ALIGN(x)为空。

                    Refer: Preprocessor Token Macros (sourceinsight.com)

            

                    

  • 相关阅读:
    【LeetCode】【剑指offer】【扑克牌中的顺子】
    【Spring5】IOC容器与解耦合
    【Android UI】贝塞尔曲线 ⑤ ( 德卡斯特里奥算法 | 贝塞尔曲线递推公式 )
    22-08-22 西安 Mysql高级&javaSE面试题(01)“== 和 equals的区别” 、存储引擎
    测试域: 流量回放-工具篇jvm-sandbox,jvm-sandbox-repeater,gs-rest-service
    数字化时代,VR全景营销的优势在哪里?
    数据结构插入排序
    vue--后台管理系统问题和功能实现思路集锦
    Android Glide限定onlyRetrieveFromCache取内存缓存submit超时阻塞方式,Kotlin
    升级 webpack5 + vue-cli5
  • 原文地址:https://blog.csdn.net/cxsjabcabc/article/details/127709144