qemu学习

安装qemu

1
sudo apt-get install qemu libncurses5-dev gcc-arm-linux-gnueabi build-essential bison flex

下载busybox和linux

1
2
wget https://busybox.net/downloads/busybox-1.24.0.tar.bz2
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.0.tar.gz

编译文件系统

配置busybox为静态编译

1
2
3
cd busybox
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-

在出现的界面选中:

1
2
3
Busybox Settings  --->
Build Options --->
Build BusyBox as a static binary (no shared libs)

最后执行编译安装:

1
make install

编译完成后,在busybox根目录下会有一个\_install目录,该目录是编译好的文件系统需要的一些命令集合,将\_install拷贝到linux根目录下

创建其他文件

1
2
3
cd _install
mkdir etc dev mnt
mkdir -p etc/init.d/

添加启动脚本

etc/init.d/目录下添加rcS文件,并添加可执行权限

1
2
3
cd etc/init.d/
touch rcS
chmod +x rcS

rcS中添加以下内容:

1
2
3
4
5
6
7
8
9
mkdir -p /proc
mkdir -p /tmp
mkdir -p /sys
mkdir -p /mnt
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

添加挂在脚本

etc/目录下添加fstab文件,并在其中添加以下内容:

1
2
3
4
5
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
debugfs /sys/kernel/debug debugfs defaults 0 0

添加inittab(作用?)

etc/目录下添加inittab文件,并在其中添加以下内容:

1
2
3
4
::sysinit:/etc/init.d/rcS
::respawn:~/bin/sh
::askfirst:~/bin/sh
::ctrlaltdel:/bin/umount -a -r

添加必要的设备节点

1
2
3
cd /dev/
sudo mknod console c 5 1
sudo mknod null c 1 3

编译内核

1
2
3
4
5
cd linux-4.0
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_defconfig
make menuconfig

选择根文件系统ramdisk

1
2
3
General setup  --->
Initial RAM filesystem and RAM disk (initramfs/initrd) support
(_install) Initramfs source file(s)

清空默认cmd string

1
2
Boot options  --->
() Default kernel command string

注意:menuconfig无法采用退格键删除,需要采用Ctrl+back进行

配置user/kernel 3/1G,并打开高端内存

1
2
3
4
Kernel Features  --->
Memory split (2G/2G user/kernel split) --->
3G/1G user/kernel split
[*] High Memory Support

编译内核和DTB

1
2
make bzImage -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
make dtbs

运行qemu

1
2
cd linux-4.0
qemu-system-arm -M vexpress-a9 -smp 4 -m 1024M -kernel arch/arm/boot/zImage -append "rdinit=/linuxrc console=ttyAMA0 loglevel=8" -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic

关闭qemu

重新开启一个终端,运行如下命令:

1
killall qemu-system-arm

开始调试

安装gdb

对于ubuntu 18.04以前的可以采用如下命令安装:

1
sudo apt-get install gdb-arm-none-eabi

ubuntu 18.04已经采用gdb-multiarch代替

1
2
3
sudo apt-get install gdb-multiarch
cd /usr/bin
sudo ln -s gdb-multiarch arm-none-eabi-gdb

打开kernel debug信息

1
2
3
Kernel hacking  ---> 
Compile-time checks and compiler options --->
[*] Compile the kernel with debug info

qemu启用调试功能

1
2
cd linux-4.0
qemu-system-arm -M vexpress-a9 -smp 4 -m 1024M -kernel arch/arm/boot/zImage -append "rdinit=/linuxrc console=ttyAMA0 loglevel=8" -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -S -s

其中-S表示QEMU虚拟机会冻结CPU,直到远程的GDB输入相应控制命令

-s表示在1234端口接受GDB的调试连接

开始gdb调试

重新开启一个终端

1
2
3
4
5
cd linux-4.0
arm-none-eabi-gdb -tui vmlinux
(gdb) target remote localhost:1234 <= 通过1234端口远程连接QEMU平台
(gdb) b start_kernel <= 在内核的start_kernel处设置断点
(gdb) c

gdb-qemu

QEMU arm64

安装64位编译器

1
sudo apt-get install gcc-aarch64-linux-gnu

制作64位最小文件系统

1
2
3
4
cd busybox
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make install

其他修改和32位相同

编译内核

1
2
3
4
cd linux-4.0
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make menuconfig

设置页大小为4K

1
2
3
Kernel Features  --->
Page size (4KB) --->
(X) 4KB

设置总线位宽48位

1
2
3
Kernel Features  --->
Virtual address space size (48-bit) --->
(X) 48-bit

编译内核

1
2
make -j4 				<= 64位采用未压缩的Image文件,不是bzImage
make dtbs

运行QEMU

1
2
cd linux-4.0
qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine type=virt -nographic -m 2048 -smp 2 -kernel arch/arm64/boot/Image --append "rdinit=/linuxrc console=ttyAMA0"

内核打开时间信息

1
2
3
Kernel hacking —>
printk and dmesg options —>
Show timing information on printks
Brick wechat
扫一扫,用手机看更方便(^ ◕ᴥ◕ ^)