Ubuntu 18.04使用Qemu和GDB搭建運行內核的環境

安裝busybox

參考博客:
使用GDB+QEMU調試Linux內核環境搭建
一文教你如何使用GDB+Qemu調試Linux內核
ubuntu22.04搭建qemu環境測試內核
交叉編譯busybox
編譯busybox出現Library m is needed, can’t exclude it (yet)的解釋
S3C2440 制作最新busybox文件系統
https://www.busybox.net/是官網。
在這里插入圖片描述
sudo wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2下載源代碼。
在這里插入圖片描述

sudo tar jxvf busybox-1.36.1.tar.bz2解壓源文件。
在這里插入圖片描述

cd busybox-1.36.1進入源代碼目錄里邊。
在這里插入圖片描述

執行make menuconfig發現報錯:

Command 'make' not found, but can be installed with:sudo apt install make
sudo apt install make-guile

在這里插入圖片描述
使用sudo apt install make安裝make,發現報錯如下:

E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

在這里插入圖片描述

使用sudo rm -rf /var/lib/dpkg/lock-frontend刪除lock-frontend,然后再使用sudo apt install make安裝make,發現正常安裝。
在這里插入圖片描述

sudo apt install -y gcc g++ libncurses5-dev安裝依賴包。

在這里插入圖片描述

安裝完成如下圖:
在這里插入圖片描述

sudo make menuconfig進行配置。
在這里插入圖片描述

使用上下鍵可以選擇,選擇“Setting”之后,按回車鍵。
在這里插入圖片描述

進入到下一個選擇時,使用上下鍵找一下“Build static binary (no shared libs) ”。
在這里插入圖片描述

然后按一下y就是選擇上了。
在這里插入圖片描述

按一下Esc鍵就可以退回到上一層。
在這里插入圖片描述

按一下Esc鍵就可以退回到保存界面。
在這里插入圖片描述

選擇“yes”按一下Enter鍵,就退到原來的命令行下。
在這里插入圖片描述

sudo make -j2進行編譯。
在這里插入圖片描述

完成之后提示如下:

Static linking against glibc, can't use --gc-sections
Trying libraries: crypt m resolv rtLibrary crypt is not needed, excluding itLibrary m is needed, can't exclude it (yet)Library resolv is needed, can't exclude it (yet)Library rt is not needed, excluding itLibrary m is needed, can't exclude it (yet)Library resolv is needed, can't exclude it (yet)
Final link with: m resolv

在這里插入圖片描述

sudo make install進行安裝。
在這里插入圖片描述

完成之后,提示:

You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.

在這里插入圖片描述

啟動內存文件系統制作

cd _install進入到特定目錄里邊。
在這里插入圖片描述
sudo mkdir proc sys新建兩個目錄procsys
在這里插入圖片描述

sudo vim init把下邊的內容寫進去:

#!/bin/sh
echo "{==DBG==} INIT SCRIPT"
mkdir /tmp
mount -t proc none /proc
mount -t sysfs none /sys
mount -t debugfs none /sys/kernel/debug
mount -t tmpfs none /tmpmdev -s 
echo -e "{==DBG==} Boot took $(cut -d' ' -f1 /proc/uptime) seconds"# normal user
setsid /bin/cttyhack setuidgid 1000 /bin/sh

在這里插入圖片描述

sudo chmod +x init 為當前用戶添加上可執行的權限。
在這里插入圖片描述

sudo chmod -R 777 .給當前目錄中所有的文件配上讀寫執行的權限。
在這里插入圖片描述

sudo find . | sudo cpio -o --format=newc > ./rootfs.img生成rootfs.img文件。
在這里插入圖片描述

生成Linux內核

cd ~/進入到home目錄里邊。
在這里插入圖片描述

sudo wget http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/v5.x/linux-5.19.tar.xz下載源代碼。在這里插入圖片描述

sudo tar xf linux-5.19.tar.xz解壓源代碼,時間有點長,需要等待。
在這里插入圖片描述

cd linux-5.19/進入到源碼里邊。
在這里插入圖片描述

sudo make menuconfig,發現報錯:

/bin/sh: 1: flex: not found
scripts/Makefile.host:9: recipe for target 'scripts/kconfig/lexer.lex.c' failed
make[1]: *** [scripts/kconfig/lexer.lex.c] Error 127
Makefile:629: recipe for target 'menuconfig' failed
make: *** [menuconfig] Error 2

在這里插入圖片描述

sudo apt-get install -y flex bison安裝依賴包。
在這里插入圖片描述

sudo make menuconfig進行配置選擇。
上下鍵可以進行選項尋找,按回車鍵可以進入,找到Kernel hacking進入。
在這里插入圖片描述

使用下鍵找到Compile-time checks and compiler options,然后按回車鍵。

在這里插入圖片描述

發現Provide GDB scripts for kernel debugging已經默認選上了。

在這里插入圖片描述

按兩下Esc
在這里插入圖片描述

按兩下Esc
在這里插入圖片描述

按兩下Esc
在這里插入圖片描述

選擇yes按一下回車鍵。
在這里插入圖片描述

grep CONFIG_DEBUG_INFO .config驗證一下,選擇是否正確。
在這里插入圖片描述

sudo sed -i 's/CONFIG_MODULE_SIG=y/CONFIG_MODULE_SIG=n/g' .config  # 把 CONFIG_MODULE_SIG=y  替換成  CONFIG_MODULE_SIG=n
sudo sed -i 's/CONFIG_MODULE_SIG_ALL=y/CONFIG_MODULE_SIG_ALL=n/g' .config
sudo sed -i 's/CONFIG_SYSTEM_TRUSTED_KEYS="debian\/canonical-certs.pem"/CONFIG_SYSTEM_TRUSTED_KEYS=""/g' .config
sudo sed -i 's/CONFIG_SYSTEM_REVOCATION_KEYS="debian\/canonical-revoked-certs.pem"/CONFIG_SYSTEM_REVOCATION_KEYS=""/g' .config
sudo sed -i 's/CONFIG_SYSTEM_TRUSTED_KEYRING=y/CONFIG_SYSTEM_TRUSTED_KEYRING=n/g' .config  # 把 CONFIG_SYSTEM_TRUSTED_KEYRING=y 替換成 CONFIG_SYSTEM_TRUSTED_KEYRING=n 
cat .config | grep "CONFIG_SYSTEM_TRUSTED_KEYRING=n" # 看一下 CONFIG_SYSTEM_TRUSTED_KEYRING 相關字符串是否成功替換。

在這里插入圖片描述

nproc看一下當前系統核數。
在這里插入圖片描述

sudo make -j2開始編譯
在這里插入圖片描述
發現報錯:

/home/ubuntu1804/linux-5.19/tools/objtool/include/objtool/elf.h:10:10: fatal err or: gelf.h: No such file or directory#include <gelf.h>^~~~~~~~
compilation terminated.
/home/ubuntu1804/linux-5.19/tools/build/Makefile.build:96: recipe for target '/h ome/ubuntu1804/linux-5.19/tools/objtool/arch/x86/special.o' failed
make[4]: *** [/home/ubuntu1804/linux-5.19/tools/objtool/arch/x86/special.o] Erro r 1
/home/ubuntu1804/linux-5.19/tools/build/Makefile.build:139: recipe for target 'a rch/x86' failed
make[3]: *** [arch/x86] Error 2
Makefile:53: recipe for target '/home/ubuntu1804/linux-5.19/tools/objtool/objtoo l-in.o' failed
make[2]: *** [/home/ubuntu1804/linux-5.19/tools/objtool/objtool-in.o] Error 2
Makefile:73: recipe for target 'objtool' failed
make[1]: *** [objtool] Error 2
Makefile:1343: recipe for target 'tools/objtool' failed
make: *** [tools/objtool] Error 2
make: *** Waiting for unfinished jobs....HOSTCC  scripts/sorttableHOSTCC  scripts/asn1_compilerHOSTCC  scripts/sign-fileHOSTCC  scripts/insert-sys-cert
scripts/sign-file.c:25:10: fatal error: openssl/opensslv.h: No such file or dire ctory#include <openssl/opensslv.h>^~~~~~~~~~~~~~~~~~~~
compilation terminated.

在這里插入圖片描述
sudo apt-get install -y apt-file安裝apt-file
在這里插入圖片描述

sudo apt-file search gelf.h,提示 The cache is empty. You need to run "apt update" first.,然后執行sudo apt update

在這里插入圖片描述

sudo apt-file search gelf.h找了許久,才找到。
在這里插入圖片描述

我看還不如直接上網搜索比較快,sudo apt-get install -y libelf-dev libssl-dev安裝依賴包。
在這里插入圖片描述

sudo make -j2編譯
在這里插入圖片描述

報錯如下:

make[3]: *** [drivers/net/bonding/bond_3ad.o] Error 1
make[3]: *** Waiting for unfinished jobs....
drivers/net/bonding/bond_main.c:6373:1: fatal error: error writing to /tmp/ccqoYlgl.s: No space left on deviceMODULE_AUTHOR("Thomas Davis, tadavis@lbl.gov and many others");^~~~~~~~~~~~~
compilation terminated.
scripts/Makefile.build:249: recipe for target 'drivers/net/bonding/bond_main.o' failed
make[3]: *** [drivers/net/bonding/bond_main.o] Error 1
scripts/Makefile.build:466: recipe for target 'drivers/net/bonding' failed
make[2]: *** [drivers/net/bonding] Error 2
scripts/Makefile.build:466: recipe for target 'drivers/net' failed
make[1]: *** [drivers/net] Error 2
Makefile:1843: recipe for target 'drivers' failed
make: *** [drivers] Error 2

在這里插入圖片描述

sudo rm -rf /tmp刪除/tmp里邊的內容。
在這里插入圖片描述
然后再次執行sudo make -j2編譯,這次發現是整個Ubuntu系統磁盤滿了,開機之后再也無法進入Ubuntu了,所以只能進入到grub中recover模式刪除原先編譯好的文件,才能進入到系統。然后使用vmware擴展磁盤大小,然后再進行掛載。

在這里插入圖片描述

sudo make menuconfig進行配置選擇。
在這里插入圖片描述
已經默認選擇上了。

在這里插入圖片描述

重新配置一些參數。

sudo sed -i 's/CONFIG_MODULE_SIG=y/CONFIG_MODULE_SIG=n/g' .config  # 把 CONFIG_MODULE_SIG=y  替換成  CONFIG_MODULE_SIG=n
sudo sed -i 's/CONFIG_MODULE_SIG_ALL=y/CONFIG_MODULE_SIG_ALL=n/g' .config
sudo sed -i 's/CONFIG_SYSTEM_TRUSTED_KEYS="debian\/canonical-certs.pem"/CONFIG_SYSTEM_TRUSTED_KEYS=""/g' .config
sudo sed -i 's/CONFIG_SYSTEM_REVOCATION_KEYS="debian\/canonical-revoked-certs.pem"/CONFIG_SYSTEM_REVOCATION_KEYS=""/g' .config
sudo sed -i 's/CONFIG_SYSTEM_TRUSTED_KEYRING=y/CONFIG_SYSTEM_TRUSTED_KEYRING=n/g' .config  # 把 CONFIG_SYSTEM_TRUSTED_KEYRING=y 替換成 CONFIG_SYSTEM_TRUSTED_KEYRING=n 
cat .config | grep "CONFIG_SYSTEM_TRUSTED_KEYRING=n" # 看一下 CONFIG_SYSTEM_TRUSTED_KEYRING 相關字符串是否成功替換。

在這里插入圖片描述

sudo make -j2
在這里插入圖片描述

發現報錯如下:

BTF: .tmp_vmlinux.btf: pahole (pahole) is not available
Failed to generate BTF for vmlinux
Try to disable CONFIG_DEBUG_INFO_BTF
Makefile:1164: recipe for target 'vmlinux' failed
make: *** [vmlinux] Error 1

在這里插入圖片描述

sudo apt-get install -y dwarves安裝dwarves

在這里插入圖片描述

sudo make -j2再次執行。
在這里插入圖片描述

完成之后如下:
在這里插入圖片描述

ls -hl vmlinux可以看到生成的vmlinux文件信息。
在這里插入圖片描述

ls -hl ./arch/x86/boot/bzImage可以看到生成的bzImage文件信息。
在這里插入圖片描述

安裝Qmeu并開始調試

sudo apt install -y qemu qemu-utils qemu-kvm virt-manager libvirt-daemon-system libvirt-clients bridge-utils安裝依賴包。
在這里插入圖片描述

sudo cp ~/busybox-1.36.1/_install/rootfs.img /mountsda4/linux-5.19/rootfs.img移動到源代碼目錄下。
在這里插入圖片描述

sudo qemu-system-x86_64 -kernel ./arch/x86/boot/bzImage -initrd ./rootfs.img -append "nokaslr console=ttyS0" -s -S -nographic,可以看到停留在啟動處。
在這里插入圖片描述

再打開一個命令行,稱之為B終端cd /mountsda4/linux-5.19進入到vmlinux文件所在的目錄下,然后執行sudo gdb vmlinux,就可以進入到gdb測試界面。
在這里插入圖片描述

之后輸入target remote localhost:1234連接上測試端口。
在這里插入圖片描述

之后的測試就需要使用gdb測試里邊的知識了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211566.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211566.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211566.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

block-recurrent-transformer-pytorch 學習筆記

目錄 有依賴項1&#xff1a; 沒有依賴項&#xff0c;沒有使用例子 沒有依賴項2&#xff1a; 有依賴項1&#xff1a; GitHub - dashstander/block-recurrent-transformer: Pytorch implementation of "Block Recurrent Transformers" (Hutchins & Schlag et a…

gd32和stm32的區別

gd32和stm32的區別 現在的市場上有很多種不同類型的微控制器&#xff0c;其中比較常見的有兩種&#xff0c;即gd32和stm32。兩種微控制器都是中國和歐洲的兩個公司分別推出的&#xff0c;但是它們之間有很多區別&#xff0c;本文將會深入探討這些區別。 1.起源和歷史 gd32是…

2024年網絡安全競賽-Web安全應用

Web安全應用 (一)拓撲圖 任務環境說明: 1.獲取PHP的版本號作為Flag值提交;(例如:5.2.14) 2.獲取MySQL數據庫的版本號作為Flag值提交;(例如:5.0.22) 3.獲取系統的內核版本號作為Flag值提交;(例如:2.6.18) 4.獲取網站后臺管理員admin用戶的密碼作為Flag值提交…

udp多播組播

import socket ,struct,time# 組播地址和端口號 MCAST_GRP 239.0.0.1 MCAST_PORT 8888 # 創建UDP socket對象 sock socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) # 綁定socket對象到本地端口號 # sock.bind((MCAST_GRP, MCAST_PORT)) …

【4】PyQt輸入框

1. 單行文本輸入框 QLineEdit控件可以輸入單行文本 from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QVBoxLayout from PyQt5.QtCore import * from PyQt5.QtGui import QIcon import sysdef init_widget(w: QWidget):# 修改窗口標題w.setWindowTitle(單行輸…

前端面試——CSS面經(持續更新)

1. CSS選擇器及其優先級 !important > 行內樣式 > id選擇器 > 類/偽類/屬性選擇器 > 標簽/偽元素選擇器 > 子/后臺選擇器 > *通配符 2. 重排和重繪是什么&#xff1f;瀏覽器的渲染機制是什么&#xff1f; 重排(回流)&#xff1a;當增加或刪除dom節點&…

【面試經典150 | 二叉樹】從中序與后序遍歷序列構造二叉樹

文章目錄 寫在前面Tag題目來源題目解讀解題思路方法一&#xff1a;遞歸 寫在最后 寫在前面 本專欄專注于分析與講解【面試經典150】算法&#xff0c;兩到三天更新一篇文章&#xff0c;歡迎催更…… 專欄內容以分析題目為主&#xff0c;并附帶一些對于本題涉及到的數據結構等內容…

Android : Room 數據庫的基本用法 —簡單應用

1.Room介紹&#xff1a; Android Room 是 Android 官方提供的一個持久性庫&#xff0c;用于在 Android 應用程序中管理數據庫。它提供了一個簡單的 API 層&#xff0c;使得使用 SQLite 數據庫變得更加容易和方便。 以下是 Android Room 的主要特點&#xff1a; 對象關系映射…

9.MySQL 索引

目錄 ???????概述 概念&#xff1a; 單列索引 普通索引 創建索引 查看索引 刪除索引 唯一索引 創建唯一索引 刪除唯一索引 主鍵索引 組合索引 創建索引 全文索引 概述 使用全文索引 空間索引 內部原理 相關算法&#xff1a; hash算法 二叉樹算法 …

Spring基于XML文件配置AOP

AOP AOP&#xff0c;面向切面編程&#xff0c;是對面向對象編程OOP的升華。OOP是縱向對一個事物的抽象&#xff0c;一個對象包括靜態的屬性信息&#xff0c;包括動態的方法信息等。而AOP是橫向的對不同事物的抽象&#xff0c;屬性與屬性、方法與方法、對象與對象都可以組成一個…

12.10多種編碼方式,編碼方案選擇策略(遞歸級聯),PDE,RLE代碼

作者如何選擇和設計編碼方案&#xff0c;以實現高效的解壓縮和高壓縮比&#xff1f;BtrBlocks是否適用于所有類型的數據&#xff1f; 選擇和設計編碼方案&#xff1a; 結合多種高效編碼方案&#xff1a;BtrBlocks 通過選擇一組針對不同數據分布的高效編碼方案&#xff0c;實現…

js判斷是否對象自身為空

文章目錄 一、前言二、JSON.stringify三、for in 配合 hasOwnProperty四、Object.keys五、Object.getOwnPropertyNames六、Object.getOwnPropertyNames 結合 Object.getOwnPropertySymbols七、Reflect.ownKeys八、最后 一、前言 如何判斷一個對象為空&#xff1f; 先上結論&a…

MySql復習筆記03(小滴課堂) 事務,視圖,觸發器,存儲過程

mysql 必備核心知識之事務的詳細解析&#xff1a; 創建一個數據庫表&#xff1a; 添加數據并開啟事務。 添加數據并查詢。 登錄另一臺服務器發現查不到這個表中的數據。 這是因為事務開啟了&#xff0c;但是沒有提交&#xff0c;只是把數據存到了內存中&#xff0c;還沒有寫入…

以為回調函數是同步的(js的問題)

回調函數可以用來處理 JavaScript 的異步操作&#xff0c;但是選用 Promise、async/await 更好&#xff0c;因為多重回調函數會導致回調地獄。 回調函數不是**同步的**&#xff0c;它是延時操作執行完畢后會被調用的一個函數。 比如全局方法 "setTimeout" &#xf…

CString 的 Replace 函數

Replace 使用測試 CString mSectNameNew L"槽a*b*c*d";CString mSectNameNew2 L"Ca*b*c*d";CString mSectNameNew3 L"[a*b*c*d";mSectNameNew.Replace(_T("M"), _T("C")); // 不會替換mSectNameNew.Re…

JOSEF 沖擊繼電器 ZC-23A DC48V 柜內安裝,板前帶座

系列型號 ZC-23沖擊繼電器&#xff1b;ZC-23A沖擊繼電器&#xff1b; ZC-23B沖擊繼電器 一、用途 沖擊繼電器ZC-23A DC48V 柜內安裝板前帶座 (以下簡稱繼電器)&#xff0c;廣泛用于直流操作的繼電器保護及自動控制回路中&#xff0c;作為集中控制信號元件。 二、主要技術參…

C#動態調用C++DLL中的函數

DLL中導出的函數 typedef void (*HQ_MSG_CALLBACK)(void *h, int nMsg, int nMsgType, int nReqNo, const char *szData, int nSize); void SetMsgFunc(void *h, HQ_MSG_CALLBACK pmsgCallBack);C#動態調用上述函數 public delegate void CALLBACK(IntPtr h, int nMsg, int n…

信息處理技術員

目錄 信息處理技術員工作內容 信息處理技術員崗位面試試題舉例 信息處理技術員考試 信息處理技術員工作內容 信息處理技術員是負責處理和管理信息系統的專業人員。他們的主要工作內容包括以下幾個方面&#xff1a; 1.系統維護和管理&#xff1a;信息處理技術員負責維護和管…

大數據股票簡單分析

目錄標題 內容說明解題量化金融的含義量化交易策略 點擊直接資料領取 內容 1解釋量化金融的含義&#xff0c;調研并給出至少 5種量化交易的策略或方法 2.完成Tushare Pro 的安裝、注冊&#xff0c;獲取自己的 Token&#xff0c;查閱網站內的接口講解和示例; 3通過Python 編程完…