qemu模拟vexpress-a9及u-boot引导 linux
前言
本文讲述使用 qemu
来模拟 vexpress-a9
开发板 ,同时介绍使用 u-boot
引导 linux
的流程。整个坐下来对 qemu
和 u-boot
以及嵌入式 linux
的工作方式有了一个大致的了解
qemu基础
这里介绍使用 tap 进行网络互连的方式
首先安装一些配置网络的工具
apt-get install bridge-utils # 虚拟网桥工具
apt-get install uml-utilities # UML(User-mode linux)工具
主要介绍几个命令
增加一个虚拟网桥 br0
brctl addbr br0
创建一个tap0接口,只允许root 用户访问
tunctl -t tap0 -u root
在虚拟网桥中增加一个tap0 接口
brctl addif br0 tap0
设置 tap0 口的地址
sudo ifconfig tap0 192.168.1.111
详细请看
https://blog.csdn.net/zhaihaifei/article/details/58624063
编译 linux 内核
首先安装交叉编译工具链
sudo apt-get install gcc-arm-linux-gnueabi
编译内核( 使用 3.12.54
版本的内核,开始用的 4.x
貌似太新了加载不起来)
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_defconfig
make zImage
make modules
make dtbs
然后就会在 arch/arm/boot 目录下生成 zImage 文件
这时可以试着运行一下
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"
如果出现
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 目录下执行
make menuconfig
设置静态编译已及交叉编译工具链
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
(arm-linux-gnueabi-) Cross Compiler prefix
然后编译
make
make install
然后走到 busybox
的上级目录,执行一个脚本
#!/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
目录中的文件http://t.cn/R3IOFVM
首先把它解压,再执行上述脚本
然后就会在当前目录生成一个 a9rootfs.ext3 的文件系统。
加上文件系统运行一波
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 了。
参考
http://www.cnblogs.com/pengdonglin137/p/5023342.html
编译 u-boot
首先下载好 u-boot (用的版本 u-boot-2016.05),然后进入 u-boot 的目录编译
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_ca9x4_defconfig
make
然后引导一下 u-boot
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
如果成功的话,就会出现下面的。
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
=>
参考
https://blog.csdn.net/aggresss/article/details/54945726
安装 tftpd
这里打算使用 u-boot 通过 tftp 引导 linux 内核,所以先在 ubuntu 上安装好 tftpd.
apt install vsftpd
然后修改 tftpd 的配置文件
sudo vim /etc/vsftpd.conf
主要修改两个
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 的配置文件
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 的服务即可
sudo service xinetd restart
u-boot 引导 linux
要用 u-boot 引导 linux , 首先要把 linux 编译 uImage 镜像
export ARCH=arm
export LOADADDR=0x60003000
export CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_defconfig
make uImage
首先进入 u-boot
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
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
setenv ipaddr 192.168.1.120
setenv serverip 192.168.1.111
然后加载镜像到内存
tftp 0x60003000 uImage
最后引导
setenv bootargs 'root=/dev/mmcblk0 console=ttyAMA0'
bootm 0x60003000
然后就 ok
了
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
参考
http://www.cnblogs.com/pengdonglin137/p/5023704.html
qemu模拟vexpress-a9及u-boot引导 linux的更多相关文章
- 用QEMU模拟运行uboot从SD卡启动Linux
平台:Qemu + vexpress-a9 u-boot:u-boot-2019.10 Linux:linux-4.14.13 之前介绍过用Qemu模拟运行uboot,然后从网络启动lin ...
- 用Qemu模拟vexpress-a9 (五) --- u-boot引导kernel,device tree的使用
环境介绍 Win7 64 + Vmware 11 + ubuntu14.04 32 u-boot 版本:u-boot-2015-04 Linux kernel版本:linux-3.16.y busyb ...
- 用Qemu模拟vexpress-a9 (四) --- u-boot引导kernel,用nfs挂载根文件系统
环境介绍 Win7 64 + Vmware 11 + ubuntu14.04 32 u-boot 版本:u-boot-2015-04 Linux kernel版本:linux-3.16.y busyb ...
- CentOS 7 利用qemu模拟ARM vexpress A9开发板
听说qemu用于仿真arm很不错,今日就来试了一把.由于刚刚开始,了解的并不多.本文仅仅记录Qemu装载Linux kernel和busybox根文件系统的过程.后续将会深入了解仿真的其他内容. 先上 ...
- 以Qemu模拟Linux,学习Linux内核
文章名称:以Qemu模拟Linux,学习Linux内核作 者:five_cent文章地址:http://www.cnblogs.com/senix/archive/2013/02/21/29 ...
- 用Qemu模拟vexpress-a9 (一) --- 搭建Linux kernel调试环境【转】
转自:http://www.cnblogs.com/pengdonglin137/p/5023342.html#_label2 阅读目录(Content) 环境介绍: 下载Linux内核 安装arm的 ...
- 用Qemu模拟vexpress-a9 (一) --- 搭建Linux kernel调试环境
参考: http://blog.csdn.net/linyt/article/details/42504975 环境介绍: Win7 64 + Vmware 11 + ubuntu14.04 32 u ...
- qemu 模拟-arm-mini2440开发板-启动u-boot,kernel和nfs文件系统
qemu 本文介绍了如何编译u-boot.linux kernel,然后用qemu启动u-boot和linux kernel,达到与开发板上一样的学习效果! 虽然已经买了2440开发板,但是在实际学习 ...
- 利用qemu模拟嵌入式系统制作全过程
http://www.tinylab.org/using-qemu-simulation-inserts-the-type-system-to-produce-the-whole-process/ 利 ...
随机推荐
- MySQL多实例(二)
一.多实例MySQL数据库原理 1.1:原理图 1.2:多实例原理(什么是多实例) 简单来说MySQL多实例就是在一台服务器上同时开启多个不用的服务端口(如:3306.3307),同时运行多个MySQ ...
- POJ 1169
#include<iostream> #include<algorithm> #include<vector> #include<set> #defin ...
- Vim实用技巧系列 - 代码注释
在写代码时候,有时候需要临时注释掉一部分代码,之后还要取消这些注释.真麻烦.那么,用Vim怎么做这件事呢? 第一种方法,块模式. 再次声明,本系列全部以windows下 ...
- C++ STL 初探
学过C++的人肯定会很熟悉STL标准模板库,STL其实就是封装了一系列的接口,供我们调用.很多函数或者算法的实现不需要我们从头开始写,大大提高我们的编程效率.这篇博客在简单介绍STL的情况下,会详细的 ...
- Java之IO(十四)IO包中其它类
转载请注明出处:http://www.cnblogs.com/lighten/p/7267553.html 1.前言 此章介绍IO包中剩余未介绍的几个流和工具类,包括LineNumberReader. ...
- Linux 删除文件夹和文件的命令(转载)
Linux 删除文件夹和文件的命令 听语音 | 浏览:93339 | 更新:2013-05-02 18:40 | 标签:linux 文件夹 linux删除目录很简单,很多人还是习惯用rmdir,不过一 ...
- javac后期需要重点阅读的类
(1)Annotate (300行) Enter annotations on symbols. Annotations accumulate in a queue,which is processe ...
- DC综合及仿真验证和DFT测试
综合技术是提高设计产能的一个很重要的技术,没有综合技术的发展就不可能用HDL实现电路的设计,因为HDL开始是用来供电路仿真建模使用的,到了后来才把其中一部分子集作为可综合的语言,也就是R ...
- Java 国际化
国际化英文单词为:Internationalization,又称I18N,I为因为单词的第一个字母,18为这个单词的长度,而N代表这个单词的最后一个字母.国际化又称本地化(Localization,L ...
- 回溯法求解n皇后和迷宫问题
回溯法是一种搜索算法,从某一起点出发按一定规则探索,当试探不符合条件时则返回上一步重新探索,直到搜索出所求的路径. 回溯法所求的解可以看做解向量(n皇后坐标组成的向量,迷宫路径点组成的向量等),所有解 ...