zoukankan      html  css  js  c++  java
  • 用Qemu运行/调试arm linux【转】

    转自:https://blog.csdn.net/absurd/article/details/78984244

    用Qemu运行/调试arm linux,这事情干过好几次了,久了就忘记了,每次都要重新去查资料,浪费不少时间。这次把整个过程弄成个脚本,放到github上,需要是拿下来运行一下即可,方便自己也方便有需要的朋友。这里解释一下脚本的内容(运行系统Ubuntu 16.04 LTS):
    
    1. 设置一些环境变量,可以根据自己需要修改。
    export ARCH=arm
    export MACHINE=vexpress
    export TARGET=arm-linux
    export GDB_VERSION=8.0
    export KERNEL_VERSION=4.4.1
    export BUSYBOX_VERSION=1.25.1
    export CROSS_COMPILE=arm-linux-gnueabihf-
    
    2. 安装工具链等软件包
    function prepare() {
      apt-get -y install qemu gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libexpat1-dev libncurses5-dev
    }
    
    3. 下载Linux内核并解压
    function download_linux() {
      if [ -e linux-${KERNEL_VERSION}.tar.xz ]
      then
        echo linux-${KERNEL_VERSION}.tar.xz exist
      else
        wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-${KERNEL_VERSION}.tar.xz
      fi
    
      if [ -e linux-${KERNEL_VERSION} ]
      then
        echo linux-${KERNEL_VERSION} exist
      else
        tar xf linux-${KERNEL_VERSION}.tar.xz
      fi
    }
    
    4. 编译Linux内核
    function build_linux() {
      echo "build_linux ..."
      cd linux-${KERNEL_VERSION}
      make ${MACHINE}_defconfig
      make zImage -j8
      make modules -j8
      make dtbs
      cd -
    }
    
    5. 拷贝内核到独立目录
    function copy_linux() {
      rm -rf arm-linux-kernel
      mkdir arm-linux-kernel
      cp -fv linux-${KERNEL_VERSION}/arch/arm/boot/zImage arm-linux-kernel/
      cp -fv linux-${KERNEL_VERSION}/arch/arm/boot/dts/*ca9.dtb arm-linux-kernel/
      cp -fv linux-${KERNEL_VERSION}/.config  arm-linux-kernel/
    }
    
    6. 下载并解压busybox
    function download_busybox() {
      if [ -e busybox-${BUSYBOX_VERSION}.tar.bz2 ]
      then
        echo busybox-${BUSYBOX_VERSION}.tar.bz2 exist
      else
        wget https://busybox.net/downloads/busybox-${BUSYBOX_VERSION}.tar.bz2
      fi
    
      if [ -e busybox-${BUSYBOX_VERSION} ]
      then
        echo busybox-${BUSYBOX_VERSION} exist
      else
        tar xf busybox-${BUSYBOX_VERSION}.tar.bz2
      fi
    }
    
    7. 编译busybox
    function build_busybox() {
      echo "build_busybox..."
      cd busybox-${BUSYBOX_VERSION}
      make defconfig
      make CROSS_COMPILE=${CROSS_COMPILE}
      make install CROSS_COMPILE=${CROSS_COMPILE}
      cd -
    }
    
    8. 制作rootfs
    function make_rootfs() {
     rm -rf tmpdir
     rm -rf rootfs
     mkdir -p rootfs/lib
     mkdir -p rootfs/dev
    
     cp -Pvf /usr/arm-linux-gnueabihf/lib/* rootfs/lib
     cp busybox-${BUSYBOX_VERSION}/_install/* rootfs/ -rf
    
     dd if=/dev/zero of=rootfs.ext3 bs=1M count=128
     mkfs.ext3 rootfs.ext3
    
     mkdir tmpdir
     mount -t ext3 rootfs.ext3 tmpdir/ -o loop
     cp -r rootfs/*  tmpdir/
     mknod tmpdir/dev/tty1 c 4 1
     mknod tmpdir/dev/tty2 c 4 2
     mknod tmpdir/dev/tty3 c 4 3
     mknod tmpdir/dev/tty4 c 4 4
     umount tmpdir
    }
    
    9. 下载并解压gdb
    function download_gdb() {
      if [ -e gdb-${GDB_VERSION}.tar.gz ]
      then
        echo gdb-${GDB_VERSION}.tar.gz exist
      else
        wget http://ftp.gnu.org/gnu/gdb/gdb-${GDB_VERSION}.tar.gz
      fi
    
      if [ -e gdb-${GDB_VERSION} ]
      then
        echo gdb-${GDB_VERSION} exist
      else
        tar xf gdb-${GDB_VERSION}.tar.gz
      fi
    }
    
    10. 编译gdb
    function build_gdb() {
      echo "build_gdb..."
      cd gdb-${GDB_VERSION}
      ./configure --target=${TARGET} --enable-sim --prefix=/usr/local/
      make
      cp -fv gdb-${GDB_VERSION}/gdb/gdb /usr/local/bin/arm-linux-gdb
      cd -
    }
    
    11. 生成gdb启动脚本
    function gen_gdb_init() {
      echo "file linux-${KERNEL_VERSION}/vmlinux" >gdbinit
      echo "dir linux-${KERNEL_VERSION}" >>gdbinit
      echo "target remote :1234" >>gdbinit
    }
    
    12. 汇总
    function build() {
      prepare
      download_linux
      build_linux
      copy_linux
      download_busybox
      build_busybox
      make_rootfs
      download_gdb
      build_gdb
      gen_gdb_init
    }
    
    build
    
    echo "Done"
    
    github
    还包括其它一些脚本和使用说明,一并放在https://github.com/xianjimli/qemu-arm-linux上。
    
    参考资料(非常感谢)
    http://files.meetup.com/1590495/debugging-with-qemu.pdf
    http://blog.csdn.net/nxcxl88/article/details/53244754
    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/absurd/article/details/78984244

    用Qemu运行/调试arm linux,这事情干过好几次了,久了就忘记了,每次都要重新去查资料,浪费不少时间。这次把整个过程弄成个脚本,放到github上,需要是拿下来运行一下即可,方便自己也方便有需要的朋友。这里解释一下脚本的内容(运行系统Ubuntu 16.04 LTS):

    1. 设置一些环境变量,可以根据自己需要修改。

    export ARCH=arm
    export MACHINE=vexpress
    export TARGET=arm-linux
    export GDB_VERSION=8.0
    export KERNEL_VERSION=4.4.1
    export BUSYBOX_VERSION=1.25.1
    export CROSS_COMPILE=arm-linux-gnueabihf-
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2. 安装工具链等软件包

    function prepare() {
      apt-get -y install qemu gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libexpat1-dev libncurses5-dev
    }
    • 1
    • 2
    • 3

    3. 下载Linux内核并解压

    function download_linux() {
      if [ -e linux-${KERNEL_VERSION}.tar.xz ]
      then
        echo linux-${KERNEL_VERSION}.tar.xz exist
      else
        wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-${KERNEL_VERSION}.tar.xz
      fi
    
      if [ -e linux-${KERNEL_VERSION} ]
      then
        echo linux-${KERNEL_VERSION} exist
      else
        tar xf linux-${KERNEL_VERSION}.tar.xz
      fi
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4. 编译Linux内核

    function build_linux() {
      echo "build_linux ..."
      cd linux-${KERNEL_VERSION}
      make ${MACHINE}_defconfig
      make zImage -j8
      make modules -j8
      make dtbs
      cd -
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5. 拷贝内核到独立目录

    function copy_linux() {
      rm -rf arm-linux-kernel
      mkdir arm-linux-kernel
      cp -fv linux-${KERNEL_VERSION}/arch/arm/boot/zImage arm-linux-kernel/
      cp -fv linux-${KERNEL_VERSION}/arch/arm/boot/dts/*ca9.dtb arm-linux-kernel/
      cp -fv linux-${KERNEL_VERSION}/.config  arm-linux-kernel/
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    6. 下载并解压busybox

    function download_busybox() {
      if [ -e busybox-${BUSYBOX_VERSION}.tar.bz2 ]
      then
        echo busybox-${BUSYBOX_VERSION}.tar.bz2 exist
      else
        wget https://busybox.net/downloads/busybox-${BUSYBOX_VERSION}.tar.bz2
      fi
    
      if [ -e busybox-${BUSYBOX_VERSION} ]
      then
        echo busybox-${BUSYBOX_VERSION} exist
      else
        tar xf busybox-${BUSYBOX_VERSION}.tar.bz2
      fi
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    7. 编译busybox

    function build_busybox() {
      echo "build_busybox..."
      cd busybox-${BUSYBOX_VERSION}
      make defconfig
      make CROSS_COMPILE=${CROSS_COMPILE}
      make install CROSS_COMPILE=${CROSS_COMPILE}
      cd -
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    8. 制作rootfs

    function make_rootfs() {
     rm -rf tmpdir
     rm -rf rootfs
     mkdir -p rootfs/lib
     mkdir -p rootfs/dev
    
     cp -Pvf /usr/arm-linux-gnueabihf/lib/* rootfs/lib
     cp busybox-${BUSYBOX_VERSION}/_install/* rootfs/ -rf
    
     dd if=/dev/zero of=rootfs.ext3 bs=1M count=128
     mkfs.ext3 rootfs.ext3
    
     mkdir tmpdir
     mount -t ext3 rootfs.ext3 tmpdir/ -o loop
     cp -r rootfs/*  tmpdir/
     mknod tmpdir/dev/tty1 c 4 1
     mknod tmpdir/dev/tty2 c 4 2
     mknod tmpdir/dev/tty3 c 4 3
     mknod tmpdir/dev/tty4 c 4 4
     umount tmpdir
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    9. 下载并解压gdb

    function download_gdb() {
      if [ -e gdb-${GDB_VERSION}.tar.gz ]
      then
        echo gdb-${GDB_VERSION}.tar.gz exist
      else
        wget http://ftp.gnu.org/gnu/gdb/gdb-${GDB_VERSION}.tar.gz
      fi
    
      if [ -e gdb-${GDB_VERSION} ]
      then
        echo gdb-${GDB_VERSION} exist
      else
        tar xf gdb-${GDB_VERSION}.tar.gz
      fi
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    10. 编译gdb

    function build_gdb() {
      echo "build_gdb..."
      cd gdb-${GDB_VERSION}
      ./configure --target=${TARGET} --enable-sim --prefix=/usr/local/
      make
      cp -fv gdb-${GDB_VERSION}/gdb/gdb /usr/local/bin/arm-linux-gdb
      cd -
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    11. 生成gdb启动脚本

    function gen_gdb_init() {
      echo "file linux-${KERNEL_VERSION}/vmlinux" >gdbinit
      echo "dir linux-${KERNEL_VERSION}" >>gdbinit
      echo "target remote :1234" >>gdbinit
    }
    • 1
    • 2
    • 3
    • 4
    • 5

    12. 汇总

    function build() {
      prepare
      download_linux
      build_linux
      copy_linux
      download_busybox
      build_busybox
      make_rootfs
      download_gdb
      build_gdb
      gen_gdb_init
    }
    
    build
    
    echo "Done"
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    github

    还包括其它一些脚本和使用说明,一并放在https://github.com/xianjimli/qemu-arm-linux上。

    参考资料(非常感谢)

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/absurd/article/details/78984244
  • 相关阅读:
    bzoj3622: 已经没有什么好害怕的了
    BSGS
    LOJ#2320 生成树计数
    ??? cliquers
    生成函数
    洛谷P5206 数树
    01分数规划
    差分约束系统
    51nod1238 最小公倍数之和 V3
    51nod1237 最大公约数之和 V3
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/8886659.html
Copyright © 2011-2022 走看看