1## 向内核传递参数<a name="sectiondebug"></a> 2--- 3 4liteos_a提供了定制bootargs的机制,通过qemu-run可以向内核传递参数,格式为:-b arg0=val0,arg1=val1...。当不与-f参数同时使用时,可在现有flash镜像基础上,仅更新镜像中bootargs分区内容。 5 6传递到内核的参数名字和值均为字符串,具体使用方式请见fs/rootfs有关代码。 7 8## 用MMC映像传递文件<a name="sectionfatfs"></a> 9--- 10 11MMC映像可用于在宿主机和虚拟机之间传递文件。注意:MMC映像同时用于一些系统文件,防止误删除。 12 131. 在宿主机上挂载 14 15``` 16sudo modprobe nbd 17sudo qemu-nbd --connect=/dev/nbd0 out/smallmmc.img 18sudo mount /dev/nbd0p1 some_directory # 1st partition, total 3 partitions 19``` 20 212. 拷贝 22 23常用的cp、mkdir命令。 24 253. 卸载。 26 27``` 28sudo umount /mnt 29sudo qemu-nbd -d /dev/nbd0 30sudo modprobe -r nbd 31``` 32 33## 添加一个HelloWorld程序<a name="addhelloworld"></a> 34--- 351. 创建helloworld目录 36``` 37helloworld目录结构如下: 38applications/sample/helloworld 39applications/sample/helloworld/src 40``` 41 422. 创建helloworld.c文件 43``` 44在 applications/sample/helloworld/src下创建helloworld.c文件,并添加如下代码: 45``` 46``` 47#include <stdio.h> 48 49int main(int argc, char **argv) 50{ 51 printf("\n************************************************\n"); 52 printf("\n\t\tHello OHOS!\n"); 53 printf("\n************************************************\n\n"); 54 55 return 0; 56} 57``` 58 593. 为helloworld创建BUILD.gn文件 60``` 61在 applications/sample/helloworld下添加BUILD.gn文件,并添加如下代码: 62``` 63``` 64import("//build/lite/config/component/lite_component.gni") 65lite_component("hello-OHOS") { 66 features = [ ":helloworld" ] 67} 68executable("helloworld") { 69 output_name = "helloworld" 70 sources = [ "src/helloworld.c" ] 71 include_dirs = [] 72 defines = [] 73 cflags_c = [] 74 ldflags = [] 75} 76``` 77 78**提示**:helloworld最后目录结构为 79``` 80applications/sample/helloworld 81applications/sample/helloworld/BUILD.gn 82applications/sample/helloworld/src 83applications/sample/helloworld/src/helloworld.c 84``` 85 864. 在build/lite/components中新建配置文件helloworld.json,并添加如下代码: 87``` 88{ 89 "components": [ 90 { 91 "component": "hello_world_app", 92 "description": "Communication related samples.", 93 "optional": "true", 94 "dirs": [ 95 "applications/sample/helloworld" 96 ], 97 "targets": [ 98 "//applications/sample/helloworld:hello-OHOS" 99 ], 100 "rom": "", 101 "ram": "", 102 "output": [], 103 "adapted_kernel": [ "liteos_a" ], 104 "features": [], 105 "deps": { 106 "components": [], 107 "third_party": [] 108 } 109 } 110 ] 111} 112``` 113 114**注意**:helloworld.json中dirs和targets的属性值是不带src的 115 1165. 在vendor/ohemu/qemu_small_system_demo/config.json配置文件中找到subsystems属性,并下面追加helloworld的subsystem配置,配置参考如下: 117``` 118 { 119 "subsystem": "helloworld", 120 "components": [ 121 { "component": "hello_world_app", "features":[] } 122 ] 123 } 124``` 125 126**注意**:修改JSON配置的时候一定要将多余的逗号去掉,否则编译时会报错 127 1286. 编译并构建qemu虚拟环境 129 130参考链接: [编译方法](README_zh.md) 131 132**注意**:helloworld 正常编译后会出现在 out/arm_virt/qemu_small_system_demo/bin中,如果没有,请返回检查相关配置文件中的路径和名称是否有误,并尝试重新编译直到出现helloworld 133 134``` 135提示:编译完成后,代码根目录下会生成qemu-run脚本,直接运行该脚本默认以非root权限运行qemu环境(不含网络配置)。其他参数配置 136详见qemu-run --help 137``` 138 139 1407. 运行helloworld 141 142helloworld在qemu虚拟机的bin目录下面,进入qemu虚拟机环境后,在bin目录下执行 ./helloworld,会出现如下信息,表示Hello World程序添加成功 143 144``` 145OHOS # ./helloworld 146OHOS # 147************************************************ 148 149 Hello OHOS! 150 151************************************************ 152``` 153 154## 运行简单图形demo程序<a name="simple_ui_demo"></a> 155--- 156 157说明:这次操作指导主要是基于noVNC的方式进行vnc链接,用作屏幕显示。 158 1591. 在一个terminal中运行qemu程序 160 161``` 162./qemu-run 163``` 164 1652. 在另外一个terminal中运行noVNC程序代理VNC server,以便远端浏览器通过链接地址 166访问vnc server,需要知道本机的IP 167 168``` 169wget https://github.com/novnc/noVNC/archive/refs/tags/v1.2.0.tar.gz 170tar -zxvf v1.2.0.tar.gz 171cd noVNC-1.2.0/ 172./utils/launch.sh --vnc localhost:5920 173``` 174 175后面会显示一个链接,用于vnc访问 176 177``` 178Navigate to this URL: 179 180 http://ubuntu:6080/vnc.html?host=ubuntu&port=6080 181``` 182 183其中ubuntu表示域名,需要替换为对应的本机IP,例如本机IP是192.168.66.106,那么访 184问的链接地址为 185 186``` 187http://192.168.66.106:6080/vnc.html?host=192.168.66.106&port=6080 188``` 189 1903. 在第一个terminal中运行`simple_ui_demo`程序 191 192``` 193./bin/simple_ui_demo 194``` 195 196console每秒输出为图形的帧率 197 198``` 19901-01 00:00:46.990 10 44 D 00000/UiDemo: 53 fps 200``` 201 2024. 在浏览器中看到的vnc输出即为`960*480`的屏幕显示输出,并且能够用鼠标按钮点击。 203 2045. 退出 205 206在terminal中输入`Ctrl + c` 207 208## 观察dsoftbus组网发现<a name="dsoftbus_discover"></a> 209--- 210 211### 运行一台虚拟机 212 2131. 启动结束后,观察日志显示dsoftbus试图发现设备。 214``` 215./qemu-run -n 216``` 217 218### 运行另一台虚拟机 219 2202. 为这个虚拟机单独拷贝一份虚拟机映像。 221``` 222cp flash.img flash2.img 223cp out/smallmmc.img out/smallmmc1.img 224``` 225 2263. 从//vendor/ohemu/qemu_small_system_demo/qemu_run.sh中拷贝出qemu命令: 227``` 228sudo `which qemu-system-arm` -M virt, ... 229``` 230 231修改映像文件名、MMC映像文件名、MAC地址,删除替换脚本变量;为便于观察可增加-nographic参数。 232 2334. 如果ip地址恰好与第1台虚拟机相同,修改ip地址。在OHOS提示符下: 234``` 235ifconfig wlan0 inet 10.0.2.XX 236``` 237 2385. 观察:启动快结束时,两台虚拟机的日志显示,相互发现了对方,并试图组网。 239 240## Hack图形桌面<a name="desktop"></a> 241--- 242 243[applications_sample_camera](https://gitee.com/openharmony/applications_sample_camera)仓库提供了一个小型桌面应用示例。虽然qemu虚拟机没有摄录放驱动,但可以利用hisilicon的SDK,来Hack一个图形桌面。 244 2451. 让//device/soc/hisilicon仓库:支持我们的板子 246 247修改文件`common/hal/{media/BUILD.gn,middleware/BUILD.gn}`,找到`if (board_name == "hispark_taurus" || board_name == "aegis_hi3516dv300")`,加上`board_name == "arm_virt"`。 248 2492. 让//foundation/multimedia/media_utils_lite/仓库:到hisilicon那儿找库 250 251修改文件`BUILD.gn`,找到 252``` 253 "$ohos_board_adapter_dir/media:hardware_media_sdk", 254 "$ohos_board_adapter_dir/middleware:middleware_source_sdk", 255``` 256改成 257``` 258 "//device/soc/hisilicon/common/hal/media:hardware_media_sdk", 259 "//device/soc/hisilicon/common/hal/middleware:middleware_source_sdk", 260``` 261 2623. //device/qemu仓库:增加一个拷贝hi3516dv300的mpp库动作 263 264修改文件`arm_virt/liteos_a/BUILD.gn`,增加一个`"mpp:copy_mpp_libs"`依赖,同时在该目录下增加一个指向`../../../soc/hisilicon/hi3516dv300/sdk_liteos/mpp/`的符号链接`mpp`。 265 266**重要**:这部分库使用了git-lfs形式存储,因此要恢复其正常内容: 267``` 268cd device/soc/hisilicon/hi3516dv300/sdk_liteos/mpp/lib/ 269git lfs checkout *.so 270``` 271 2724. //vendor/ohemu仓库:增加桌面应用组件 273 274修改文件`qemu_small_system_demo/config.json`,把`"aafwk_lite"`组件的特性值改为`true`,增加如下新组件 275``` 276 { 277 "subsystem": "applications", 278 "components": [ 279 { "component": "camera_sample_app", "features":[] }, 280 { "component": "camera_screensaver_app", "features":[] } 281 ] 282 }, 283 { 284 "subsystem": "powermgr", 285 "components": [ 286 { "component": "powermgr_lite", "features":[ "enable_screensaver = true" ] } 287 ] 288 }, 289``` 290