当前位置: 首页 > news >正文

用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上。

参考资料(非常感谢)

  • 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

相关文章:

  • OpenCV 2.4+ C++ SVM文字识别
  • 深入剖析 iOS 性能优化
  • AIX学习之—存储管理(LVM)
  • KEUC首次落地中国,网易云深度剖析Kubernetes优化与实践
  • 当人工智能遇上区块链,会发生什么?
  • 2012年最受欢迎的PHP框架
  • 高西庆:对区块链加以规范有利于财富公平公正分配
  • Linux(Ubuntu)解决乱码问题
  • Android滑动手势侦测方法介绍
  • Docker容器的自动化监控实现
  • C之多维数组和多维指针(三十一)
  • SOCKET编程进阶之完成端口
  • for循环嵌套绑定事件
  • pyparsing语法解析心得
  • 传统科技企业拥抱还是制造区块链泡沫?
  • [译]CSS 居中(Center)方法大合集
  • ES6 ...操作符
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Java程序员幽默爆笑锦集
  • python docx文档转html页面
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Sass Day-01
  • Spring-boot 启动时碰到的错误
  • 基于 Babel 的 npm 包最小化设置
  • 简单数学运算程序(不定期更新)
  • 问题之ssh中Host key verification failed的解决
  • 我看到的前端
  • 转载:[译] 内容加速黑科技趣谈
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ###项目技术发展史
  • (js)循环条件满足时终止循环
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (WSI分类)WSI分类文献小综述 2024
  • (八十八)VFL语言初步 - 实现布局
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)scrum常见工具列表
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .apk 成为历史!
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net core使用ef 6
  • .NET 反射 Reflect
  • .NET运行机制
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • []FET-430SIM508 研究日志 11.3.31
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [AR Foundation] 人脸检测的流程
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [BZOJ4016][FJOI2014]最短路径树问题
  • [C# 基础知识系列]专题十六:Linq介绍
  • [C#] 如何调用Python脚本程序
  • [c++] 单例模式 + cyberrt TimingWheel 单例分析