通过串口获取Windows内核的日志



我正在为Windows内核制作驱动程序,我正在使用COM1来获取内核日志,主机是Ubuntu,来宾是qemu。Windows 10安装在其中。问题是有大量数据要写入 COM1。因此,如果它必须写一行ABCDEFGHI,而在下一行中,它必须写JKLMNOPQ。它在一行中执行类似于ABCDEF和在第二行中执行GHIJKLMNOPQ之类的操作,这意味着一行数据不完整,并且第二行数据也因此而损坏。我们可以应用任何锁吗?如果一个连接正在使用 COM1,那么任何其他连接都不应该写入 COM1?

QEMU 不控制谁可以在特定时间写入串行端口地址。这是来宾操作系统的工作。QEMU 只接收它在虚拟寄存器中看到的任何数据。

如果您确实需要将批量数据写入客户机操作系统中的串行端口,则需要很长时间来处理。我曾经遇到过同样的问题,不得不在非常快的英特尔 CPU 上测试速度。我能得到的最佳速度是220KBps。

如果处理时间对你来说不是问题,从来宾 Windows 的角度来看,如果你直接写入 COM1 的端口地址,则驱动程序负责建立锁定机制,假设也没有其他驱动程序/进程写入 COM1。如果通过句柄将数据写入 COM1 设备,则 Windows 内置串行端口驱动程序不会直接提供锁定。但是你仍然可以用其他方式做到这一点:独占地打开串口设备的句柄,这样只有一个进程可以写入它,或者让一个设备过滤器驱动程序坐在Windows串口驱动程序之上来添加这个额外的访问控制,甚至直接修改Windows串口驱动程序的源代码来添加你想要的东西。它的源代码现在可以在github上找到。

如果以上都不适用于您的情况,您可能需要仔细检查如何在主机上捕获COM1的输出,通常重定向到文件,shell等。它们也可能引起一些神秘的麻烦。

最新更新