使用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文件,为免迷路,敬请关注我,你的鼓励是我地动力。