## 向内核传递参数
---
liteos_a提供了定制bootargs的机制,通过qemu-run可以向内核传递参数,格式为:-b arg0=val0,arg1=val1...。当不与-f参数同时使用时,可在现有flash镜像基础上,仅更新镜像中bootargs分区内容。
传递到内核的参数名字和值均为字符串,具体使用方式请见fs/rootfs有关代码。
## 用MMC映像传递文件
---
MMC映像可用于在宿主机和虚拟机之间传递文件。注意:MMC映像同时用于一些系统文件,防止误删除。
1. 在宿主机上挂载
```
sudo modprobe nbd
sudo qemu-nbd --connect=/dev/nbd0 out/smallmmc.img
sudo mount /dev/nbd0p1 some_directory # 1st partition, total 3 partitions
```
2. 拷贝
常用的cp、mkdir命令。
3. 卸载。
```
sudo umount /mnt
sudo qemu-nbd -d /dev/nbd0
sudo modprobe -r nbd
```
## 添加一个HelloWorld程序
---
1. 创建helloworld目录
```
helloworld目录结构如下:
applications/sample/helloworld
applications/sample/helloworld/src
```
2. 创建helloworld.c文件
```
在 applications/sample/helloworld/src下创建helloworld.c文件,并添加如下代码:
```
```
#include
int main(int argc, char **argv)
{
printf("\n************************************************\n");
printf("\n\t\tHello OHOS!\n");
printf("\n************************************************\n\n");
return 0;
}
```
3. 为helloworld创建BUILD.gn文件
```
在 applications/sample/helloworld下添加BUILD.gn文件,并添加如下代码:
```
```
import("//build/lite/config/component/lite_component.gni")
lite_component("hello-OHOS") {
features = [ ":helloworld" ]
}
executable("helloworld") {
output_name = "helloworld"
sources = [ "src/helloworld.c" ]
include_dirs = []
defines = []
cflags_c = []
ldflags = []
}
```
**提示**:helloworld最后目录结构为
```
applications/sample/helloworld
applications/sample/helloworld/BUILD.gn
applications/sample/helloworld/src
applications/sample/helloworld/src/helloworld.c
```
4. 在build/lite/components中新建配置文件helloworld.json,并添加如下代码:
```
{
"components": [
{
"component": "hello_world_app",
"description": "Communication related samples.",
"optional": "true",
"dirs": [
"applications/sample/helloworld"
],
"targets": [
"//applications/sample/helloworld:hello-OHOS"
],
"rom": "",
"ram": "",
"output": [],
"adapted_kernel": [ "liteos_a" ],
"features": [],
"deps": {
"components": [],
"third_party": []
}
}
]
}
```
**注意**:helloworld.json中dirs和targets的属性值是不带src的
5. 在vendor/ohemu/qemu_small_system_demo/config.json配置文件中找到subsystems属性,并下面追加helloworld的subsystem配置,配置参考如下:
```
{
"subsystem": "helloworld",
"components": [
{ "component": "hello_world_app", "features":[] }
]
}
```
**注意**:修改JSON配置的时候一定要将多余的逗号去掉,否则编译时会报错
6. 编译并构建qemu虚拟环境
参考链接: [编译方法](README_zh.md)
**注意**:helloworld 正常编译后会出现在 out/arm_virt/qemu_small_system_demo/bin中,如果没有,请返回检查相关配置文件中的路径和名称是否有误,并尝试重新编译直到出现helloworld
```
提示:编译完成后,代码根目录下会生成qemu-run脚本,直接运行该脚本默认以非root权限运行qemu环境(不含网络配置)。其他参数配置
详见qemu-run --help
```
7. 运行helloworld
helloworld在qemu虚拟机的bin目录下面,进入qemu虚拟机环境后,在bin目录下执行 ./helloworld,会出现如下信息,表示Hello World程序添加成功
```
OHOS # ./helloworld
OHOS #
************************************************
Hello OHOS!
************************************************
```
## 运行简单图形demo程序
---
说明:这次操作指导主要是基于noVNC的方式进行vnc链接,用作屏幕显示。
1. 在一个terminal中运行qemu程序
```
./qemu-run
```
2. 在另外一个terminal中运行noVNC程序代理VNC server,以便远端浏览器通过链接地址
访问vnc server,需要知道本机的IP
```
wget https://github.com/novnc/noVNC/archive/refs/tags/v1.2.0.tar.gz
tar -zxvf v1.2.0.tar.gz
cd noVNC-1.2.0/
./utils/launch.sh --vnc localhost:5920
```
后面会显示一个链接,用于vnc访问
```
Navigate to this URL:
http://ubuntu:6080/vnc.html?host=ubuntu&port=6080
```
其中ubuntu表示域名,需要替换为对应的本机IP,例如本机IP是192.168.66.106,那么访
问的链接地址为
```
http://192.168.66.106:6080/vnc.html?host=192.168.66.106&port=6080
```
3. 在第一个terminal中运行`simple_ui_demo`程序
```
./bin/simple_ui_demo
```
console每秒输出为图形的帧率
```
01-01 00:00:46.990 10 44 D 00000/UiDemo: 53 fps
```
4. 在浏览器中看到的vnc输出即为`960*480`的屏幕显示输出,并且能够用鼠标按钮点击。
5. 退出
在terminal中输入`Ctrl + c`
## 观察dsoftbus组网发现
---
### 运行一台虚拟机
1. 启动结束后,观察日志显示dsoftbus试图发现设备。
```
./qemu-run -n
```
### 运行另一台虚拟机
2. 为这个虚拟机单独拷贝一份虚拟机映像。
```
cp flash.img flash2.img
cp out/smallmmc.img out/smallmmc1.img
```
3. 从//vendor/ohemu/qemu_small_system_demo/qemu_run.sh中拷贝出qemu命令:
```
sudo `which qemu-system-arm` -M virt, ...
```
修改映像文件名、MMC映像文件名、MAC地址,删除替换脚本变量;为便于观察可增加-nographic参数。
4. 如果ip地址恰好与第1台虚拟机相同,修改ip地址。在OHOS提示符下:
```
ifconfig wlan0 inet 10.0.2.XX
```
5. 观察:启动快结束时,两台虚拟机的日志显示,相互发现了对方,并试图组网。
## Hack图形桌面
---
[applications_sample_camera](https://gitee.com/openharmony/applications_sample_camera)仓库提供了一个小型桌面应用示例。虽然qemu虚拟机没有摄录放驱动,但可以利用hisilicon的SDK,来Hack一个图形桌面。
1. 让//device/soc/hisilicon仓库:支持我们的板子
修改文件`common/hal/{media/BUILD.gn,middleware/BUILD.gn}`,找到`if (board_name == "hispark_taurus" || board_name == "aegis_hi3516dv300")`,加上`board_name == "arm_virt"`。
2. 让//foundation/multimedia/media_utils_lite/仓库:到hisilicon那儿找库
修改文件`BUILD.gn`,找到
```
"$ohos_board_adapter_dir/media:hardware_media_sdk",
"$ohos_board_adapter_dir/middleware:middleware_source_sdk",
```
改成
```
"//device/soc/hisilicon/common/hal/media:hardware_media_sdk",
"//device/soc/hisilicon/common/hal/middleware:middleware_source_sdk",
```
3. //device/qemu仓库:增加一个拷贝hi3516dv300的mpp库动作
修改文件`arm_virt/liteos_a/BUILD.gn`,增加一个`"mpp:copy_mpp_libs"`依赖,同时在该目录下增加一个指向`../../../soc/hisilicon/hi3516dv300/sdk_liteos/mpp/`的符号链接`mpp`。
**重要**:这部分库使用了git-lfs形式存储,因此要恢复其正常内容:
```
cd device/soc/hisilicon/hi3516dv300/sdk_liteos/mpp/lib/
git lfs checkout *.so
```
4. //vendor/ohemu仓库:增加桌面应用组件
修改文件`qemu_small_system_demo/config.json`,把`"aafwk_lite"`组件的特性值改为`true`,增加如下新组件
```
{
"subsystem": "applications",
"components": [
{ "component": "camera_sample_app", "features":[] },
{ "component": "camera_screensaver_app", "features":[] }
]
},
{
"subsystem": "powermgr",
"components": [
{ "component": "powermgr_lite", "features":[ "enable_screensaver = true" ] }
]
},
```