使用Qemu模拟Arm处理器,下载第一个Linux驱动到模拟板

上面一篇(使用Qemu模拟Arm处理器,开发第一个Linux驱动程序)讲述了如何编译一个内核驱动,这篇将教大家如何把编译好的驱动ko文件下载到Qemu模拟的arm处理器开发板里面。

咱们在运行all.sh(使用Qemu模拟Arm处理器,运行Linux系统)脚本制作启动镜像时,会创建sde.raw。运行Qemu模拟的Arm处理器时,sde.raw会映射出sd卡(run-nolcd.sh里指定),从文件偏移2048*512字节处开始映射。现在我们要在Qemu模拟Arm处理器之前把ko文件传送到这个sde.raw中,需要把sde.raw挂载到一个目录sde,往sde复制ko文件,然后卸载目录,ko复制到sde.raw中就成功。咱们的sde.raw位于
/home/h/linuxQemuEvb/linux-work/aqemu目录下,先在这个目录创建sde目录,使用mkdir -p sde ,这里-p表示若sde目录存在,就保留原目录,不存在就创建新目录。然后使用mount 指令加上loop选项实现将文件sde.raw挂载到sde目录的效果,同时也指定从2048扇区开始,每扇区512字节。涉及到循环(loop)块设备的操作,需要root权限,所以要使用sudo。

mkdir -p sde
sudo mount -o loop,offset=$((2048*512)) sde.raw sde

使用losetup列出循环块设备,会把sde.raw映射的块设备文件:

h@ub2004:~/linuxQemuEvb/linux-work/aqemu$ losetup
NAME        SIZELIMIT  OFFSET AUTOCLEAR RO BACK-FILE                                        DIO LOG-SEC
/dev/loop1          0       0         1  1 /var/lib/snapd/snaps/core20_2599.snap              0     512
/dev/loop17         0 1048576         1  0 /home/h/linuxQemuEvb/linux-work/aqemu/sde.raw      0     512

咱们再看看loop17的文件特性,第一个字母b表明它是一个块设备文件:

h@ub2004:~/linuxQemuEvb/linux-work/aqemu$ ls -l /dev | grep 17
brw-rw----  1 root    disk      7,  17 7月  30 15:49 loop17

再列出sde目录的内容,文件列表确实是我们在all.sh里创建的根文件系统:

h@ub2004:~/linuxQemuEvb/linux-work/aqemu$ ls -l sde
total 64
drwxr-xr-x 2 root root  4096 7月  16 16:57 bin
drwxr-xr-x 6 root root  4096 7月  16 16:58 dev
drwxr-xr-x 3 root root  4096 7月  16 16:57 etc
-rwxr-xr-x 1 root root 12044 7月  16 16:57 hello
drwxr-xr-x 3 root root  4096 7月  17 14:39 lib
lrwxrwxrwx 1 root root    11 7月  16 16:57 linuxrc -> bin/busybox
drwx------ 2 root root 16384 7月  16 16:57 lost+found
drwxr-xr-x 2 root root  4096 7月  16 16:57 proc
drwxr-xr-x 2 root root  4096 7月  16 16:57 sbin
drwxr-xr-x 3 root root  4096 7月  16 16:57 sys
drwxr-xr-x 2 root root  4096 7月  16 16:57 tmp
drwxr-xr-x 4 root root  4096 7月  16 16:57 usr

既然加载成功了,咱们就可以往这个目录复制ko文件了。我们将文件复制到 lib/modules目录。所以先创建目录,然后复制ko文件。

h@ub2004:~/linuxQemuEvb/linux-work/aqemu$ sudo mkdir -p  sde/lib/modules 
h@ub2004:~/linuxQemuEvb/linux-work/aqemu$ sudo cp ../drivers/hellodriver/hellodriver.ko sde/lib/modules/

这里抛出一个问题,上面指令不使用sudo能成功吗?可以在评论区发表你的看法。

复制完成后,我们需要卸载从 sde.raw 挂载到 sde 目录的文件系统:

h@ub2004:~/linuxQemuEvb/linux-work/aqemu$ sudo umount sde
h@ub2004:~/linuxQemuEvb/linux-work/aqemu$ ls -l sde
total 0

从上面的ls命令输出可以看到,卸载已经成功。这就成功地将hellodriver.ko复制到sde.raw内部了。后面还会讲述如何加载这个ko文件,为免迷路,敬请关注我,你的鼓励是我地动力。