如何調試Linux內核?

通過創建一個最小的根文件系統,并使用QEMU和GDB進行調試。

1.準備工作環境

確保系統上安裝了所有必要的工具和依賴項。

sudo apt-get update    //更新一下軟件包
sudo apt-get install build-essential git libncurses-dev bison flex libssl-dev qemu-system-x86 gdb busybox-static
  • sudo apt-get install build-essential:安裝編譯工具鏈,其中包含了gcc(GNU編譯器集合,用于C/C++程序)、g++(GNU C++編譯器)、make(構建工具,用于自動化編譯和安裝)、libc-dev(C標準庫的開發文件)。

  • git:分布式版本控制系統。
  • libncurses-dev:提供字符終端處理庫的開發文件。在編譯和配置內核的時候,需要依賴此庫。
  • bison:GNU解析器生成器。用于生成語法分析器(Parser),在編譯內核時可能會使用。
  • flex:快速詞法分析器生成器。配合bison使用。
  • libssl-dev:解密一些協議,在內核模塊可能使用。
  • qemu-system-x86:QEMU的x86系統模擬器。用于模擬x86架構的虛擬機,支持運行操作系統內核或完整系統。
  • gdb:GNU調試器。用于調試C/C++程序,支持設置斷點、單步執行、查看變量和內存,與QEMU配合使用,調試Linux內核。
  • busybox-static:靜態編譯的BusyBox工具集,提供一組精簡的Unix工具,將所有依賴庫都包含在可執行文件中,無需外部依賴。

2.獲取并配置Linux內核源碼

先進入到一個目錄下,然后自己克隆就可以了

git clone https://github.com/torvalds/linux.git
cd linux

3.配置內核

為了簡化過程,可以使用默認配置并啟動調試信息:

make defconfig

在Linux源代碼中,找到 .config 文件,然后“Ctrl + f”啟動搜索鍵,搜索調試信息“CONFIG_DEBUG_INFO”,然后可能會出現“CONFIG_DEBUG_INFO_NODE”,你就把他注釋了。然后你進行編譯“make -j4”,啟動四個內核進行編譯,提高速度,但是會出現四個調試選項,是因為你把之前個給注釋了,在這里你要選擇與“CONFIG_DEBUG_INFO”相關的。之后就會成功編譯。

編譯成功后,你應該能找到兩個文件:

  • arch/x86/boot/bzImage:這是內核映像文件。
  • vmlinux:這是未壓縮的內核映像文件,用于GDB調試。

4.創建最小的根文件系統

4.1準備目錄結構

創建一個目錄來存放根文件系統的文件:

mkdir -p ~/Compiler-2/rootfs   //具體路徑視情況而定
cd ~/Compiler-2/rootfs
mkdir -p bin sbin etc proc sys usr/bin usr/sbin
ln -s bin sbin
  • bin:存放系統的基本指令(二進制可執行文件),這些命令對所有用戶可用。
  • sbin:存放系統管理員使用的管理命令(二進制可執行文件),通常需要root權限才能執行。
  • etc:存放系統的配置文件,包括一些用戶信息,網絡配置等
  • proc:一個虛擬文件系統,提供內核和進程信息的接口。它不占用磁盤空間,而是由內核動態生成。包括CPU信息、內存信息等
  • sys:一個虛擬文件系統,提供內核和硬件設備的配置接口。與proc類似,它也是由內核動態生成的。用來配置內核參數、管理設備等
  • usr/bin:存放用戶安裝的命令和應用程序(二進制可執行文件)。gcc、vim等
  • usr/sbin:存放用戶安裝的系統管理命令(二進制可執行文件),通常需要root權限才能執行、

第三行創建的很多目錄是Linux文件系統層次結構標準(FHS)的一部分。

第四行命令的作用是創建一個 符號鏈接(symbolic link),將sbin目錄軟鏈接到bin目錄。因為在某些情況下,bin和sbin目錄的內容可能會相同或相似,通過將sbin鏈接到bin,可以節省空間,方便統一管理,之后也就不需要區分這兩個目錄,也可以簡化路徑。

4.2復制BuysBox二進制文件

復制BusyBox二進制文件到根文件系統目錄:

cp $(which busybox) bin/

將當前目錄下 bin/ 目錄中的 busybox 可執行文件所支持的所有工具,以符號鏈接的形式安裝到指定目錄中(其實就是默認當前目錄下的 bin/ 目錄)。其中-s是 --install 選項的子選項,表示創建符號鏈接而不是硬鏈接(hard link)。

./bin/busybox --install -s

4.3創建 init 腳本

在根文件系統中創建一個簡單的初始化腳本(init script)來啟動shell:

創建一個名為 init 的文件,并將 #!/bin/sh 寫入文件的第一行。其中?#!/bin/sh 是腳本的 shenbang,指定腳本使用 /bin/sh(Bourne Shell)作為解釋器。

echo '#!/bin/sh' > init

將?mount -t proc none /proc 追加到 init 文件中。mount -t proc none /proc 掛載 proc 文件系統打破 /proc 目錄。proc文件系統提供了內核和進程信息的接口,是Linux系統的重要組成部分。>> init將輸出追加到init文件中,不會覆蓋原有內容。

echo 'mount -t proc none /proc' >> init

sysfs文件系統提供了內核和硬件設備的配置接口,通常用于管理設備和內核模塊。

echo 'mount -t sysfs none /sys' >> init

exec sh 是啟動一個交互式的Shell。exec 用新的進程替換當前進程。這行代碼的作用是讓系統在初始化完成后進入一個交互式的 Shell 環境,方便用戶操作或調試。

echo 'exec sh' >> init

為 init 文件添加可執行權限。這行代碼的作用是讓 init 文件可以被執行。因為在Linux系統中,腳本文件必須具有可執行權限才能直接運行。

chmod +x init

4.4 打包成 cpio 歸檔

將 rootfs 目錄打包成一個 cpio 歸檔文件,并使用 gzip 壓縮,最終生成一個壓縮的根文件系統映像文件 rootfs.cpio.gz。

cd ~/Compiler-2
find rootfs | cpio -o --format=newc | gzip > rootfs.cpio.gz

最后在我的電腦上,輸出 1 block,表示 cpio 歸檔文件中只包含一個塊的數據(512字節)。

5.使用QEMU啟動內核

在第一個終端窗口中運行一下命令啟動QEMU:

qemu-system-x86_64 \-kernel arch/x86/boot/bzImage \-append nokaslr\-s -S \-m 2024
  • qemu-system-x86_64:這是QEMU的可執行文件,用于模擬x86_64架構的虛擬機
  • -kernel linux/arch/x86/boot/bzImage:指定要啟動的Linux內核鏡像文件(在上面編譯的時候也提到了)
  • -s:啟用 GDB 調試服務器,默認監聽端口 1234
  • -S:啟動時暫停CPU,等待GDB連接。
  • -m 2024 :給虛擬機分配2024MB? ?//可加可不加

6.啟動GDB連接QEMU進行調試

在第二個終端窗口中啟動GDB并連接到QEMU:

cd ~/Compiler-2/linux-6.1
gdb vmlinux
(gdb) target remote localhost:1234
(gdb) continue

之后你就可以使用gdb打斷點進行調試了。(*^▽^*)

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

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

相關文章

Java 調試模式下 Redisson 看門狗失效

一、場景分析 前幾天在做分布式鎖測試: 在調試模式下,lock.lock() 之后打上斷點,想測試一下在當前線程放棄鎖之前,別的線程能否獲取得到鎖。 發現調試模式下,看門狗機制失效了,Redis 上 30 秒后&#xff0…

GPT-4.5震撼登場,AI世界再掀波瀾!(3)

GPT-4.5震撼登場,AI世界再掀波瀾! GPT-4.5震撼登場,AI世界再掀波瀾!(2) (一)倫理困境:如何抉擇 GPT-4.5 的強大功能在為我們帶來諸多便利的同時,也引發了一系列深刻的倫理問題,這些問題猶如高…

【數據挖掘】Pandas

Pandas 是 Python 進行 數據挖掘 和 數據分析 的核心庫之一,提供了強大的 數據清洗、預處理、轉換、分析 和 可視化 功能。它通常與 NumPy、Matplotlib、Seaborn、Scikit-Learn 等庫結合使用,幫助構建高效的數據挖掘流程。 📌 1. 讀取數據 P…

七、JOIN 語法詳解與實戰示例

一、JOIN 的作用與分類 JOIN 操作用于合并兩個或多個表的行,基于表之間的關聯字段。以下是常見的 JOIN 類型: JOIN 類型描述INNER JOIN返回兩個表匹配的記錄LEFT JOIN返回左表所有記錄 右表匹配記錄(右表無匹配則為NULL)RIGHT …

2019年01月全國POI數據分享(同源歷史POI分享系列)

2019年01月全國范圍POI數據 2019年01月份全國范圍歷史POI數據,全國范圍所有類別共59336781個POI 2019年01月全國范圍POI數據按大類統計 大類代碼大類名稱2019年01月該類POI數量010000汽車服務1151164020000汽車銷售213647030000汽車維修517367040000摩托車服務1800…

Spring Boot + MyBatis 實現 RESTful API 的完整流程

后端開發:Spring Boot 快速開發實戰 引言 在現代后端開發中,Spring Boot 因其輕量級、快速開發的特性而備受開發者青睞。本文將帶你從零開始,使用 Spring Boot MyBatis 實現一個完整的 RESTful API,并深入探討如何優雅地處理異…

使用Python開發以太坊智能合約:輕松入門與深度探索

使用Python開發以太坊智能合約:輕松入門與深度探索 隨著區塊鏈技術的快速發展,以太坊作為最為成熟和廣泛使用的智能合約平臺,成為了開發去中心化應用(DApp)的核心工具。智能合約不僅是區塊鏈技術的基礎,更…

ES scroll=1m:表示快照的有效時間為1分鐘。怎么理解

在Elasticsearch中,scroll1m 表示你創建的 scroll 上下文 的有效時間為 1分鐘。這個參數控制了你可以在多長時間內繼續使用這個 scroll_id 來獲取更多的數據。 什么是 Scroll 上下文? 當你使用 scroll API 時,Elasticsearch 會為你的查詢創…

Linux與UDP應用1:翻譯軟件

UDP應用1:翻譯軟件 本篇介紹 本篇基于UDP編程接口基本使用中封裝的服務器和客戶端進行改寫,基本功能如下: 從配置文件dict.txt讀取到所有的單詞和意思客戶端向服務端發送英文服務端向客戶端發送英文對應的中文意思 配置文件內容 下面的內…

Jeecg-Boot 開放接口開發實戰:在 Jeecg-Boot 的jeecg-system-biz中添加一個controller 實現免鑒權數據接口

Jeecg-Boot 開放接口開發實戰:在 Jeecg-Boot 的jeecg-system-biz中添加一個controller 實現免鑒權數據接口 一、場景需求分析 在微服務架構中,常需要快速實現以下兩類接口: 開放接口:無需登錄即可訪問(如數據查詢、…

C++ ++++++++++

初始C 注釋 變量 常量 關鍵字 標識符命名規則 數據類型 C規定在創建一個變量或者常量時,必須要指定出相應的數據類型,否則無法給變量分配內存 整型 sizeof關鍵字 浮點型(實型) 有效位數保留七位,帶小數點。 這個是保…

構建安全的Docker基礎鏡像:從最佳實踐到自動化加固

引言 容器化技術的普及使得Docker鏡像成為軟件交付的核心載體,但鏡像中的安全漏洞、敏感信息泄露和權限配置不當等問題可能引發嚴重風險。本文結合OWASP容器安全指南與一線運維經驗,系統化講解如何構建安全的Docker基礎鏡像,覆蓋鏡像構建、依賴管理、運行時防護全鏈路,并提…

BKA-CNN基于黑翅鳶算法優化卷積神經網絡的數據多特征分類預測Matlab

BKA-CNN基于黑翅鳶算法優化卷積神經網絡的數據多特征分類預測Matlab 目錄 BKA-CNN基于黑翅鳶算法優化卷積神經網絡的數據多特征分類預測Matlab分類效果基本介紹BKA-CNN基于黑翅鳶算法優化卷積神經網絡的數據多特征分類預測一、引言1.1、研究背景和意義1.2、研究現狀1.3、研究目…

SOLID Principle基礎入門

(Robert C. Martin (Uncle Bob)) 什么是SOLID原則? SOLID原則是面向對象編程(OOP)中編寫高質量代碼的指導方針。實際上,即使不使用SOLID原則,僅通過類、繼承、封裝和多態性,也可以讓程序正常運行。那么為…

輕松實現語音生成:GPT-SoVITS V2整合包的遠程訪問操作詳解

文章目錄 前言1.GPT-SoVITS V2下載2.本地運行GPT-SoVITS V23.簡單使用演示4.安裝內網穿透工具4.1 創建遠程連接公網地址 5. 固定遠程訪問公網地址 前言 今天要給大家安利一個絕對能讓你大呼過癮的聲音黑科技——GPT-SoVITS!這款由花兒不哭大佬精心打造的語音克隆神…

Python線程池知多少

目錄 目標 Python版本 官方文檔 概述 線程池 實戰 創建線程池的基本語法 批量提交任務 生產者&消費者模型 目標 掌握線程池的基本概念和使用方法。 Python版本 Python 3.9.18 官方文檔 concurrent.futures — Launching parallel taskshttps://docs.python.org/3…

(轉)SpringBoot和SpringCloud的區別

(轉)SpringBoot和SpringCloud的區別:

中科大 計算機網絡組成原理 1.4 接入網和物理媒體 筆記

一、接入網核心功能與架構 ?核心作用? 接入網是連接用戶終端與核心網絡的橋梁,承擔用戶身份認證、帶寬分配、數據加密等功能,直接影響網絡服務的可靠性和用戶體驗。例如,杭州電視臺的數字人主播通過光纖專線實現零失誤新聞播報,…

阿里云音頻算法崗內推

1、視頻云直播、連麥,點播,短視頻,媒體生產與處理等服務相關的實時/非實時的音頻分析和處理; 2、音頻處理算法,包括多場景降噪、自動增益控制、回聲消除等; 3、音頻特效算法研發,包括變調變速…

如何使用DeepSeek輔助準備面試

前言 又到了金三銀四的時間點了。每年的這個時間點都會出現無數的機遇和機會,但是如何準備面試,應該準備哪些面試題,如何查漏補缺我們的技術面的短板,這是我們每次準備面試的時候,都會遇見的問題。在今年,…