Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Operating system 为什么在内核模式下调试很困难?_Operating System_Computer Architecture_Kernel Mode - Fatal编程技术网

Operating system 为什么在内核模式下调试很困难?

Operating system 为什么在内核模式下调试很困难?,operating-system,computer-architecture,kernel-mode,Operating System,Computer Architecture,Kernel Mode,我理解内核模式和用户模式的用途,以及从前者到后者的转换是如何发生的。然而,许多消息来源指出,内核模式下发生的崩溃很难调试,应该通过远程方式进行调试,例如通过telnet()进行连接 为什么调试如此困难? 为什么不能将一个(内核)调试器附加到一个内核线程上,并以通常的方式使用它?在内核模式下崩溃可能会损坏内存中任何位置的数据结构,甚至是调试器本身。防弹很难 在正常调试中,有两个完全隔离的进程—调试器和正在调试的对象。他们是“同龄人”,生来平等。被调试的进程不能接触调试器,不管它做什么(甚至可能不知

我理解内核模式和用户模式的用途,以及从前者到后者的转换是如何发生的。然而,许多消息来源指出,内核模式下发生的崩溃很难调试,应该通过远程方式进行调试,例如通过telnet()进行连接

为什么调试如此困难?
为什么不能将一个(内核)调试器附加到一个内核线程上,并以通常的方式使用它?

在内核模式下崩溃可能会损坏内存中任何位置的数据结构,甚至是调试器本身。防弹很难

在正常调试中,有两个完全隔离的进程—调试器和正在调试的对象。他们是“同龄人”,生来平等。被调试的进程不能接触调试器,不管它做什么(甚至可能不知道它存在)。另一方面,调试器可以以固定的、可预测的方式与正在调试的进程交互,这些方式始终适用于所有常规用户进程


例如:如果是本地调试,您将如何调试键盘接口;如果是串行端口,您将如何调试RS232代码?NIC驱动程序或网络堆栈(如果通过网络)?在其中一个中设置断点将是不可恢复的,因为您将无法访问控制调试器的设备。在最坏的情况下,如何调试内核调试器?有了GDB,至少在理论上可以将一个GDB实例连接到另一个GDB实例,而不会有太多麻烦。在内核空间中,这是不可能的,因为上面没有层来调解事情。

在内核模式下崩溃可能会损坏内存中任何位置的数据结构,甚至是调试器本身。防弹很难

在正常调试中,有两个完全隔离的进程—调试器和正在调试的对象。他们是“同龄人”,生来平等。被调试的进程不能接触调试器,不管它做什么(甚至可能不知道它存在)。另一方面,调试器可以以固定的、可预测的方式与正在调试的进程交互,这些方式始终适用于所有常规用户进程


例如:如果是本地调试,您将如何调试键盘接口;如果是串行端口,您将如何调试RS232代码?NIC驱动程序或网络堆栈(如果通过网络)?在其中一个中设置断点将是不可恢复的,因为您将无法访问控制调试器的设备。在最坏的情况下,如何调试内核调试器?有了GDB,至少在理论上可以将一个GDB实例连接到另一个GDB实例,而不会有太多麻烦。在内核空间中,这是不可能的,因为上面没有层来协调事情。

您无法以交互方式(或本地)调试内核,因为内核本身负责在监视器上显示图片(通过与适当的显示驱动程序通信)等等。我想用另一种方式来回答你的问题:调试内核是否比通过telnet连接更容易

对于这个问题,我的回答是:是的,是的。至少在X86/X64体系结构上使用虚拟化。我正在使用VirtualBox运行一个来宾操作系统,我可以在本地机器上调试它。我也在使用VirtualKD(http://virtualkd.sysprogs.org/)这大大加快了调试机器(主机)和虚拟机之间的通信速度


VirtualKD包含一个修改来宾Windows的boot.ini的包,因此您可以在启动时通过选择Windows显示给您的正确菜单项来启用调试。

您无法以交互方式(或本地)调试内核,因为内核本身负责甚至在监视器上显示图片(通过与适当的显示驱动程序通信)等等。我想用另一种方式回答您的问题:调试内核是否可能比通过telnet连接更容易

对于这个问题,我的答案是:是的,至少在X86/X64体系结构上是这样。我使用VirtualBox运行一个来宾操作系统,可以在本地机器上调试。我也使用VirtualKD(http://virtualkd.sysprogs.org/)这大大加快了调试机器(主机)和虚拟机之间的通信速度


VirtualKD包含一个修改来宾Windows的boot.ini的包,因此您可以通过选择Windows显示给您的正确菜单项在启动时启用调试。

好的,我想我理解。如果我错了,请纠正我:这是否意味着在内核模式下运行的所有进程都共享相同的sp地址ace?如果这是真的,有什么原因吗?是的,内核地址空间在所有进程之间共享。如果您有通用内核代码(不是特定设备的驱动程序)对于linux内核,您可以使用QEMU。您可以将gdb附加到QEMU上运行的软件上,这样您就可以像使用gdb的用户代码一样逐步执行内核代码。但是,如果您的代码特定于一个设备,例如一个没有可用仿真的设备驱动程序,您的软件将不会执行。@user420536问题实际上没有指定Linux或什么体系结构。有些情况非常不同。@awoodland——当然,世界上的内核比Linux内核要多。我在回答中提到了两件事,a)所有进程在内核中共享地址空间,所有内核都是如此。b) 以QEMU为例,将调试器附加到内核,OP希望的方式及其限制。好的,我想我理解这一点。如果我错了,请纠正我:这是否意味着在内核模式下运行的所有进程共享相同的地址空间?如果这是真的,有什么原因吗?是的,内核地址空间在所有进程之间共享。如果您有lin的通用内核代码(不是特定设备的驱动程序)