Qemu(1) --- Ubuntu下运行CK860 Qemu

今天在Ubuntu上搭建了一个C-Sky平台的Qemu,下面开始吧。

1. 下载Qemu

  1. 打开平头哥社区,进入社区需要注册个用户名,大家根据需要自行注册。依次点击开发中心资源下载工具模拟器-Qemu下载(玄铁QEMU-x86_64-Ubuntu-18.04),将下载的压缩包解压到Ubuntu下即可,可选择将bin目录加入环境变量。
    Qemu(1) --- Ubuntu下运行CK860 Qemu_第1张图片
  2. 尝试运行qemu-system-cskyv2程序,发现缺少动态库,安装相应的库即可。
$ ldd ./bin/qemu-system-cskyv2 | grep "not find"
libdaxctl.so.1 => not find
libvdeplug.so.2 => not find
libpmem.so.1 => not find
libaio.so.1 => not find
$ sudo apt install libdaxctl-dev libvdeplug-dev libpmem-dev libaio-dev
$ ./bin/qemu-system-cskyv2 --version
QEMU emulator version 6.0.94
Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers

2. 下载工具链

  1. 同样在平头哥社区,点击工具工具链-800系列V3.10.29下载(csky-linux-gnuabiv2-tools-x86_64-glibc-linux-4.9.56-20210423),我运行环境是Ubuntu20 64位系统,下载上述工具链解压即可,可选择将bin目录加入环境变量。
    Qemu(1) --- Ubuntu下运行CK860 Qemu_第2张图片
  2. 执行工具链可以正常运行。
$ ./bin/csky-abiv2-linux-gcc -v
...
gcc version 6.3.0 (T-HEAD C-SKY Tools V3.10.29 Glibc-2.28.9000 Linux-4.9.56 abiv2 B20210423)
  1. 静态编译一个HelloWorld程序,然后使用qemu-cskyv2程序执行。

main.c

#include 

int main(void)
{
	printf("Hello World!!!\n");
	return 0;
}

编译执行

$ csky-abiv2-linux-gcc main.c -static
$ qemu-cskyv2 a.out
Hello World!!!

3.下载内核镜像和根文件系统

  1. 在平头哥社区点击OSLinux下载(Linux buildroot release),这个文档中记录了GitHub的下载连接。
    Qemu(1) --- Ubuntu下运行CK860 Qemu_第3张图片
  2. 可以从GitHub上下载到buildroot,点击这里查看发布的版本,我下载的是c860 linux-5.10。下图中可以先下载readme.txt Image.xz rootfs.ext2.xz三个文件,将后两个压缩包解压出来,得到Imagerootfs.ext2两个文件。
    Qemu(1) --- Ubuntu下运行CK860 Qemu_第4张图片
  3. 根据readme.txt中的描述,尝试将内核在qemu中跑起来。
qemu-system-cskyv2 -M virt -cpu c860v -kernel Image -nographic -append "console=ttyS0,115200 rdinit=/sbin/init rootwait root=/dev/vda ro" -drive file=rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -smp 4
  1. 进入qemu linux后,想退出qemu可使用快捷键 ctrl + a放开后,再按下x。需注意这相当于强制关机,若此前有写文件操作,请先在qemu linux下执行sync命令,刷新完所有缓冲区再强制关机。

4. 网络和共享目录

qemu提供了模拟器和主机的网络通信和文件共享服务,仅需要增加一些启动参数即可,最终我使用的启动参数如下。

  1. 创建网络设备需要管理员权限,所以使用sudo启动;
  2. qemu-system-cskyv2不在sudo的搜索路径中,这里使用了绝对路径,/opt/bin/qemu-system-cskyv2是一个软连接指向qemu-system-cskyv2的绝对路径;
  3. /home/xflm/workspace/csky/qemu/share是我创建的用于主机和qemu共享的文件夹。
#/bin/bash
sudo /opt/bin/qemu-system-cskyv2 \
-M virt \
-cpu c860v \
-m 1G \
-kernel Image \
-append "console=ttyS0,115200 rdinit=/sbin/init rootwait root=/dev/vda ro" \
-drive file=rootfs.ext2,format=raw,id=hd0 \
-device virtio-blk-device,drive=hd0 \
-smp 4 \
-fsdev local,security_model=passthrough,id=fsdev0,path=/home/xflm/workspace/csky/qemu/share \
-device virtio-9p-device,id=fs0,fsdev=fsdev0,mount_tag=hostshare \
-netdev tap,script=no,id=net0 \
-device virtio-net-device,netdev=net0 \
-nographic

使用上述参数启动后,需要在qemu linux中执行如下命令,用于挂载共享目录和设置网络IP。

mount -t 9p -o trans=virtio,version=9p2000.L hostshare /root/share
ifconfig eth0 192.168.101.201

然后需要在主机上执行如下命令,设置主机TAP网卡的IP,此步需要管理员权限。

sudo ifconfig tap0 192.168.101.200

此时,主机和qemu linux可相互ping通,并且共享文件夹也访问正常。

5. 启用VNC

下面这个命令可以启用VNC连接,然目前使用存在问题,暂不深究。

  1. -vnc :5,表示VNC的连接端口为5905,IP是主机的IP地址;
  2. -k /opt/xuantie-qemu/share/qemu/keymaps/en-us这个不加的话会提示找不到键盘布局en-uscould not read keymap file: 'en-us'
#/bin/bash
sudo /opt/bin/qemu-system-cskyv2 \
-M virt \
-cpu c860v \
-m 1G \
-kernel Image \
-append "console=ttyS0,115200 rdinit=/sbin/init rootwait root=/dev/vda ro" \
-drive file=rootfs.ext2,format=raw,id=hd0 \
-device virtio-blk-device,drive=hd0 \
-smp 4 \
-fsdev local,security_model=passthrough,id=fsdev0,path=/home/xflm/workspace/csky/qemu/share \
-device virtio-9p-device,id=fs0,fsdev=fsdev0,mount_tag=hostshare \
-netdev tap,script=no,id=net0 \
-device virtio-net-device,netdev=net0 \
-vnc :5 \
-k /opt/xuantie-qemu/share/qemu/keymaps/en-us

5. 参考

在qemu环境中模拟Fedora并构建riscv-gnu-toolchain
qemu中使用 9p virtio, 支持 host 和 guest 中共享目录
qemu-system-x86_64命令总结
Could not read keymap file: ‘en-us’ KVM error

你可能感兴趣的:(linux,嵌入式硬件)