1# Qemu ARM Virt 教程 - liteos_a 2 3## 1. 简介 4 5`arm_virt/` 子目录包含部分Qemu ARM虚拟化平台验证的OpenHarmony kernel\_liteos\_a的适配代码,含驱动配置、板端配置等。 6 7ARM 虚拟化平台是一个 `qemu-system-arm` 的目标设备,通过它来模拟一个通用的、基于ARM架构的单板。 8Qemu中machine为 **virt** 的单板就是这种可配置的,例如:选择核的类型、核的个数、内存的大小和安全特性等,单板设备的配置。 9 10这次模拟的配置是:Cortex-A7架构,1个CPU,带安全扩展,GICv2,1G内存。 11提示: 系统内存硬编码为64MB。 12 13## 2. 环境搭建 14 15参考链接: [环境搭建](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/porting/Readme-CN.md) 16 17## 3. 获取源码 18 19参考链接: [代码获取](https://gitee.com/openharmony/docs/blob/HEAD/zh-cn/device-dev/get-code/sourcecode-acquire.md) 20 21## 4. 源码构建 22 23在已经获取的源码根目录,请输入: 24 25``` 26hb set 27``` 28 29选择ohemu下的`qemu_small_system_demo`选项。 30 31 32然后执行构建命令如下: 33 34``` 35hb build 36``` 37 38在构建完成之后,对应的结果文件在out/arm_virt/qemu_small_system_demo/目录。 39 40 41## 5. 在Qemu中运行镜像 42 43a) 如果没有安装 `qemu-system-arm` ,安装请参考链接 [Qemu installation](https://gitee.com/openharmony/device_qemu/blob/HEAD/README_zh.md) 44 45提示:当前引入的功能在virt-5.1的目标machine已经完成测试,不保证所有的Qemu版本都能够运行成功,因此需要保证你的qemu-system-arm 46版本尽可能在5.1及以上。 47 48b) 制作以及运行镜像 49 50在代码根目录下,编译后会生成qemu-run脚本,可直接运行该脚本,根据脚本提示制作、运行镜像。 51 52执行`./qemu-run --help`获取帮助。 53 54网卡模拟的是无线网卡wlan0,但无真的wifi功能;默认不加参数的情况下,网络不会自动配置。 55 56当镜像文件out/smallmmc.img存在时,默认不会被重新制作。MMC镜像主要内容为rootfs和userfs,第1个分区为rootfs,第2个分区为userfs,安装在/storage目录,第3个分区为用户数据,安装在/userdata目录。 57 58c) 退出qemu环境 59 60按下`Ctrl-A + x`可退出qemu虚拟环境。 61 62## 6. gdb调试 63 64安装`gdb-multiarch`工具包: 65``` 66sudo apt install gdb-multiarch 67``` 68然后, 69``` 70cd ohos/vendor/ohemu/qemu_small_system_demo/kernel_configs 71vim debug.config 72``` 73 74将 `LOSCFG_CC_STACKPROTECTOR_ALL=y` 修改为: 75 76``` 77# LOSCFG_CC_STACKPROTECTOR_ALL is not set 78LOSCFG_COMPILE_DEBUG=y 79``` 80 81保存并退出,在OHOS根目录重新编译: 82 83``` 84hb build -f 85``` 86 87在一个窗口中输入命令: 88 89``` 90./qemu-run -g 91``` 92 93在另一个窗口中输入命令: 94 95``` 96gdb-multiarch out/arm_virt/qemu_small_system_demo/OHOS_Image 97(gdb) target remote localhost:1234 98``` 99 100更多gdb相关的调试可以查阅:[gdb指导手册](https://sourceware.org/gdb/current/onlinedocs/gdb)。 101 102## 7. 用法示例 103 104- [向内核传递参数](example.md#sectiondebug) 105 106- [用MMC映像传递文件](example.md#sectionfatfs) 107 108- [添加一个Hello World程序](example.md#addhelloworld) 109 110- [运行图形demo](example.md#simple_ui_demo) 111 112- [观察dsoftbus组网发现](example.md#dsoftbus_discover) 113 114- [Hack图形桌面](example.md#desktop) 115 116## FAQ: 1171. 当网络配置出现问题时,如何排查问题? 118 119 手动配置主机网桥设备。Linux系统参考以下命令: 120 121 ``` 122 sudo modprobe tun tap 123 sudo ip link add br0 type bridge 124 sudo ip address add 10.0.2.2/24 dev br0 125 sudo ip link set dev br0 up 126 127 # 以下命令执行一次后即可注释掉 128 sudo mkdir -p /etc/qemu 129 echo 'allow br0' | sudo tee -a /etc/qemu/bridge.conf 130 ``` 131 132 配置完成后,用ip addr检查应有如下类似显示。当br0不存在或尖括号中为DOWN时,请重新检查配置命令。 133 134 ``` 135 5: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 136 link/ether 2e:52:52:0e:21:44 brd ff:ff:ff:ff:ff:ff 137 inet 10.0.2.2/24 scope global br0 138 valid_lft forever preferred_lft forever 139 ``` 140 141 当系统安装有docker等软件时,系统防火墙可能阻止网桥访问。 142 143 `cat /proc/sys/net/bridge/bridge-nf-call-iptables`会显示结果:1 144 145 这时,可用如下命令打开访问许可: 146 147 ``` 148 echo 0 | sudo tee /proc/sys/net/bridge/bridge-nf-call-iptables 149 ``` 150 151 提示:系统网络硬编码为10.0.2.0/24,网关10.0.2.2,网址随机选取。不同的客户机实例应使用不同的MAC和IP地址(flash、MMC映像文件也应不同),MAC地址可通过QEMU命令行传递,IP地址可在OHOS命令行中调整,如`ifconfig wlan0 inet 10.0.2.30`,或使用其它方法。 152 1532. qemu-run提示`qemu-system-arm`运行出错时,如何排查问题? 154 155 qemu-run脚本中,完整的执行命令及参数解释如下: 156 157 ``` 158 qemu-system-arm -M virt,gic-version=2,secure=on -cpu cortex-a7 -smp cpus=1 -m 1G \ 159 -bios out/arm_virt/qemu_small_system_demo/OHOS_Image.bin \ 160 -drive if=none,file=out/smallmmc.img,format=raw,id=mmc 161 -device virtio-blk-device,drive=mmc \ 162 -netdev bridge,id=net0 \ 163 -device virtio-net-device,netdev=net0,mac=12:22:33:44:55:66 \ 164 -device virtio-gpu-device,xres=960,yres=480 \ 165 -device virtio-tablet-device \ 166 -device virtio-rng-device \ 167 -vnc :20 \ 168 -s -S \ 169 -global virtio-mmio.force-legacy=false 170 ``` 171 172 ``` 173 -M 虚拟机类型,ARM virt,GIC 2中断控制器,有安全扩展 174 -cpu CPU型号 175 -smp SMP设置,单核 176 -m 虚拟机可使用的内存限制 177 -bios 内核启动映像 178 -drive if=none 块设备映像文件设置 179 -netdev [可选]网卡后端设置,桥接类型 180 -device virtio-blk-device 块存储设备 181 -device virtio-net-device [可选]网卡设备 182 -device virtio-gpu-device GPU设备 183 -device virtio-tablet-device 输入设备 184 -device virtio-rng-device 随机数设备 185 -vnc :20 [推荐]远程桌面连接,端口5920 186 -s -S [可选]gdb单步调试 187 -global QEMU配置参数,不可调整 188 ``` 189 190 运行时,qemu-run遇到报错如下报错: failed to parse default acl file 191 192 可能是qemu安装方式不同,导致qemu配置文件路径存在一定差异: 193 194 - 使用源码安装默认在/usr/local/qemu/etc/qemu 195 196 - 使用部分Linux发行版安装工具进行安装时,默认在/ect/qemu/目录下 197 198 可根据实际情况,确认具体配置目录,并进行如下修改: 199 200 ``` 201 echo 'allow br0' | sudo tee -a <配置文件路径> 202 ``` 203 204 2053. 1.1.0LTS版本qemu运行无输出? 206 207 LTS的代码存在一个内核启动缺陷,可以参考如下PR尝试解决问题: 208 209 https://gitee.com/openharmony/kernel_liteos_a/pulls/324 210 211 2124. VNC窗口不显示光标? 213 214 virtio-tablet是个模拟平板输入的设备,QEMU不捕获设备,虚拟机不显示光标,由VNC客户端自行处理光标显示。请查看VNC客户端选项设置。