zoukankan      html  css  js  c++  java
  • qemu模拟vexpress-a9及u-boot引导 linux

    前言

    本文讲述使用 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
    
  • 相关阅读:
    两个链表的第一个公共节点(Python and C++解法)
    第一个只出现一次的字符(Python and C++解法)
    丑数(Python and C++解法)
    最长不含重复字符的子字符串(Python and C++解法)
    礼物的最大值(Python and C++解法)
    把数字翻译成字符串(Python and C++解法)
    连续子数组的最大和(Python and C++解法)
    最小的k个数(Python and C++解法)
    数组中出现次数超过一半的数字(Python and C++解法)
    字符串的排列(Python and C++解法)
  • 原文地址:https://www.cnblogs.com/hac425/p/9416690.html
Copyright © 2011-2022 走看看