精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

淺論Linux 內核函數調用關系的驗證方法

電子工程師 ? 來源:微型機與應用第21期 劉志 ? 作者:微型機與應用第 ? 2021-04-02 11:30 ? 次閱讀

摘 要: 作為最流行的開源操作系統Linux在各行各業得到了廣泛的應用。因此了解Linux 內核的架構及工作機制就顯得非常重要。然而目前對Linux 內核的主要學習途徑是各種教科書以及經驗博客,而對于Linux內核的實時動態監控技術卻很少有人了解。本文提供一種動態監視內核運行過程的方法。通過此方法可以動態地觀察Linux內核的函數調用情況,以及CPU寄存器值等動態信息

0 引言

眾所周知Linux是目前公認的最好的開源操作系統。它被廣泛應用于各行各業。因此對Linux內核的學習就顯得尤為重要。目前對于Linux內核的學習一般都是通過以下幾個途徑。

⑴通過經典教材,這些教材一般由著名的Linux 內核開發者編寫。比較常用的如參考文獻[1-3] 。通過這些教材讀者可以從宏觀的角度去了解Linux內核的整體架構以及運行機制。但是由于教科書只能提供基于作者理解的內核架構,讀者無法從中獲得直觀的內核的動態運行狀況,而這點對加深內核的理解是非常有益的。

⑵通過Linux內核的郵件列表,Linux 的開發者可以從這些列表中與其他開發者交流遇到的問題。

⑶Linux內核的源代碼。Linux 的源代碼涵蓋了Linux的所有實現細節,但由于源代碼的數量非常巨大,所以開發者往往需要在了解了相關機制以后才可以定位代碼片段的位置。

以上提到的是目前了解和學習Linux內核的一些主要途徑,通過這些途徑可以了解內核的大體運行機制。然而這些方法都存在一個相同的問題就是無法動態實時地反應內核的運行情況。而在分析Linux內核的運行機制尤其是在遇到通過函數指針的賦值調用的情況時能夠動態實時地檢測內核的運行情況是非常必要的。

本文將介紹一種基于 DDD (Data Display Debugger)[4]、 BusyBox [5]、QEMU(Quick Emulator)[6]工具來對Linux內核代碼運行進行動態檢測的方法。

1 相關實驗工具簡介

本文將利用QEMU[7]搭建一個虛擬機,同時用BusyBox[5]在虛擬機上搭建一個小型Linux文件系統,然后用命令行調試程序DDD[4]來監視Linux內核的運行情況。

1.1 QEMU簡介

QEMU[7]是一套由Fabrice Bellard所編寫的模擬處理器的自由軟件。QEMU能模擬至接近真實電腦的速度。通過QEMU可以建立一個運行目標內核的輕量級的虛擬機,并可以像調試普通應用程序一樣對虛擬機中的內核代碼進行單步調試,從而可以很清楚地看到代碼跳轉過程、CPU寄存器的變化、內核堆棧的變化等內核動態運行信息。

1.2 DDD簡介

DDD(Data Display Debugger)是命令行調試程序,它特有的圖形數據顯示功能可以把數據結構按照圖形的方式顯示出來。DDD的功能非常強大,可以調試用C\C++Ada、Fortran、Pascal、Modula-2和Modula-3編寫的程序。可以超文本方式瀏覽源代碼;同時可以進行斷點設置、顯示各種數據結構之間的關系并由此將數據結構以圖形化形式顯示。

1.3 BusyBox簡介

BusyBox集成壓縮了 Linux 的許多工具和命令,也包含了 Android 系統的自帶的shell。BusyBox將許多具有共性的小版本的Unix工具結合到一個單一的可執行文件。BusyBox提供了一個比較完善的環境,可以運行任何小的系統或嵌入式系統

2 驗證流程

2.1 實驗環境

本文將在Linux發行版Ubuntu 12.04上搭建實驗工具。

2.2 實驗工具搭建說明

這個工具套件的環境搭建由以下幾個步驟組成:

⑴編譯內核

選用Linux Kernel 3.5.4的內核版本。在進行內核代碼的驗證之前先要對目標內核進行編譯,用wget命令從內核服務器下載3.5.4版本的內核,在對其編譯之后就能獲得內核鏡像文件bzImage。

⑵安裝QEMU

從QEUM的官方網站[5]上下載QEMU的最新源碼文件。而后切換到 QEMU 的源碼目錄輸入./configure生成 makefile 文件。在完成后輸入編譯命令make 開始編譯QEMU。最后用make install命令將QEMU安裝到系統中。

⑶制作根文件系統

利用DD 命令建立一個大小為10 MB的磁盤鏡像文件。本實驗內核將運行在這個系統上。在完成后掛載剛剛生成的鏡像。在鏡像中建立Linux根目錄下的文件夾dev、proc、sys。

⑷安裝 BusyBox 到根文件系統

在BusyBox的官方網站[8]上下載最新的BusyBox 源碼。切換到BusyBox的源碼目錄,輸入命令 make menuconfig 配置編譯選項。

在彈出的配置菜單中勾選靜態編譯的選項(BusyBox Settings→Build options→Build BusyBox as a static binary)。

完成后輸入命令make 開始編譯。最后用命令make install 把編譯好的BusyBox文件系統安裝到剛剛生成的鏡像根文件系統中。

通過以上4個步驟就可以完成Linux內核運行驗證系統的搭建。

3 驗證演示實例

3.1 驗證的內核模塊

在本文中將演示驗證Linux 內核中虛擬終端(TTY)子系統open操作的運行流程。通過閱讀源代碼,總結出TTY子系統open操作的主要流程如圖1所示。

6357782753806600002796520.jpg

3.2 DDD中顯示的內核運行結果

⑴因為在Linux內核中TTY設備被歸于字符型設備,所以TTY初始化的第一步是將申請的設備描述結構體的open操作函數指針(def_chrfops->chrdec_open)賦值成字符設備open函數(chrdev_open)的函數指針。 程序代碼如下:

const struct file_operations def_chr_fops = {

.open = chardev_open,

.llseek = nop_llseek,

};

⑵調用字符設備子系統的open函數進入char_open函數。相關代碼如下:

static int chardev_open(struct *inode,struct file *filp){

struct dev *p;

struct cdev *new =NULL;

int ret = 0;

}

⑶檢測內核kobject鏈表是否有TTY設備,如果找不到這個設備,則返回錯誤。其內核代碼如下所示:

if(!kobj)

return -ENXIO;

new = container_of(kobj, struct codec,kobj);

spin_lock(&cdev_lock);

p = inode->i_cdev;

⑷運行內核 filip結構體的open函數。以下為相關代碼:

if(filp->f_op->open){

ret = filp->f_op->open(inode,filp);

if(ret)

goto out_cdev_put;

}

通過DDD對Linux內核運行的檢測結果發現,Linux內核中TTY子系統的打開操作的流程與我們通過源代碼分析出來的結論是一致的。從而驗證了我們流程圖的正確性。

4 結束語

本文介紹了一個基于DDD、QEMU、BusyBox工具套件,對Linux內核進行動態檢測的方法。通過該方法能夠對這個Linux內核的實時運行情況進行監測,從而使內核學習者和研究者對Linux 的整個運行機制有了立體的了解,對內核的運行有直觀深刻的印象。本文還以虛擬終端(TTY)子系統open操作為例進行了完整的分析。展示了這個方法對一個具體的應用場景進行動態分析的過程及通過這個套件捕捉到Linux內核函數指針的動態賦值及調用過程。

參考文獻

[1] Bovet D P, Cesati M. Understanding the Linux Kernel [M]. O'Reilly,2006.

[2] Wolfgang Mauerer.Professional Linux Kernel Architecture [M]. Wiley India Pvt. Limited, 2008.

[3] Robert Love. Linux Kernel Development [M]. Addison-Wesley Professional, 2010.

[4] Zeller A, Lütkehaus D. DDD-a free graphical front-end for UNIX debuggers [J]. ACM Sigplan Notices [C]. 1996, 31(1): 22-27.

[5] Bellard, Fabrice. QEMU open source processor emulator [OL]. (2007-04-03)[2014-07-15] (2007).

[6] Wells N. BUSYBOX: A swiss army knife for Linux [J]. Linux Journal, 2000, 2000(78es): 10.

[7] Fabrice B. QEMU, a fast and portable dynamic translator[C]. USENIX Annual Technical Conference, FREENIX Track, 2005.

[8] Andersen, Erik. BusyBox[OL]. (2008-01-19)[2014-07-15] BusyBox.net (2008).

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • LINUX內核
    +關注

    關注

    1

    文章

    316

    瀏覽量

    21619
  • ddd
    ddd
    +關注

    關注

    0

    文章

    23

    瀏覽量

    2919
  • 函數調用
    +關注

    關注

    0

    文章

    19

    瀏覽量

    2584
  • qemu
    +關注

    關注

    0

    文章

    57

    瀏覽量

    5334
收藏 人收藏

    評論

    相關推薦

    壓敏電阻壓力與電阻函數關系

    壓敏電阻(也稱為力敏電阻)是一種將機械力轉換為電信號的元件,其電阻值隨外部壓力的變化而變化。這種變化關系通常可以通過實驗測定,并可以近似地用數學函數來表示。然而,需要注意的是,具體的函數關系
    的頭像 發表于 09-25 09:30 ?519次閱讀

    linux驅動程序如何加載進內核

    Linux系統中,驅動程序是內核與硬件設備之間的橋梁。它們允許內核與硬件設備進行通信,從而實現對硬件設備的控制和管理。 驅動程序的編寫 驅動程序的編寫是Linux驅動開發的基礎。在編
    的頭像 發表于 08-30 15:02 ?387次閱讀

    linux驅動程序的編譯方法是什么

    Linux驅動程序的編譯方法主要包括兩種: 與內核一起編譯 和 編譯成獨立的內核模塊 。以下是對這兩種方法的介紹: 一、與
    的頭像 發表于 08-30 14:46 ?438次閱讀

    Linux內核測試技術

    Linux 內核Linux操作系統的核心部分,負責管理硬件資源和提供系統調用接口。隨著 Linux
    的頭像 發表于 08-13 13:42 ?438次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>測試技術

    歡創播報 華為宣布鴻蒙內核已超越Linux內核

    1 華為宣布鴻蒙內核已超越Linux內核 ? 6月21日,在華為開發者大會上, HarmonyOS NEXT(鴻蒙NEXT)——真正獨立于安卓和iOS的鴻蒙操作系統,正式登場。這是HarmonyOS
    的頭像 發表于 06-27 11:30 ?789次閱讀

    函數多層調用的主要注意事項分析

    應用方案設計中,開發者經常會碰到某個子函數需要多次多級調用的情況。
    的頭像 發表于 03-27 15:36 ?740次閱讀
    子<b class='flag-5'>函數</b>多層<b class='flag-5'>調用</b>的主要注意事項分析

    回調函數(callback)是什么?回調函數的實現方法

    回調函數是一種特殊的函數,它作為參數傳遞給另一個函數,并在被調用函數執行完畢后被調用。回調
    發表于 03-12 11:46 ?2725次閱讀

    linux用gdb調試遇到函數調用怎么辦?

    linux用gdb調試遇到函數調用怎么辦? 在Linux上使用GDB調試時,遇到函數調用是一個常
    的頭像 發表于 01-31 10:33 ?691次閱讀

    Linux內核中信號相關的系統調用

    ,sys_sigaction()和sys_rt_sigaction()幾乎相同,因此C庫中包含的sigaction()包裝函數最終會調用sys_rt_sigaction()而不是sys_sigaction()。
    的頭像 發表于 01-20 09:34 ?663次閱讀

    Linux內核中信號的傳遞過程

    前面我們已經介紹了內核注意到信號的到來,調用相關函數更新進程描述符以便進程接收處理信號。但是,如果目標進程此時沒有運行,內核則推遲傳遞信號。現在,我們看看
    的頭像 發表于 01-17 09:51 ?1080次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>中信號的傳遞過程

    Linux內核中信號詳解

    ? 1 信號的角色 1.1 x86/64架構信號定義 1.2 ARM架構信號定義 1.3 RISC-V架構信號定義 1.4 信號的系統調用 1.5 信號工作原理 2 信號的響應行為 3 POSIX
    的頭像 發表于 01-13 09:40 ?1333次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>中信號詳解

    linux內核系統調用之參數傳遞

    與普通函數一樣,系統調用通常需要一些輸入/輸出參數,這些參數可能包括實際值(即數字)、用戶模式進程地址空間中的變量地址,甚至包括指向用戶模式函數指針的數據結構的地址(參見第11章“信號相關的系統
    的頭像 發表于 12-20 09:32 ?1480次閱讀

    Linux系統中調用腳本的常見方法

    linux系統中有多種方法可以在系統啟動后調用腳本,接下來介紹幾種常見的方法
    的頭像 發表于 12-13 18:16 ?1006次閱讀

    獲取Linux內核源碼的方法

    (ELF1/ELF1S開發板及顯示屏)Linux內核是操作系統中最核心的部分,它負責管理計算機硬件資源,并提供對應用程序和其他系統組件的訪問接口,控制著計算機的內存、處理器、設備驅動程序和文件系統等
    的頭像 發表于 12-13 09:49 ?625次閱讀
    獲取<b class='flag-5'>Linux</b><b class='flag-5'>內核</b>源碼的<b class='flag-5'>方法</b>

    Linux內核自解壓過程分析

    uboot完成系統引導以后,執行環境變量bootm中的命令;即,將Linux內核調入內存中并調用do_bootm函數啟動內核,跳轉至kern
    的頭像 發表于 12-08 14:00 ?876次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>自解壓過程分析