dmg*_*dmg 5 c vmware serial-port hypervisor linux-kernel
我正在尝试调试我正在编写的管理程序,并在 Vmware 播放器中的两个虚拟机之间设置了一个串行端口(我正在具有嵌套 vt-x 支持的虚拟机上测试管理程序)。我的问题是如何在没有操作系统帮助的情况下将数据从管理程序传输到串行端口(大多数软件堆栈操作系统在管理程序打开时不可用)。我知道我可以看到其他系统如何实现发送到串行端口并以这种方式实现,但这超出了调试的重点,因为实现串行端口的完整接口可能比手动查找错误需要更多时间。我只需要发送一个数字或一个字符串,因此我正在寻找可能的极简解决方案。
直到知道我一直在使用 netconsole 来传递调试信息,但是我现在面临的错误发生在内核取回控制权之前,因此 netconsole 无法发送任何数据。如果有人对如何传递调试信息而不是使用串行端口有更好的想法,我很乐意听到。
现在我已经进入该资源https://en.wikibooks.org/wiki/Serial_Programming/8250_UART_Programming,这可能与我的问题有关,但如果有人可以详细说明,通过使用发送数据,我很乐意,但是数据顺序乱了,不能用于调试,所以,到目前为止它没有帮助。
设置和使用串行端口进行诊断输出非常容易,我预测您会发现它非常有用。首先,您可以仅将它用于调试输出,但由于它可以是双向的,因此您可以根据需要扩展它以执行转储和修改内存和寄存器(虚拟机管理程序状态和来宾状态)等操作。
要设置串行端口,首先必须找到基地址。如果是COM1,那么它就是3f8,所以我将以此为例。要初始化端口,请使用 OUT 指令写入这些值:
3fb = 80 // LCR = DLAB
3f8 = 1 // DLL = divisor low (115200 baud)
3f9 = 0 // DLM = divisor high
3fb = 3 // LCR = 8/1/n
3f9 = 0 // IER = 0
3fa = 1 // FCR = FIFO enable
3fc = 3 // MCR = terminal ready | request to send
Run Code Online (Sandbox Code Playgroud)
要发送字符,请使用 IN 指令从 3fd (LSR) 读取并循环,直到设置位 5(THR 为空)。然后将该字符写入3f8(THR)。
当然,串行端口驱动程序可以比这复杂得多,但这足以让它运行。