国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

VSCode+GDB+Qemu調(diào)試ARM64 linux內(nèi)核

這篇具有很好參考價(jià)值的文章主要介紹了VSCode+GDB+Qemu調(diào)試ARM64 linux內(nèi)核。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

俗話說,工欲善其事 必先利其器。linux kernel是一個(gè)非常復(fù)雜的系統(tǒng),初學(xué)者會很難入門。

如果有一個(gè)方便的調(diào)試環(huán)境,學(xué)習(xí)效率至少能有5-10倍的提升。

為了學(xué)習(xí)linux內(nèi)核,通常有這兩個(gè)需要

  1. 可以擺脫硬件,方便的編譯和運(yùn)行l(wèi)inux
  2. 可以使用圖形化的工具來調(diào)試linux

筆者使用VSCode+GDB+Qemu完成了這兩個(gè)需求

qemu作為虛擬機(jī),用來啟動linux。

VSCode+GDB作為調(diào)試工具,用來圖形化地DEBUG。

最終效果大致如下:

qemu運(yùn)行界面:

VSCode+GDB+Qemu調(diào)試ARM64 linux內(nèi)核

vscode調(diào)試界面:

VSCode+GDB+Qemu調(diào)試ARM64 linux內(nèi)核

下面將一步一步介紹如何搭建上述環(huán)境。

本文所有操作都在Vmware Ubuntu16虛擬機(jī)上進(jìn)行。

安裝編譯工具鏈

由于Ubuntu是X86架構(gòu),為了編譯arm64的文件,需要安裝交叉編譯工具鏈

sudo apt-get install gcc-aarch64-linux-gnu
sudo apt-get install libncurses5-dev  build-essential git bison flex libssl-dev

制作根文件系統(tǒng)

linux的啟動需要配合根文件系統(tǒng),這里我們利用busybox來制作一個(gè)簡單的根文件系統(tǒng)

編譯busybox

wget  https://busybox.net/downloads/busybox-1.33.1.tar.bz2
tar -xjf busybox-1.33.1.tar.bz2
cd busybox-1.33.1

打開靜態(tài)庫編譯選項(xiàng)

make menuconfig
Settings --->
 [*] Build static binary (no shared libs) 

指定編譯工具

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-

編譯

make
make install

編譯完成,在busybox目錄下生成_install目錄

定制文件系統(tǒng)

為了init進(jìn)程能正常啟動, 需要再額外進(jìn)行一些配置

根目錄添加etc、dev和lib目錄

# bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install [1:02:17]
$ mkdir etc dev lib
# bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install [1:02:17]
$ ls
bin  dev  etc  lib  linuxrc  sbin  usr

在etc分別創(chuàng)建文件:

# bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install/etc [1:06:13]
$ cat profile
#!/bin/sh
export HOSTNAME=bryant
export USER=root
export HOME=/home
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH

# bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install/etc [1:06:16]
$ cat inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r

# bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install/etc [1:06:19]
$ cat fstab
#device  mount-point    type     options   dump   fsck order
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
kmod_mount /mnt 9p trans=virtio 0 0

# bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install/etc [1:06:26]
$ ls init.d
rcS

# bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install/etc [1:06:30]
$ cat init.d/rcS
mkdir -p /sys
mkdir -p /tmp
mkdir -p /proc
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

這里對這幾個(gè)文件做一點(diǎn)說明:

  1. busybox 作為linuxrc啟動后, 會讀取/etc/profile, 這里面設(shè)置了一些環(huán)境變量和shell的屬性
  2. 根據(jù)/etc/fstab提供的掛載信息, 進(jìn)行文件系統(tǒng)的掛載
  3. busybox 會從 /etc/inittab中讀取sysinit并執(zhí)行, 這里sysinit指向了/etc/init.d/rcS
  4. /etc/init.d/rcS 中 ,mdev -s 這條命令很重要, 它會掃描/sys目錄,查找字符設(shè)備和塊設(shè)備,并在/dev下mknod

dev目錄:

# bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install/dev [1:17:36]
$ sudo mknod console c 5 1

這一步很重要, 沒有console這個(gè)文件, 用戶態(tài)的輸出沒法打印到串口上

lib目錄:拷貝lib庫,支持動態(tài)編譯的應(yīng)用程序運(yùn)行

# bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install/lib [1:18:43]
$ cp /usr/aarch64-linux-gnu/lib/*.so*  -a .

編譯內(nèi)核

配置內(nèi)核

linux內(nèi)核源碼可以在github上直接下載。

根據(jù)arch/arm64/configs/defconfig 文件生成.config

make defconfig ARCH=arm64

將下面的配置加入.config文件中

CONFIG_DEBUG_INFO=y 
CONFIG_INITRAMFS_SOURCE="./root"
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0

CONFIG_DEBUG_INFO是為了方便調(diào)試

CONFIG_INITRAMFS_SOURCE是指定kernel ramdisk的位置,這樣指定之后ramdisk會直接被編譯到kernel 鏡像中。

我們將之前制作好的根文件系統(tǒng)cp到root目錄下:

# bryant @ ubuntu in ~/Downloads/linux-arm64 on git:main x [1:26:56]
$ cp -r ../busybox-1.33.1/_install root

執(zhí)行編譯

make ARCH=arm64 Image -j8  CROSS_COMPILE=aarch64-linux-gnu-

這里指定target為Image 會只編譯kernel, 不會編譯modules, 這樣會增加編譯速度

啟動qemu

下載qemu

需要注意的,qemu最好源碼編譯, 用apt-get直接安裝的qemu可能版本過低,導(dǎo)致無法啟動arm64內(nèi)核。筆者是使用4.2.1版本的qemu

apt-get install build-essential zlib1g-dev pkg-config libglib2.0-dev binutils-dev libboost-all-dev autoconf libtool libssl-dev libpixman-1-dev libpython-dev python-pip python-capstone virtualenv
wget https://download.qemu.org/qemu-4.2.1.tar.xz
tar xvJf qemu-4.2.1.tar.xz
cd qemu-4.2.1
./configure --target-list=x86_64-softmmu,x86_64-linux-user,arm-softmmu,arm-linux-user,aarch64-softmmu,aarch64-linux-user --enable-kvm
make 
sudo make install

編譯完成之后,qemu在 /usr/local/bin目錄下

$ /usr/local/bin/qemu-system-aarch64 --version
QEMU emulator version 4.2.1
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers

啟動linux內(nèi)核

/usr/local/bin/qemu-system-aarch64 -m 512M -smp 4 -cpu cortex-a57 -machine virt -kernel arch/arm64/boot/Image -append "rdinit=/linuxrc nokaslr console=ttyAMA0 loglevel=8" -nographic -s

這里對于參數(shù)做一些解釋:

-m 512M?內(nèi)存為512M

-smp 4?4核

-cpu cortex-a57cpu 為cortex-a57

-kernel?kernel鏡像文件

-append傳給kernel 的cmdline參數(shù)。其中rdinit指定了init進(jìn)程;nokaslr 禁止內(nèi)核起始地址隨機(jī)化,這個(gè)很重要, 否則GDB調(diào)試可能有問題;console=ttyAMA0指定了串口,沒有這一步就看不到linux的輸出;

-nographic禁止圖形輸出

-s監(jiān)聽gdb端口, gdb程序可以通過1234這個(gè)端口連上來。

這里說明一下console=ttyAMA0是怎么生效的。

查看linux源碼可知ttyAMA0對應(yīng)的是AMBA_PL011這個(gè)驅(qū)動:

config SERIAL_AMBA_PL011_CONSOLE
    bool "Support for console on AMBA serial port"
    depends on SERIAL_AMBA_PL011=y
    select SERIAL_CORE_CONSOLE
    select SERIAL_EARLYCON
    help
      Say Y here if you wish to use an AMBA PrimeCell UART as the system
      console (the system console is the device which receives all kernel
      messages and warnings and which allows logins in single user mode).

      Even if you say Y here, the currently visible framebuffer console
      (/dev/tty0) will still be used as the system console by default, but
      you can alter that using a kernel command line option such as
      "console=ttyAMA0". (Try "man bootparam" or see the documentation of
      your boot loader (lilo or loadlin) about how to pass options to the
      kernel at boot time.)

AMBA_PL011是arm的一個(gè)標(biāo)準(zhǔn)串口設(shè)備, qemu 的輸出就是模擬的這個(gè)串口。

在qemu的源碼文件中,也可以看到PL011的相關(guān)文件:

# bryant @ ubuntu in ~/Downloads/qemu-4.2.1 [1:46:54]
$ find . -name "*pl011*"
./hw/char/pl011.c

成功啟動Linux后, 串口打印如下:

[    3.401567] usbcore: registered new interface driver usbhid
[    3.404445] usbhid: USB HID core driver
[    3.425030] NET: Registered protocol family 17
[    3.429743] 9pnet: Installing 9P2000 support
[    3.435439] Key type dns_resolver registered
[    3.440299] registered taskstats version 1
[    3.443685] Loading compiled-in X.509 certificates
[    3.461041] input: gpio-keys as /devices/platform/gpio-keys/input/input0
[    3.473163] ALSA device list:
[    3.474432]   No soundcards found.
[    3.485283] uart-pl011 9000000.pl011: no DMA platform data
[    3.541376] Freeing unused kernel memory: 10752K
[    3.545897] Run /linuxrc as init process
[    3.548390]   with arguments:
[    3.550279]     /linuxrc
[    3.551073]     nokaslr
[    3.552216]   with environment:
[    3.554396]     HOME=/
[    3.555898]     TERM=linux
[    3.985835] 9pnet_virtio: no channels available for device kmod_mount
mount: mounting kmod_mount on /mnt failed: No such file or directory
/etc/init.d/rcS: line 8: can't create /proc/sys/kernel/hotplug: nonexistent directory

Please press Enter to activate this console.
[root@bryant ]#
[root@bryant ]#

VSCode+GDB

vscode中集成了GDB功能,我們可以用它來圖形化的調(diào)試linux kernel

首先我們添加vscode的gdb配置文件(.vscode/launch.json):

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "kernel debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/vmlinux",
            "cwd": "${workspaceFolder}",
            "MIMode": "gdb",
            "miDebuggerPath":"/usr/bin/gdb-multiarch",
            "miDebuggerServerAddress": "localhost:1234"
        }
    ]
}

這里對幾個(gè)重點(diǎn)參數(shù)做一些說明:

program: 調(diào)試的符號文件

miDebuggerPath:gdb的路徑, 這里需要注意的是,由于我們是arm64內(nèi)核,因此需要用gdb-multiarch來進(jìn)行調(diào)試

miDebuggerServerAddress:對端地址,qemu會默認(rèn)使用1234這個(gè)端口

配置完成之后,可以直接啟動GDB, 連接上linux kernel

VSCode+GDB+Qemu調(diào)試ARM64 linux內(nèi)核

在vscode中,可以設(shè)置斷點(diǎn),進(jìn)行單步調(diào)試

VSCode+GDB+Qemu調(diào)試ARM64 linux內(nèi)核

VSCode+GDB+Qemu調(diào)試ARM64 linux內(nèi)核文章來源地址http://www.zghlxwxcb.cn/news/detail-474441.html

到了這里,關(guān)于VSCode+GDB+Qemu調(diào)試ARM64 linux內(nèi)核的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ARM Linux 調(diào)試 -QEMU啟動 Uboot/Kernel/Rootfs

    懶人方式: 直接去方銳/qemu克隆項(xiàng)目,執(zhí)行script目錄的腳本即可 1. build_env.sh安裝環(huán)境 2. build_rootfs.sh 生成rootfs 3. build_kernel.sh編譯kernel 4. qemu_run.sh開始調(diào)試 2.1busybox代碼的下載編譯 Busybox下載地址:https://busybox.net/downloads/ Download 1.36.0 Busybox 默認(rèn)會安裝到 ./_install 目錄下 制作ro

    2024年02月02日
    瀏覽(90)
  • ubuntu22上使用qemu-system-arm調(diào)試linux

    qemu是用軟件模擬硬件解析指令運(yùn)行的軟件,可以模擬arm、arm64、x86等,對于調(diào)試linux 內(nèi)核機(jī)制很方便,不用額外購買開發(fā)板。由于linux上有對qemu的加速引擎,支持程度更高,且網(wǎng)絡(luò)上教程居多,所以這里使用virtualbox+ubuntu22虛擬機(jī),在ubuntu上運(yùn)行qemu進(jìn)行模擬。 virtualbox安裝:

    2024年01月25日
    瀏覽(20)
  • Linux 利用 qemu-system-aarch64 實(shí)現(xiàn) x86 機(jī)器安裝 arm64 的操作系統(tǒng)

    Linux 利用 qemu-system-aarch64 實(shí)現(xiàn) x86 機(jī)器安裝 arm64 的操作系統(tǒng)

    qemu-system-aarch64 啟動的虛擬機(jī),無法受到 kvm 的管理,也無法在后臺運(yùn)行 終端一旦斷開了,虛擬機(jī)就被關(guān)掉了,想再次進(jìn)入目前沒找到方法,都會回到安裝操作系統(tǒng)的步驟 可能是 centos 有某些特殊性吧,暫時(shí)沒太多時(shí)間研究,后期有時(shí)間了再看看有沒有解決的方案 qemu-5.2.0 和

    2024年02月06日
    瀏覽(31)
  • Linux學(xué)習(xí)筆記 : ARM64 平臺下 qemu virt 有默認(rèn)的設(shè)備樹 dtb

    Linux學(xué)習(xí)筆記 : ARM64 平臺下 qemu virt 有默認(rèn)的設(shè)備樹 dtb

    首先想通過 Linux qemu 驗(yàn)證 設(shè)備樹的加載與設(shè)備節(jié)點(diǎn)解析,原因是 qemu 可以 軟件調(diào)試,而普通的 Linux 開發(fā)板,Linux 內(nèi)核驅(qū)動調(diào)試起來反而很復(fù)雜。 【記錄】我竟然還沒有在Linux 真實(shí)開發(fā)板上調(diào)試過Linux 內(nèi)核,感覺自己就是個(gè)工具,配置、修改、下載,有問題加幾行 LOG 日志分

    2024年01月20日
    瀏覽(31)
  • qemu-基礎(chǔ)篇——GDB 常用調(diào)試命令(三)

    info source 查看當(dāng)前程序信息 layout 分割窗口,一邊查看代碼,一邊測試 layout asm layout src continue/c 程序繼續(xù)運(yùn)行,到下一斷點(diǎn)處暫停 run/r 運(yùn)行 step/c 單步運(yùn)行 info reg 查看寄存器 break/b + 標(biāo)號/行號 設(shè)置斷點(diǎn) info break/b 查看斷點(diǎn) print 表達(dá)式 簡記為 p 其中 表達(dá)式 可以是任何當(dāng)前正

    2024年02月03日
    瀏覽(49)
  • VScode 調(diào)試 linux內(nèi)核

    VScode 調(diào)試 linux內(nèi)核

    這里調(diào)試的 linux 內(nèi)核是通過 Linux+SD卡(rootfs)運(yùn)行的內(nèi)核 編輯 /home/tyustli/.gdbinit 文件,參考 【GDB】 .gdbinit 文件 在 linux 源碼項(xiàng)目的根目錄新建 .gdbinit 文件 先啟動 linux 內(nèi)核,讓其等待 GDB 連接 在編譯 linux 的當(dāng)前路徑輸入 如果沒有設(shè)置 /home/tyustli/.gdbinit 文件,那么對應(yīng)的命令為

    2024年02月07日
    瀏覽(19)
  • 【1000個(gè)GDB技巧之】如何在遠(yuǎn)端服務(wù)器打開通過vscode動態(tài)觀測Linux內(nèi)核實(shí)戰(zhàn)篇?

    【1000個(gè)GDB技巧之】如何在遠(yuǎn)端服務(wù)器打開通過vscode動態(tài)觀測Linux內(nèi)核實(shí)戰(zhàn)篇?

    (也可以直接在vscode中配置,忽略) 主要步驟:在~/.ssh/config中添加服務(wù)端的host,以便vscode的remote中能夠登錄 詳細(xì)配置過程參考兄弟篇文章:ssh config如何配置用host名替代root@1.1.1.1 初次使用remote功能,需要在遠(yuǎn)端安裝一個(gè)ssh的代理,需要耗費(fèi)一定時(shí)間。 添加一個(gè)調(diào)試配置文

    2024年04月16日
    瀏覽(20)
  • Windows11 上使用 QEMU 創(chuàng)建 Ubuntu aarch64(ARM64)虛擬機(jī)

    Windows11 上使用 QEMU 創(chuàng)建 Ubuntu aarch64(ARM64)虛擬機(jī)

    最近在實(shí)現(xiàn)一個(gè)混沌測試工具,對汽車上分布式系統(tǒng)執(zhí)行測試。計(jì)劃運(yùn)行在 Linux aarch64 環(huán)境,需要確定在目標(biāo)環(huán)境能不能運(yùn)行,但自己和實(shí)驗(yàn)室的電腦都是 x86_64,所以打算建一個(gè)虛擬機(jī)。 通過 Docker容器或VMware都不支持在 x86_64 宿主機(jī)運(yùn)行 aarch64 容器/虛擬機(jī), Virtual Box 似乎也

    2024年02月03日
    瀏覽(25)
  • qemu-基礎(chǔ)篇——arm 裸機(jī)調(diào)試環(huán)境搭建

    裸機(jī)篇系列文章主要用于熟悉 arm 匯編及處理器結(jié)構(gòu) 本系列使用 mcimx6ul-evk mcimx6ul-evk 0x80000000-0xFFFFFFFF 2048MB 空間為 DDR 地址,所以將程序鏈接到 0x80000000 。 通過-Ttext 選項(xiàng),可以指定鏈接地址 -s :監(jiān)聽在 gdb 1234 端口 -S :表示啟動后就掛起,等待 gdb 連接 -kernel 指定啟用的內(nèi)核

    2024年01月21日
    瀏覽(19)
  • arm環(huán)境使用GDB調(diào)試

    arm環(huán)境使用GDB調(diào)試

    ????????調(diào)試設(shè)備代碼的時(shí)候,經(jīng)常碰到程序異常或者功能對不上,以前這種時(shí)候就是加打印消息,然后重新編譯把程序放進(jìn)去跑,通過打印消息來判斷代碼出問題的點(diǎn)在哪里,但是有的時(shí)候可能需要反復(fù)加多次才能定位到問題點(diǎn),而使用gdb調(diào)試就可以很快找到問題,非常

    2024年01月25日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包