前言
本文讲述使用 qemu
来模拟 vexpress-a9
开发板 ,同时介绍使用 u-boot
引导 linux
的流程。整个坐下来对 qemu
和 u-boot
以及嵌入式 linux
的工作方式有了一个大致的了解
qemu基础
这里介绍使用 tap 进行网络互连的方式
首先安装一些配置网络的工具
1 2
| apt-get install bridge-utils # 虚拟网桥工具 apt-get install uml-utilities # UML(User-mode linux)工具
|
主要介绍几个命令
增加一个虚拟网桥 br0
创建一个tap0接口,只允许root 用户访问
在虚拟网桥中增加一个tap0 接口
设置 tap0 口的地址
1
| sudo ifconfig tap0 192.168.1.111
|
详细请看
1
| https://blog.csdn.net/zhaihaifei/article/details/58624063
|
编译 linux 内核
首先安装交叉编译工具链
1
| sudo apt-get install gcc-arm-linux-gnueabi
|
编译内核( 使用 3.12.54
版本的内核,开始用的 4.x
貌似太新了加载不起来)
1 2 3 4 5 6
| export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabi- make vexpress_defconfig make zImage make modules make dtbs
|
然后就会在 arch/arm/boot 目录下生成 zImage 文件
这时可以试着运行一下
1 2 3 4 5 6
| sudo qemu-system-arm \ -M vexpress-a9 \ -m 512M \ -kernel /home/haclh/vmdk/linux-3.12.54/arch/arm/boot/zImage \ -nographic \ -append "console=ttyAMA0"
|
如果出现
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| input: ImExPS/2 Generic Explorer Mouse as /devices/mb:kmi1/serio1/input/input2 VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6 Please append a correct "root=" boot option; here are the available partitions: Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.12.54 #1 [<8001535c>] (unwind_backtrace+0x0/0xec) from [<80011ad0>] (show_stack+0x10/0x14) [<80011ad0>] (show_stack+0x10/0x14) from [<8037d680>] (dump_stack+0x74/0x84) [<8037d680>] (dump_stack+0x74/0x84) from [<8037b7c4>] (panic+0x9c/0x1dc) [<8037b7c4>] (panic+0x9c/0x1dc) from [<804a2110>] (mount_block_root+0x1e0/0x274) [<804a2110>] (mount_block_root+0x1e0/0x274) from [<804a22b4>] (mount_root+0x110/0x118) [<804a22b4>] (mount_root+0x110/0x118) from [<804a240c>] (prepare_namespace+0x150/0x188) [<804a240c>] (prepare_namespace+0x150/0x188) from [<804a1d00>] (kernel_init_freeable+0x21c/0x22c) [<804a1d00>] (kernel_init_freeable+0x21c/0x22c) from [<80379e40>] (kernel_init+0x8/0x13c) [<80379e40>] (kernel_init+0x8/0x13c) from [<8000e280>] (ret_from_fork+0x14/0x34)
|
表示内核已经编译完成,下一步构造文件系统。
使用 busybox 构建文件系统
这里用的 1.24 版本的 busybox 。在 busybox 目录下执行
设置静态编译已及交叉编译工具链
1 2 3 4
| Busybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs) (arm-linux-gnueabi-) Cross Compiler prefix
|
然后编译
然后走到 busybox
的上级目录,执行一个脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #!/bin/bash sudo rm -rf rootfs sudo rm -rf tmpfs sudo rm -f a9rootfs.ext3 sudo mkdir rootfs sudo cp busybox/_install/* rootfs/ -raf sudo mkdir -p rootfs/proc/ sudo mkdir -p rootfs/sys/ sudo mkdir -p rootfs/tmp/ sudo mkdir -p rootfs/root/ sudo mkdir -p rootfs/var/ sudo mkdir -p rootfs/mnt/ sudo cp etc rootfs/ -arf sudo cp -arf /usr/arm-linux-gnueabi/lib rootfs/ sudo rm rootfs/lib/*.a sudo arm-linux-gnueabi-strip rootfs/lib/* sudo mkdir -p rootfs/dev/ sudo mknod rootfs/dev/tty1 c 4 1 sudo mknod rootfs/dev/tty2 c 4 2 sudo mknod rootfs/dev/tty3 c 4 3 sudo mknod rootfs/dev/tty4 c 4 4 sudo mknod rootfs/dev/console c 5 1 sudo mknod rootfs/dev/null c 1 3 sudo dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32 sudo mkfs.ext3 a9rootfs.ext3 sudo mkdir -p tmpfs sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop sudo cp -r rootfs/* tmpfs/ sudo umount tmpfs
|
etc
目录中的文件
>
首先把它解压,再执行上述脚本
然后就会在当前目录生成一个 a9rootfs.ext3 的文件系统。
加上文件系统运行一波
1 2 3 4 5 6 7 8
| sudo qemu-system-arm \ -net nic -net tap,ifname=tap0,script=no,downscript=no\ -M vexpress-a9 \ -m 512M \ -kernel /home/haclh/vmdk/linux-3.12.54/arch/arm/boot/zImage \ -nographic \ -append "root=/dev/mmcblk0 console=ttyAMA0" \ -sd /home/haclh/vmdk/a9rootfs.ext3
|
就可以进入 linux 了。
参考
1
| http://www.cnblogs.com/pengdonglin137/p/5023342.html
|
编译 u-boot
首先下载好 u-boot (用的版本 u-boot-2016.05),然后进入 u-boot 的目录编译
1 2 3 4
| export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabi- make vexpress_ca9x4_defconfig make
|
然后引导一下 u-boot
1 2 3 4 5
| sudo qemu-system-arm -M vexpress-a9 \ -kernel /home/haclh/vmdk/LKDemo/u-boot-2016.05/u-boot \ -nographic \ -m 512M \ -net nic -net tap,ifname=tap0,script=no,downscript=no
|
如果成功的话,就会出现下面的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| U-Boot 2016.05 (May 12 2018 - 22:56:24 -0700) DRAM: 512 MiB WARNING: Caches not enabled Flash: 128 MiB MMC: MMC: 0 *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial Net: smc911x-0 Hit any key to stop autoboot: 0 =>
|
参考
1
| https://blog.csdn.net/aggresss/article/details/54945726
|
安装 tftpd
这里打算使用 u-boot 通过 tftp 引导 linux 内核,所以先在 ubuntu 上安装好 tftpd.
然后修改 tftpd 的配置文件
1
| sudo vim /etc/vsftpd.conf
|
主要修改两个
1 2
| anon_root=/home/haclh/vmdk/linux-3.12.54/arch/arm/boot # 增加一项,设置根目录 anonymous_enable=YES #
|
/home/haclh/vmdk/linux-3.12.54/arch/arm/boot 为 linux 内核编译结果目录
然后修改 xinted 的配置文件
1 2 3 4 5 6 7 8 9 10 11 12
| 08:03 haclh@ubuntu:boot $ cat /etc/xinetd.d/tftp service tftp { protocol = udp port = 69 socket_type = dgram wait = yes user = nobody server = /usr/sbin/in.tftpd server_args = -s /home/haclh/vmdk/linux-3.12.54/arch/arm/boot disable = no }
|
然后重启下 xinted 的服务即可
1
| sudo service xinetd restart
|
u-boot 引导 linux
要用 u-boot 引导 linux , 首先要把 linux 编译 uImage 镜像
1 2 3 4 5
| export ARCH=arm export LOADADDR=0x60003000 export CROSS_COMPILE=arm-linux-gnueabi- make vexpress_defconfig make uImage
|
首先进入 u-boot
1 2 3 4 5 6 7
| sudo ifconfig tap0 192.168.1.111 sudo qemu-system-arm -M vexpress-a9 \ -kernel /home/haclh/vmdk/LKDemo/u-boot-2016.05/u-boot \ -nographic \ -m 512M \ -net nic -net tap,ifname=tap0,script=no,downscript=no\ -sd /home/haclh/vmdk/a9rootfs.ext3
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| U-Boot 2016.05 (May 12 2018 - 22:56:24 -0700) DRAM: 512 MiB WARNING: Caches not enabled Flash: 128 MiB MMC: MMC: 0 *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial Net: smc911x-0 Hit any key to stop autoboot: 0 =>
|
然后设置好 ip 以及 宿主机 ip
1 2
| setenv ipaddr 192.168.1.120 setenv serverip 192.168.1.111
|
然后加载镜像到内存
最后引导
1 2
| setenv bootargs 'root=/dev/mmcblk0 console=ttyAMA0' bootm 0x60003000
|
然后就 ok
了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| EXT3-fs (mmcblk0): mounted filesystem with writeback data mode VFS: Mounted root (ext3 filesystem) on device 179:0. Freeing unused kernel memory: 196K (804a1000 - 804d2000) Please press Enter to activate this console. [root@vexpress ]# [root@vexpress ]# [root@vexpress ]# [root@vexpress ]# ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) [root@vexpress ]# ifconfig -a
|
参考
1
| http://www.cnblogs.com/pengdonglin137/p/5023704.html
|
本站文章均原创, 转载注明来源
本文链接:http://blog.hac425.top/2018/05/13/vexpress_a9_qemu_uboot_linux.html