如何将 TCP ports/sockets 内部路由到 QEMU?

How to route TCP ports/sockets internal to QEMU?

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

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

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

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

由于这在技术上是一个裸机应用程序,因此 -nic user,hostfwd=tcp::5022-:22 等 CLI 选项会发出警告 qemu-system-arm: warning: nic cadence_gem.1 has no peer. (在 找到)。

如果我确实想在主机和来宾之间发送流量(比如有一个 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客户端和服务器可以相互连接?

我建议尝试 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 端口转发到您的主机。

听起来有点奇怪,但这是我以前需要做的事情。要在两个 VM 之间进行对话,我发现 sockets 是最好的方法。它们的工作方式有点像 "virtual crossover cable".

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