1. 程式人生 > >qemu模擬vexpress-a9及u-boot引導 linux

qemu模擬vexpress-a9及u-boot引導 linux

brctl data ket netd pre dong busybox 網絡 vsftpd

前言

本文講述使用 qemu 來模擬 vexpress-a9 開發板 ,同時介紹使用 u-boot 引導 linux 的流程。整個坐下來對 qemuu-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