【问题标题】:How to route TCP ports/sockets internal to QEMU?如何将 TCP 端口/套接字内部路由到 QEMU?
【发布时间】:2020-06-02 16:01:06
【问题描述】:

我正在尝试运行FreeRTOS+TCP demo(10.1.1 版):

代码是为 Windows 模拟器编写的,但我试图以 Xilinx Zynq 为目标,由 QEMU(版本 4.2.0)模拟。主机是 Ubuntu 16.04。存在一个 Network Interface port 用于 FreeRTOS+TCPTCP 部分,所以这应该是可能的。

对演示的明显修改之一是更改了消息的打印方式,并删除了对 Windows Sleep 函数的调用。另外,我使用ARM semihosting 来查看打印语句的输出。

除了这些更改之外,我还需要对命令行调用进行哪些​​更改?该演示创建了一个 TCP 回显服务器和客户端。如果这些都绑定在一起,那么不需要任何流量到主机,对吧?我需要做些什么特别的事情才能让它工作吗?我没有大量的网络经验。

因为这在技术上是一个裸机应用程序,所以像 -nic user,hostfwd=tcp::5022-:22 这样的 CLI 选项会发出警告 qemu-system-arm: warning: nic cadence_gem.1 has no peer. (在How to replace `qemu-system -redir` command argument? 找到)。

如果我确实想在主机和来宾之间发送流量(例如拥有 ncat 回显服务器,而不是在 FreeRTOS 中),我将如何去做?

这是一个相关的问题,没有解决方案: Running LWIP TCP/IP Stack with QEMU

当前命令行参数:

qemu-system-arm -semihosting --semihosting-config enable=on,target=native -nographic -serial mon:stdio -machine xilinx-zynq-a9 -m 512M -cpu cortex-a9 -nic user,hostfwd=tcp::12346-:7 -kernel build/rtos_demo_tcp/rtos_demo_tcp.elf

当前输出(我启用了额外的调试消息):

qemu-system-arm: warning: nic cadence_gem.1 has no peer
Seed for randomiser: 1591112953
Random numbers: 00001294 00001925 000022D0 00005CC3
FreeRTOS_IPInit
vTaskStartScheduler
prvIPTask started
Network buffers: 30 lowest 30


IP Address: 10.2.118.223
Subnet Mask: 255.255.255.0
Gateway Address: 10.2.118.1
DNS Server Address: 208.67.222.222


Socket 7 -> 0ip:0 State eCLOSED->eTCP_LISTEN

然后下一位无限重复,每次使用不同的套接字号:

FreeRTOS_connect: 14207 to a0276dfip:7
Socket 14207 -> a0276dfip:7 State eCLOSED->eCONNECT_SYN
ARP for a0276dfip (using a0276dfip): rc=0 00:00:00 00:00:00
Network buffers: 30 lowest 29
Connect[a0276dfip:7]: next timeout 1: 500 ms
ARP for a0276dfip (using a0276dfip): rc=0 00:00:00 00:00:00
Connect[a0276dfip:7]: next timeout 2: 500 ms
ARP for a0276dfip (using a0276dfip): rc=0 00:00:00 00:00:00
Connect[a0276dfip:7]: next timeout 3: 500 ms
Connect: giving up a0276dfip:7
Socket 14207 -> a0276dfip:7 State eCONNECT_SYN->eCLOSE_WAIT
FreeRTOS_closesocket[14207 to a0276dfip:7]: buffers 30 socks 1

总结:如何改变调用 QEMU 的方式,以便 TCP 客户端和服务器可以相互连接?

【问题讨论】:

    标签: sockets tcp qemu freertos bare-metal


    【解决方案1】:

    我建议尝试qemu networking guide 中列举的所有选项:
    - SLIRP: -netdev user,id=mynet0,net=192.168.76.0/24,dhcpstart=192.168.76.9
    - TAP: -netdev tap,id=mynet0
    - SOCKET: -netdev socket,id=mynet0,listen=:1234-netdev socket,id=mynet0,connect=:1234

    指南中还有更多内容。您可能还考虑的是,您可能很难直接从您关心的 VM 端口转发到主机,并且可能更容易将该 VM 连接到 另一个 VM 和端口-从第二个虚拟机转发到您的主机。

    听起来有点奇怪,但这是我以前需要做的事情。要在两个 VM 之间进行交谈,我发现 sockets 是最好的方法。它们的工作方式有点像“虚拟交叉电缆”。

    这种虚拟机到虚拟机的方法让您只需在每个虚拟机上设置相应的静态 IP 和子网,然后ncat 就可以在它们之间工作。消除 DHCP 服务器和任何类型的端口转发的所有复杂性。

    【讨论】:

    • 感谢您的建议。我制作了 2 个版本的代码,一个运行服务器任务,另一个运行客户端任务。我已将 qemu 调用的网络部分分别更改为:-nic socket,id=n1,mac=00:17:34:51:68:65,listen=:2222-nic socket,id=n2,mac=00:17:34:51:68:66,connect=127.0.0.1:2222。现在客户端任务比以前取得了更多的进展,但服务器仍然无法连接。我会继续努力,但如果有任何其他建议,我们将不胜感激。
    • 坚持下去。使用 QEMU 进行开发时,总是会出现“我的 QEMU 命令做错了吗?”和“我在我的虚拟机中做错了吗?”。最好的方法是确定并确定如何首先虚拟化您的环境。我相信你的 QEMU 命令是正确的。现在是时候提出网络问题了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2021-11-16
    • 2021-09-26
    相关资源
    最近更新 更多