【问题标题】:How to send data over serial port without Operating system in c minimally?如何在没有操作系统的情况下通过串口发送数据最少?
【发布时间】:2019-10-04 17:44:15
【问题描述】:

我正在尝试调试正在编写的虚拟机管理程序,并在 Vmware 播放器中的两个虚拟机之间设置了一个串行端口(我正在使用嵌套 vt-x 支持的虚拟机上测试虚拟机管理程序)。我的问题是如何在没有操作系统帮助的情况下将数据从管理程序传输到串行端口(当管理程序打开时,大多数软件堆栈操作系统都不可用)。我知道我可以看到其他系统如何实现发送到串行端口并以这种方式实现,但这比调试更重要,因为实现一个完整的串行接口接口可能比手动查找错误需要更多时间。我只需要发送一个数字或一个字符串,因此我正在寻找可能的极简解决方案。

直到知道我一直在使用 netconsole 来传递调试信息,但我现在面临的错误发生在内核取回控制权之前,因此 netconsole 无法发送任何数据。如果有人对如何传递调试信息而不是使用串行端口有更好的想法,我很乐意听到。

现在我已经进入那个资源 https://en.wikibooks.org/wiki/Serial_Programming/8250_UART_Programming ,这可能与我的问题有关,但如果有人能详细说明,通过使用 out 发送数据,我会很高兴,但是数据顺序搞砸了,不能用于调试,所以,到目前为止它没有帮助。

【问题讨论】:

  • 任何操作系统内核或引导加载程序初始化代码都足以开始。
  • "我在两台虚拟机之间设置了一个串口" -- 一个串口不能同时服务两台机器。串行端口是外围设备,而不是通信链路。如果你在两台机器之间建立了一个串口link,那么你需要两个串口,每台机器一个。

标签: c linux-kernel serial-port vmware hypervisor


【解决方案1】:

设置和使用串行端口进行诊断输出非常容易,我预计您会发现它非常有用。首先,您可以将其仅用于调试输出,但由于它可以是双向的,因此您可以根据需要对其进行扩展,以执行诸如转储和修改内存和寄存器(管理程序状态和客户状态)等操作。

要设置串口,首先你必须找到基地址。如果是 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

要发送一个字符,使用 IN 指令从 3fd (LSR) 读取并循环直到第 5 位被设置(THR 为空)。然后将字符写入 3f8 (THR)。

当然,串行端口驱动程序可以比这复杂得多,但这已经足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 2010-10-26
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2012-03-19
    • 1970-01-01
    相关资源
    最近更新 更多