Ubuntu下安裝qemu gdb調試linux Arm64內核

安裝qemu

命令行下,輸入 sudo apt-get install qemu 命令完成安裝:
這裏我已經安裝過一次,所以提示已經是最新版。

yellow@Ubuntu-yellow:~$ sudo apt-get install qemu
正在讀取軟件包列表… 完成
正在分析軟件包的依賴關係樹
正在讀取狀態信息… 完成
qemu 已經是最新版 (1:2.11+dfsg-1ubuntu7.19)。
升級了 0 個軟件包,新安裝了 0 個軟件包,要卸載 0 個軟件包,有 0 個軟件包未被升級。

安裝完成後,可以嘗試輸入 qemu 命令,如果出現自動補全,證明安裝成功。

yellow@Ubuntu-yellow:~$ qemu-
qemu-aarch64 qemu-ppc qemu-system-mipsel
qemu-alpha qemu-ppc64 qemu-system-moxie
qemu-arm qemu-ppc64abi32 qemu-system-nios2
qemu-armeb qemu-ppc64le qemu-system-or1k
qemu-cris qemu-s390x qemu-system-ppc
qemu-hppa qemu-sh4 qemu-system-ppc64
qemu-i386 qemu-sh4eb qemu-system-ppc64le
qemu-img qemu-sparc qemu-system-ppcemb
qemu-io qemu-sparc32plus qemu-system-s390x
qemu-m68k qemu-sparc64 qemu-system-sh4
qemu-make-debian-root qemu-system-aarch64 qemu-system-sh4eb
qemu-microblaze qemu-system-alpha qemu-system-sparc
qemu-microblazeel qemu-system-arm qemu-system-sparc64
qemu-mips qemu-system-cris qemu-system-tricore
qemu-mips64 qemu-system-i386 qemu-system-unicore32
qemu-mips64el qemu-system-lm32 qemu-system-x86_64
qemu-mipsel qemu-system-m68k qemu-system-xtensa
qemu-mipsn32 qemu-system-microblaze qemu-system-xtensaeb
qemu-mipsn32el qemu-system-microblazeel qemu-tilegx
qemu-nbd qemu-system-mips qemu-x86_64
qemu-nios2 qemu-system-mips64
qemu-or1k qemu-system-mips64el

安裝並編譯busybox

下載busybox源碼

該網站下載busybox源代碼,選擇一個壓縮包進行下載。

這裏選擇最新版本的 busybox-1.31.1.tar.bz2

輸入 tar -xjvf busybox-1.31.1.tar.bz2 命令完成解壓

yellow@Ubuntu-yellow:~/windows/learn/huangchangwei/qemu64$ tar -xjvf busybox-1.31.1.tar.bz2
busybox-1.31.1/
busybox-1.31.1/sysklogd/
busybox-1.31.1/sysklogd/syslogd_and_logger.c
busybox-1.31.1/sysklogd/klogd.c

編譯busybox生成根文件系統

  1. 進入 busybox 源碼目錄

cd ./busybox-1.31.1.tar.bz

  1. 嘗試編譯 busybox

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig

注意:
編譯busybox必須提前安裝好工具鏈,我使用的工具鏈爲gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu
工具鏈可以在linaro官網下載

  1. 安裝庫
    第一次編譯 busybox 會出現失敗,這是由於缺少庫導致的。
    在這裏插入圖片描述
    輸入 sudo apt install aptitude 安裝 aptitude

yellow@Ubuntu-yellow:~/windows/learn/huangchangwei/qemu64/busybox-1.31.1$ sudo apt install aptitude
正在讀取軟件包列表… 完成
正在分析軟件包的依賴關係樹
正在讀取狀態信息… 完成
將會同時安裝下列軟件:
aptitude-common libcwidget3v5
建議安裝:
aptitude-doc-en | aptitude-doc apt-xapian-index debtags tasksel libcwidget-dev

       輸入 sudo aptitude install libncurses5-dev 安裝 libncurses5-dev

yellow@Ubuntu-yellow:~/windows/learn/huangchangwei/qemu64/busybox-1.31.1$ sudo aptitude install libncurses5-dev
下列“新”軟件包將被安裝。
libncurses5-dev libtinfo-dev{a}
0 個軟件包被升級,新安裝 2 個, 0 個將被刪除, 同時 0 個將不升級。
需要獲取 256 kB 的存檔。 解包後將要使用 1,422 kB。

  1. 重新編譯 busybox ,此時可以正常編譯
    在這裏插入圖片描述
  2. 修改 busybox 編譯選項選擇靜態庫編譯,編譯完成後保存

Settings -> Build static binary

在這裏插入圖片描述

  1. 編譯生成根文件系統
    首先執行 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8

-j8代表8覈編譯,需根據自己的cpu情況修改個數,如果不清楚可以直接將-j8刪除

         然後執行 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- install
         編譯完成後會在當前目錄生成根文件系統目錄 ./_install
在這裏插入圖片描述

修改文件系統

編譯好後的根文件系統不能直接使用,需要做一些修改。

  1. 將文件系統文件夾 _install 拷貝到 linux 內核代碼目錄

這裏我拷貝到 linux-5.1.15 目錄下

在這裏插入圖片描述

  1. 修改生成的文件系統
  • 創建etc、dev、mnt、etc/init.d目錄
    mkdir etc dev mnt
    mkdir -p etc/init.d/
    在這裏插入圖片描述
  • 修改 etc 下文件內容
    創建 etc/init.d/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

        創建 etc/fstab 內容如下

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

        創建 etc/inittab 內容如下

::sysinit:/etc/init.d/rcS

::respawn:-/bin/sh

::askfirst:-/bin/sh

::cttlaltdel:/bin/umount -a -r

        在 dev 下創建 console 節點

cd dev
sudo mknod console c 5 1

編譯內核

  1. make ARCH=arm64 defconfig -j8
  2. make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8
  3. 修改 menuconfig 配置
    輸入 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
    修改 Initramfs 文件夾目錄,修改爲之前製作並拷貝後的_install目錄

General Setup -> Initramfs source file(s)
在這裏插入圖片描述

  1. make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8 重新編譯
  2. 編譯後Image路徑爲 arch/arm64/boot/Image

qemu啓動Linux內核

有兩種方式,第一種直接啓動,第二種通過gdb啓動。

直接啓動

輸入如下命令

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”

如果運行成功,效果如下:
在這裏插入圖片描述

使用GDB連接啓動

在一個terminal窗口輸入如下命令:

qemu-system-aarch64 -s -S -machine virt -cpu cortex-a57 -machine type=virt -nographic -m 2048 -smp 2 -kernel arch/arm64/boot/Image --append “rdinit=/linuxrc console=ttyAMA0”

啓動另外一個terminal連接gdb

aarch64-linux-gnu-gdb vmlinux

出現如下界面後,輸入target remote:1234 即可連接。
連接成功後,按照普通的GDB方式調試即可。
在這裏插入圖片描述

編譯內核中常見問題

問題一

yellow@Ubuntu-yellow:~/windows/learn/huangchangwei/rep/kernel/5.1.15/linux-5.1.15$ make ARCH=arm64 defconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/confdata.o
HOSTCC scripts/kconfig/expr.o
LEX scripts/kconfig/lexer.lex.c
/bin/sh: 1: flex: not found
scripts/Makefile.lib:194: recipe for target ‘scripts/kconfig/lexer.lex.c’ failed
make[1]: *** [scripts/kconfig/lexer.lex.c] Error 127
yellow@Ubuntu-yellow:~/windows/learn/huangchangwei/rep/kernel/5.1.15/linux-5.1.15$

原因

/bin/sh: 1: flex: not found
缺少 flex

解決方法

sudo apt-get install flex

問題二

yellow@Ubuntu-yellow:~/windows/learn/huangchangwei/rep/kernel/5.1.15/linux-5.1.15$ make ARCH=arm64 defconfig
LEX scripts/kconfig/lexer.lex.c
YACC scripts/kconfig/parser.tab.h
/bin/sh: 1: bison: not found
scripts/Makefile.lib:208: recipe for target ‘scripts/kconfig/parser.tab.h’ failed
make[1]: *** [scripts/kconfig/parser.tab.h] Error 127
Makefile:552: recipe for target ‘defconfig’ failed
make: *** [defconfig] Error 2
yellow@Ubuntu-yellow:~/windows/learn/huangchangwei/rep/kernel/5.1.15/linux-5.1.15$

原因

/bin/sh: 1: bison: not found
缺少 bison

解決方法

sudo apt-get install bison

問題三

DTC arch/arm64/boot/dts/arm/fvp-base-revc.dtb
scripts/extract-cert.c:21:10: fatal error: openssl/bio.h: 沒有那個文件或目錄
#include <openssl/bio.h>
^~~~~~~~~~~~~~~
compilation terminated.
scripts/Makefile.host:92: recipe for target ‘scripts/extract-cert’ failed
make[1]: *** [scripts/extract-cert] Error 1
make[1]: *** 正在等待未完成的任務…

原因

缺少 libssl-dev

解決方法

sudo apt-get install libssl-dev

qemu遇見的問題

問題一

內核啓動失敗,提示unable to open an initial console在這裏插入圖片描述

解決方法

這個問題是在使用Linux5.1.15時發現的,google了很久都沒有解決。
最後嘗試替換爲老一點的4.1.43內核,之前的所有步驟都是一樣的,沒有出現這個現象。
所以,推測可能是最新的內核在qemu上兼容性不夠好,暫時先放在一邊,之後有空了再看看能不能解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章