QEMU調(diào)試Linux內(nèi)核環(huán)境

虛擬機(jī)環(huán)境

0-environment.png

QEMU運(yùn)行ARM Linux內(nèi)核

1.準(zhǔn)備工具

  • 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
    

    編譯最小文件系統(tǒng)

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

靜態(tài)編譯設(shè)置好后,

make install
  • 創(chuàng)建最小文件系統(tǒng)

    cp -r _install/ ../linux-4.0
    cd ../linux-4.0/_install/
    mkdir etc/ dev/ mnt/ -p etc/init.d
    
    • 進(jìn)入../linux-4.0/_install/etc/init.d,創(chuàng)建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
      

      修改為可執(zhí)行權(quán)限

      chmod +x rcS 
      
    • 進(jìn)入../linux-4.0/_install/etc,創(chuàng)建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
      
    • 進(jìn)入../linux-4.0/_install/etc,創(chuàng)建inittab文件,并寫入

      ::sysinit:/etc/init.d/rcS
      ::respawn:-/bin/sh
      ::askfirst:-/bin/sh
      ::ctrlaltdel:/bin/umount -a -r
      
    • 進(jìn)入../linux-4.0/_install/dev,在root權(quán)限下創(chuàng)建如下節(jié)點(diǎn)

      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內(nèi)核源碼
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.0.tar.gz
1-linuxkernelcode.png
  • 設(shè)置編譯變量

    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",并打開高端內(nèi)存
2-memsplit.png
  • 開始編譯kernel

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

    期間遇見缺少inlude/linux/compiler-gcc7.h時(shí),可以將compiler-gcc4.h重名為compiler-gcc7.h即可

3-compile.png

報(bào)錯一般是export變量沒有起作用,修改Makefile的內(nèi)容就好了

3-compile2.png

4.運(yùn)行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關(guān)閉QEMU平臺

QEMU調(diào)試ARM Linux內(nèi)核

1.安裝ARM GDB

要確保內(nèi)核要包含調(diào)試信息

sudo apt install gcc-arm-none-eabi

Ubuntu18沒有添加到官方倉庫,需要手動安裝

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

2.連接gdb

重編譯內(nèi)核,在超級終端中輸入

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相應(yīng)GDB

-s:在1234端口接受GDB調(diào)試連接

在調(diào)試窗口

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

在gdb中

target remote localhost:1234
b start_kernel
c
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容