博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用Qemu运行/调试arm linux【转】
阅读量:6103 次
发布时间:2019-06-20

本文共 7234 字,大约阅读时间需要 24 分钟。

转自:

用Qemu运行/调试arm linux,这事情干过好几次了,久了就忘记了,每次都要重新去查资料,浪费不少时间。这次把整个过程弄成个脚本,放到github上,需要是拿下来运行一下即可,方便自己也方便有需要的朋友。这里解释一下脚本的内容(运行系统Ubuntu 16.04 LTS):1. 设置一些环境变量,可以根据自己需要修改。export ARCH=armexport MACHINE=vexpressexport TARGET=arm-linuxexport GDB_VERSION=8.0export KERNEL_VERSION=4.4.1export BUSYBOX_VERSION=1.25.1export 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. 下载并解压busyboxfunction 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. 编译busyboxfunction build_busybox() {  echo "build_busybox..."  cd busybox-${BUSYBOX_VERSION}  make defconfig  make CROSS_COMPILE=${CROSS_COMPILE}  make install CROSS_COMPILE=${CROSS_COMPILE}  cd -}8. 制作rootfsfunction 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. 下载并解压gdbfunction 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. 编译gdbfunction 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}buildecho "Done"github还包括其它一些脚本和使用说明,一并放在https://github.com/xianjimli/qemu-arm-linux上。参考资料(非常感谢)http://files.meetup.com/1590495/debugging-with-qemu.pdfhttp://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=armexport MACHINE=vexpressexport TARGET=arm-linuxexport GDB_VERSION=8.0export KERNEL_VERSION=4.4.1export BUSYBOX_VERSION=1.25.1export 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}buildecho "Done"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

github

还包括其它一些脚本和使用说明,一并放在上。

参考资料(非常感谢)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/absurd/article/details/78984244

转载于:https://www.cnblogs.com/sky-heaven/p/8886659.html

你可能感兴趣的文章
Groonga 3.0.8 发布,全文搜索引擎
查看>>
PC-BSD 9.2 发布,基于 FreeBSD 9.2
查看>>
网卡驱动程序之框架(一)
查看>>
css斜线
查看>>
Windows phone 8 学习笔记(3) 通信
查看>>
重新想象 Windows 8 Store Apps (18) - 绘图: Shape, Path, Stroke, Brush
查看>>
Revit API找到风管穿过的墙(当前文档和链接文档)
查看>>
Scroll Depth – 衡量页面滚动的 Google 分析插件
查看>>
Windows 8.1 应用再出发 - 视图状态的更新
查看>>
自己制作交叉编译工具链
查看>>
Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
查看>>
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
深入浅出NodeJS——数据通信,NET模块运行机制
查看>>
onInterceptTouchEvent和onTouchEvent调用时序
查看>>
android防止内存溢出浅析
查看>>
4.3.3版本之引擎bug
查看>>
SQL Server表分区详解
查看>>
使用FMDB最新v2.3版本教程
查看>>
SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器
查看>>
STM32启动过程--启动文件--分析
查看>>