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

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

. 设置一些环境变量,可以根据自己需要修改。
export ARCH=arm
export MACHINE=vexpress
export TARGET=arm-linux
export GDB_VERSION=8.0
export KERNEL_VERSION=4.4.
export BUSYBOX_VERSION=1.25.
export CROSS_COMPILE=arm-linux-gnueabihf- . 安装工具链等软件包
function prepare() {
apt-get -y install qemu gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libexpat1-dev libncurses5-dev
} . 下载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
} . 编译Linux内核
function build_linux() {
echo "build_linux ..."
cd linux-${KERNEL_VERSION}
make ${MACHINE}_defconfig
make zImage -j8
make modules -j8
make dtbs
cd -
} . 拷贝内核到独立目录
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

用Qemu运行/调试arm linux【转】的更多相关文章

  1. 如何在linux主机上运行/调试 arm/mips架构的binary

    如何在linux主机上运行/调试 arm/mips架构的binary 原文链接M4x@10.0.0.55 本文中用于展示的binary分别来自Jarvis OJ上pwn的add,typo两道题 写这篇 ...

  2. 在QEMU中调试ARM程序【转】

    转自:http://linuxeden.com/html/develop/20100820/104409.html 最近我想调试一个运行在QEMU模拟ARM系统中的Linux程序.我碰到过一些麻烦,因 ...

  3. 如何为运行的 ARM Linux 启用 LAD2.3 版本的诊断扩展

    Linux Azure Diagnostic (LAD) 扩展现在已经发布了 3.0 版本,但在 Azure 中国区,目前可用的最新版本还是 2.3. 虽然 Azure 门户提供了简单的操作版本为 L ...

  4. ubuntu: qemu+gdb 调试linux kernel 学习笔记

    声明: 本笔记内容并非本人原创,90%来自网络资料的整合.同时,由于自己是刚刚接触qemu & gdbserver remote debug,本文也就算不得教程,仅供有缘人参考而已. ---- ...

  5. 【Linux开发】CCS远程调试ARM,AM4378

    注意一点:CCS也是安装在Linux主机上的,不是安装在Windows上的,我在Windows上做出了很多尝试,但最终也不没明白究竟要用怎样的格式去执行在ARM-Linux应用程序,out文件ELF可 ...

  6. 编译aarch64 Linux内核并基于qemu运行

    核心流程 首先,本文主要讲述如何编译Linux内核并在qemu虚拟机上运行.这里针对的架构是aarch64. 本文的实验平台是Ubuntu 16.04. 为了达成目标,我们需要有qemu.buildr ...

  7. 编译x86_64 Linux内核并基于QEMU运行

    编译并运行内核镜像 安装包准备 $ sudo apt install git $ sudo apt install build-essential kernel-package fakeroot li ...

  8. golang 2行代码在基于arm linux的树莓派、orangepi上运行http web服务

    go语言(golang)简化了跨平台交叉编译步骤,支持在windows系统下交叉编译基于arm+linux平台的应用,运行时无需其它依赖库.以下以一个简单的http server为例,先上源码: ** ...

  9. How to build and run ARM Linux on QEMU from scratch

    This blog shows how to run ARM Linux on QEMU! This can be used as a base for later projects using th ...

随机推荐

  1. Mybatis-select-返回值类型错误理解

    Mybatis :Cause: java.lang.UnsupportedOperationException异常: 今天在写一个练手项目,作为初学Mybatis的小白,想着这里findByEmp_i ...

  2. 20170222==(MODBUS读取多个寄存器)

    MODBUS读取多个寄存器(功能码04) 为了简单我这里只用4个寄存器,当让你也可以用125个寄存器,但是最多也只能用125个寄存器的.每个寄存器有上面的表知道为一个字的大小即2个字节或者叫16比特位 ...

  3. Java 持久化操作之 --io流与序列化

    1)File类操作文件的属性 1.File类的常用方法 1. 文件的绝对完整路径:getAbsolutePath() 文件名:getName() 文件相对路径:getPath() 文件的上一级目录:g ...

  4. AngularJS1.X学习笔记10-自定义指令(下)

    继续继续,学完这个部分就去吃饭.引用自由男人的话作为本文的开始:“默认情况下,链接函数被传入了控制器的作用域,而该控制器管理着的视图包含了指令所应用到的元素”.果然像是绕口令,还是看看你的例子比较好. ...

  5. vue项目中的常见问题

    总结了几个vue项目开发过程中遇到的常见问题,希望大家注意. 注:文末有福利! 一.样式问题 1.vue中使用less 安装less依赖 npm install less less-loader -- ...

  6. JMeter入门(01)概念和样例

    一.概念 JMeter 是一款专门用于功能测试和压力测试的轻量级测试开发平台,实现了许多和互联网相关的网络测试组件,同时还保留着很强的扩展性. JMeter可以用来测试诸如:静态文件,Java Ser ...

  7. HTTP头HOST

    http request header 中的host行的作用 在早期的Http 1.0版中,Http 的request请求头中是不带host行的,在Http 1.0的加强版和Http 1.1中加入了h ...

  8. linux下mongodb安装、服务器、客户端、备份、账户命令

    在linux环境安装mongoDB: 一般认为偶数版本为稳定版 如 1.6.x,奇数版本为开发版如1.7.x 32bit的mongoDB最大能存放2g的数据,64bit没有限制 方法1: 终端执行: ...

  9. Java:逐行读、写文件、文件目录过滤的用法

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.I ...

  10. hdu3342-判断有向图中是否存在(至少)3元环或回路-拓扑排序

    一:题目大意:   给你一个关系图,判断是否合法,    每个人都有师父和徒弟,可以有很多个:  不合法:  1) . 互为师徒:(有回路)  2) .你的师父是你徒弟的徒弟,或者说你的徒弟是你师父的 ...