2020年3月18日星期三

arm_emulator: 通过串口建立虚拟机的网络连接

     网络是linux系统最为重要的功能之一,为此我们迫切需移植网络支持,实现一个稳定的网卡驱动和相应的外设是比较麻烦的,考虑到之前已经完善好虚拟机串口的外设,所以可以直接让以太网帧在串口上传输。虚拟机端则可以利用宿主机的tuntap虚拟网卡转发数据。
1.虚拟机实现:
    虚拟机里添加第二个串口,中断号2,实现4个虚拟网卡函数。
             .interrupt_id = 2,
            .readable = slip_tun_readable,
            .read = slip_tun_read,
            .writeable = slip_tun_writeable,
            .write = slip_tun_write,
    虚拟机串口网卡外设使用linux的tuntap虚拟网卡/dev/net/tun, 打开了两个线程,slip_out_task_proc、tun_out_task_proc,分别处理由虚拟机串口发出的数据和虚拟网卡发出的数据,使用SLIP协议进行数据帧和数据流之间的适配。由于虚拟机线程不能被阻塞,所以中间加入两个方向的fifo提高效率,利用fifo的状态实现串口readable,writeable的状态判断。

2.虚拟机内系统配置:
    内核需要开启Universal TUN/TAP device driver support 这个选项支持。
    这里有一个之前写的工具可以利用,ethoslip_tun地址),这个工具是之前调试串口WIFI模块时写的,功能是将tuntap虚拟网卡的L2数据帧使用SLIP协议封装成串口数据流。ethoslip_tun 具体流程:
tap0 <tuntap内核驱动>  /dev/net/tun  <系统调用> [ethoslip_tun<系统调用> /dev/ttySx <串口驱动> 串口外设
首先我们将ethoslip_tun下载,然后使用arm-linux-gnueabi-gcc 交叉编译,拷贝到buildroot的rootfs里,即可运行。
./ethoslip_tun /dev/ttyS1 115200&
配置IP地址:
 ifconfig tap0 10.0.0.2
 3.虚拟机外系统配置:
只需要配置IP地址即可,与虚拟机不同。
ifconfig tap0 10.0.0.1
 此时可以互相ping通:


我们尝试在虚拟机里新建一个index.php
vi index.php
<?php
phpinfo();
运行:
php -S 0.0.0.0:80
此时即可看到一个虚拟机里网页。。。😀
当然,虚拟机想要wget什么访问外网的话,只要配置宿主机的iptables,将虚拟网卡网段数据转发给物理网卡,同时虚拟机内添加默认gw。







没有评论:

发表评论