QEMU调试Linux内核环境

虚拟机环境

0-environment.png

QEMU运行ARM Linux内核

1.准备工具

  • qemu
  • libncurses5-dev
  • gcc-arm-linux-gnueabi
  • build-essential
sudo apt-get install qemu libncurses5-dev gcc-arm-linux-gnueabi build-essential 

2.安装busybox

busybox工具包

  • 下载

    wget https://busybox.net/downloads/busybox-1.24.2.tar.bz2
    
1-busyboxinstall.png
  • 安装

    解压

    tar -jxvf busybox-1.24.2.tar.bz2
    

    编译最小文件系统

    cd busybox
    export ARCH=arm
    export CROSS_COMPILE=arm-linux-gnueabi-
    make menuconfig
    
1-busyboxinstall2.png

静态编译设置好后,

make install
  • 创建最小文件系统

    cp -r _install/ ../linux-4.0
    cd ../linux-4.0/_install/
    mkdir etc/ dev/ mnt/ -p etc/init.d
    
    • 进入../linux-4.0/_install/etc/init.d,创建rcS文件,并写入

      cd ./etc/init.d/
      vi rcS
      
      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
      

      修改为可执行权限

      chmod +x rcS 
      
    • 进入../linux-4.0/_install/etc,创建fstab文件,并写入

      vi fstab
      
      proc /proc proc defaults 0 0
      tmpfs /tmp tmpfs defaults 0 0
      sysfs /sys sysfs defaults 0 0
      tmpfs /tmp tmpfs defaults 0 0
      debugfs /sys/kernel/debug debugfs defaults 0 0
      
    • 进入../linux-4.0/_install/etc,创建inittab文件,并写入

      ::sysinit:/etc/init.d/rcS
      ::respawn:-/bin/sh
      ::askfirst:-/bin/sh
      ::ctrlaltdel:/bin/umount -a -r
      
    • 进入../linux-4.0/_install/dev,在root权限下创建如下节点

      joe1sn@ubuntu:~/Desktop/LinuxKernel/linux-4.0/_install/dev$ sudo mknod console c 5 1
      [sudo] password for joe1sn: 
      joe1sn@ubuntu:~/Desktop/LinuxKernel/linux-4.0/_install/dev$ sudo mknod null c 1 3
      

3.编译kernel

  • 下载linux-4.0内核源码
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.0.tar.gz
1-linuxkernelcode.png
  • 设置编译变量

    cd linux-4.0
    export ARCH=arm
    export CROSS_COMPILE=arm-linux-gnueabi-
    make vexpress_defconfig
    make menuconfig
    
  • 配置initarmfs

2-initarm1.png
2-initarm2.png
  • memory split为"3G/1G user/kernel split",并打开高端内存
2-memsplit.png
  • 开始编译kernel

    sudo make bzImage -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
    sudo make dtbs
    

    期间遇见缺少inlude/linux/compiler-gcc7.h时,可以将compiler-gcc4.h重名为compiler-gcc7.h即可

3-compile.png

报错一般是export变量没有起作用,修改Makefile的内容就好了

3-compile2.png

4.运行QEMU模拟4核Cortex-A9

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

在另外一个terminal输入killall qemu-system-arm关闭QEMU平台

QEMU调试ARM Linux内核

1.安装ARM GDB

要确保内核要包含调试信息

sudo apt install gcc-arm-none-eabi

Ubuntu18没有添加到官方仓库,需要手动安装

参考:https://zhuanlan.zhihu.com/p/134031693

2.连接gdb

重编译内核,在超级终端中输入

qemu-system-arm -M vexpress-a9 -m 1024M -kernel arch/arm/boot/zImage -append "rdinit=/linuxrc console=ttyAMA0 loglevel=8" -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -S -s

-S:中断CPU相应GDB

-s:在1234端口接受GDB调试连接

在调试窗口

arm-none-eabi-gdb -tui vmlinux
5-gdb-1.png

在gdb中

target remote localhost:1234
b start_kernel
c
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容