在NXP-IMX8MP上启动hvisor
时间:2024/2/25
更新时间:2025/3/7
作者:杨竣轶,陈星宇,李国玮,陈林锟
1. 下载厂商提供的linux源码
https://pan.baidu.com/s/1XimrhPBQIG5edY4tPN9_pw?pwd=kdtk 提取码:kdtk
进入Linux/源码/
目录下,下载OK8MP-linux-sdk.tar.bz2.0*
3个压缩包,下载完成后,执行:
cd Linux/sources
# 合并分卷压缩包
cat OK8MP-linux-sdk.tar.bz2.0* > OK8MP-linux-sdk.tar.bz2
# 解压合并的压缩包
tar -xvjf OK8MP-linux-sdk.tar.bz2
解压后,OK8MP-linux-kernel
目录就是linux源码目录。
2. linux源码编译
安装交叉编译工具
-
下载交叉编译工具链:
wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
-
解压工具链:
tar xvf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
-
添加路径,使
aarch64-none-linux-gnu-*
可以直接使用,修改~/.bashrc
文件:echo 'export PATH=$PWD/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin:$PATH' >> ~/.bashrc source ~/.bashrc
编译linux
-
切换到 Linux 内核源码目录:
cd Linux/sources/OK8MP-linux-sdk
-
执行编译命令:
# 设置 Linux 内核配置 make OK8MP-C_defconfig ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- # 编译 Linux 内核 make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- Image -j$(nproc) # 复制编译后的镜像到 tftp 目录 cp arch/arm64/boot/Image ~/tftp/
这里建立一个tftp目录,方便之后对镜像整理,也方便附录中使用tftp传输镜像。
3. 制作sd卡
-
将SD卡插入读卡器,并连接至主机。
-
切换至Linux/Images目录。
-
执行以下命令,进行分区:
fdisk <$DRIVE> d # 删除所有分区 n # 创建新分区 p # 选择主分区 1 # 分区编号为1 16384 # 起始扇区 t # 更改分区类型 83 # 选择Linux文件系统(ext4) w # 保存并退出
-
将启动文件写入SD卡启动盘:
dd if=imx-boot_4G.bin of=<$DRIVE> bs=1K seek=32 conv=fsync
-
格式化SD卡启动盘的第一个分区为ext4格式:
mkfs.ext4 <$DRIVE>1
-
将SD卡读卡器拔出,重新连接。将根文件系统rootfs.tar解压到SD卡1号分区,rootfs.tar可以自行参考qemu-aarch64制作,也可以使用下面的镜像。
tar -xvf rootfs.tar -C <path/to/mounted/SD/card/partition>
rootfs.tar下载地址:
https://disk.pku.edu.cn/link/AADFFFE8F568DE4E73BE24F5AED54B00EB
文件名:rootfs.tar
- 完成后,弹出SD卡。
4. 编译hvisor
- 整理配置文件
将配置文件放到该放的地方,配置文件样例可以参考这里。
- 编译hvisor
进入hvisor目录,切换到main分支或dev分支,执行编译命令:
make ARCH=aarch64 FEATURES=platform_imx8mp,gicv3 LOG=info all
# 将编译后的hvisor镜像放入tftp
make cp
5. 启动hvisor和root linux
启动NXP板子之前,需要将tftp目录下的文件放到sd卡,比如放到sd卡的/home/arm64目录下,tftp目录下的文件包括:
- Image:root linux镜像,也可以用作non root linux镜像
- linux1.dtb, linux2.dtb:root linux和non root linux的设备树
- hvisor.bin:hvisor镜像
- OK8MP-C.dtb:这个本质上不需要了,但因为历史原因仍需要。可以用linux1.dtb改个名放在这里
启动NXP板子:
- 调整拨码开关以启用SD卡启动模式:(1,2,3,4) = (ON,ON,OFF,OFF)。
- 将SD卡插入SD插槽。
- 使用串口线将开发板与主机相连。
- 通过终端软件打开串口
启动NXP板子后,串口应该有输出,重启开发板,立刻按下空格保持不懂,使uboot进入命令行终端,执行如下命令:
setenv loadaddr 0x40400000; setenv fdt_addr 0x40000000; setenv zone0_kernel_addr 0xa0400000; setenv zone0_fdt_addr 0xa0000000; ext4load mmc 1:1 ${loadaddr} /home/arm64/hvisor.bin; ext4load mmc 1:1 ${fdt_addr} /home/arm64/OK8MP-C.dtb; ext4load mmc 1:1 ${zone0_kernel_addr} /home/arm64/Image; ext4load mmc 1:1 ${zone0_fdt_addr} /home/arm64/linux1.dtb; bootm ${loadaddr} - ${fdt_addr};
执行后,hvisor应该就启动并自动进入root linux了。
6. 启动non root linux
启动non root linux需要用到hvisor-tool。具体请参考hvisor-tool的 README。
附. 使用tftp便捷传输镜像
tftp方便开发板与主机间的数据传输,不需要每次插拔sd卡。具体步骤如下:
对于ubuntu系统
如果你使用的是ubuntu系统,则依次执行:
-
安装 TFTP 服务器软件包
sudo apt-get update sudo apt-get install tftpd-hpa tftp-hpa
-
配置 TFTP 服务器
创建 TFTP 根目录并设置权限:
mkdir -p ~/tftp sudo chown -R $USER:$USER ~/tftp sudo chmod -R 755 ~/tftp
编辑 tftpd-hpa 配置文件:
sudo nano /etc/default/tftpd-hpa
修改如下:
# /etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY="/home/<your-username>/tftp" TFTP_ADDRESS=":69" TFTP_OPTIONS="-l -c -s"
将
<your-username>
替换为实际用户名。 -
启动/重启 TFTP 服务
sudo systemctl restart tftpd-hpa
-
验证 TFTP 服务器
echo "TFTP Server Test" > ~/tftp/testfile.txt
tftp localhost tftp> get testfile.txt tftp> quit cat testfile.txt
若显示 "TFTP Server Test",则 TFTP 服务器工作正常。
-
配置开机启动:
sudo systemctl enable tftpd-hpa
-
使用网线将开发板的网口(共有两个,请选择下方的一个)与主机连接。并配置主机有线网卡,ip:192.169.137.2, netmask: 255.255.255.0。
之后启动开发板,进入uboot命令行后,执行命令变为:
setenv serverip 192.169.137.2; setenv ipaddr 192.169.137.3; setenv loadaddr 0x40400000; setenv fdt_addr 0x40000000; setenv zone0_kernel_addr 0xa0400000; setenv zone0_fdt_addr 0xa0000000; tftp ${loadaddr} ${serverip}:hvisor.bin; tftp ${fdt_addr} ${serverip}:OK8MP-C.dtb; tftp ${zone0_kernel_addr} ${serverip}:Image; tftp ${zone0_fdt_addr} ${serverip}:linux1.dtb; bootm ${loadaddr} - ${fdt_addr};
解释:
setenv serverip 192.169.137.2
:设置tftp服务器的IP地址。setenv ipaddr 192.169.137.3
:设置开发板的IP地址。setenv loadaddr 0x40400000
:设置hvisor镜像的加载地址。setenv fdt_addr 0x40000000
:设置设备树文件的加载地址。setenv zone0_kernel_addr 0xa0400000
:设置guest Linux镜像的加载地址。setenv zone0_fdt_addr 0xa0000000
:设置root Linux的设备树文件的加载地址。tftp ${loadaddr} ${serverip}:hvisor.bin
:从tftp服务器下载hvisor镜像到hvisor的加载地址。tftp ${fdt_addr} ${serverip}:OK8MP-C.dtb
:从tftp服务器下载设备树文件到设备树文件的加载地址。tftp ${zone0_kernel_addr} ${serverip}:Image
:从tftp服务器下载guest Linux镜像到guest Linux镜像的加载地址。tftp ${zone0_fdt_addr} ${serverip}:linux1.dtb
:从tftp服务器下载root Linux的设备树文件到root Linux的设备树文件的加载地址。bootm ${loadaddr} - ${fdt_addr}
:启动hvisor,加载hvisor镜像和设备树文件。
对于windows系统
可以参考这篇文章:https://blog.csdn.net/qq_52192220/article/details/142693036