91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

淺論Linux 內(nèi)核函數(shù)調(diào)用關(guān)系的驗證方法

電子工程師 ? 來源:微型機與應(yīng)用第21期 劉志 ? 作者:微型機與應(yīng)用第 ? 2021-04-02 11:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

0 引言

眾所周知Linux是目前公認的最好的開源操作系統(tǒng)。它被廣泛應(yīng)用于各行各業(yè)。因此對Linux內(nèi)核的學(xué)習(xí)就顯得尤為重要。目前對于Linux內(nèi)核的學(xué)習(xí)一般都是通過以下幾個途徑。

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

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

⑶Linux內(nèi)核的源代碼。Linux 的源代碼涵蓋了Linux的所有實現(xiàn)細節(jié),但由于源代碼的數(shù)量非常巨大,所以開發(fā)者往往需要在了解了相關(guān)機制以后才可以定位代碼片段的位置。

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

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

1 相關(guān)實驗工具簡介

本文將利用QEMU[7]搭建一個虛擬機,同時用BusyBox[5]在虛擬機上搭建一個小型Linux文件系統(tǒng),然后用命令行調(diào)試程序DDD[4]來監(jiān)視Linux內(nèi)核的運行情況。

1.1 QEMU簡介

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

1.2 DDD簡介

DDD(Data Display Debugger)是命令行調(diào)試程序,它特有的圖形數(shù)據(jù)顯示功能可以把數(shù)據(jù)結(jié)構(gòu)按照圖形的方式顯示出來。DDD的功能非常強大,可以調(diào)試用C\C++ 、Ada、Fortran、Pascal、Modula-2和Modula-3編寫的程序??梢猿谋痉绞綖g覽源代碼;同時可以進行斷點設(shè)置、顯示各種數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系并由此將數(shù)據(jù)結(jié)構(gòu)以圖形化形式顯示。

1.3 BusyBox簡介

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

2 驗證流程

2.1 實驗環(huán)境

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

2.2 實驗工具搭建說明

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

⑴編譯內(nèi)核

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

⑵安裝QEMU

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

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

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

⑷安裝 BusyBox 到根文件系統(tǒng)

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

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

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

通過以上4個步驟就可以完成Linux內(nèi)核運行驗證系統(tǒng)的搭建。

3 驗證演示實例

3.1 驗證的內(nèi)核模塊

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

6357782753806600002796520.jpg

3.2 DDD中顯示的內(nèi)核運行結(jié)果

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

const struct file_operations def_chr_fops = {

.open = chardev_open,

.llseek = nop_llseek,

};

⑵調(diào)用字符設(shè)備子系統(tǒng)的open函數(shù)進入char_open函數(shù)。相關(guān)代碼如下:

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

struct dev *p;

struct cdev *new =NULL;

int ret = 0;

}

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

if(!kobj)

return -ENXIO;

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

spin_lock(&cdev_lock);

p = inode->i_cdev;

⑷運行內(nèi)核 filip結(jié)構(gòu)體的open函數(shù)。以下為相關(guān)代碼:

if(filp->f_op->open){

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

if(ret)

goto out_cdev_put;

}

通過DDD對Linux內(nèi)核運行的檢測結(jié)果發(fā)現(xiàn),Linux內(nèi)核中TTY子系統(tǒng)的打開操作的流程與我們通過源代碼分析出來的結(jié)論是一致的。從而驗證了我們流程圖的正確性。

4 結(jié)束語

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

參考文獻

[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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    321

    瀏覽量

    23219
  • ddd
    ddd
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    3108
  • 函數(shù)調(diào)用
    +關(guān)注

    關(guān)注

    0

    文章

    20

    瀏覽量

    2752
  • qemu
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    5946
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Linux內(nèi)核驅(qū)動開發(fā)的技術(shù)核心精要

    根據(jù)平臺選擇。 五、調(diào)試與移植:內(nèi)核開發(fā)的雙翼 調(diào)試工具鏈決定問題定位效率:printk基礎(chǔ)但易影響時序;Oops/Panic信息是分析崩潰的關(guān)鍵;ftrace可追蹤函數(shù)調(diào)用、中斷延遲
    發(fā)表于 03-10 13:56

    Linux內(nèi)核伙伴系統(tǒng)內(nèi)存申請函數(shù)詳解:從原理到實戰(zhàn)

    Linux 內(nèi)核中,內(nèi)存管理是整個系統(tǒng)穩(wěn)定運行的基石,而伙伴系統(tǒng)(Buddy System) 作為內(nèi)核物理內(nèi)存分配的核心機制,更是驅(qū)動開發(fā)、內(nèi)核模塊開發(fā)的必備知識點。它通過 "2
    的頭像 發(fā)表于 02-10 16:58 ?3639次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>伙伴系統(tǒng)內(nèi)存申請<b class='flag-5'>函數(shù)</b>詳解:從原理到實戰(zhàn)

    Linux系統(tǒng)內(nèi)核參數(shù)調(diào)優(yōu)實戰(zhàn)指南

    Linux 內(nèi)核參數(shù)調(diào)優(yōu)是系統(tǒng)性能優(yōu)化的核心環(huán)節(jié)。隨著云原生架構(gòu)的普及和硬件性能的飛速提升,默認的內(nèi)核參數(shù)配置往往無法充分發(fā)揮系統(tǒng)潛力。在高并發(fā) Web 服務(wù)、大數(shù)據(jù)處理、容器化部署等場景下,合理的
    的頭像 發(fā)表于 01-28 14:27 ?462次閱讀

    【「Linux 設(shè)備驅(qū)動開發(fā)(第 2 版)」閱讀體驗】+讀深入理解Linux內(nèi)核內(nèi)存分配

    *kmalloc(size_t size, int flags);”函數(shù)。 通過對這章的學(xué)習(xí),深刻體會到Linux內(nèi)核的內(nèi)存分配管理機制博大精深,有些知識點還是初次觸碰到,當(dāng)然也有一些耳熟能詳?shù)母拍睿热纭皩?/div>
    發(fā)表于 01-16 20:05

    【「Linux 設(shè)備驅(qū)動開發(fā)(第 2 版)」閱讀體驗】Linux內(nèi)核開發(fā)基礎(chǔ)

    ,本文介紹Linux內(nèi)核開發(fā)基礎(chǔ) 處理內(nèi)核的核心輔助函數(shù) Linux內(nèi)核加鎖機制和共享資源 無論
    發(fā)表于 01-12 22:45

    【「Linux 設(shè)備驅(qū)動開發(fā)(第 2 版)」閱讀體驗】+讀內(nèi)核處理的核心輔助函數(shù)

    理解Linux內(nèi)核時間管理”知識點。 Linux內(nèi)核時間管理部分,作者圖文并茂,詳細介紹了其實現(xiàn)流程。 通過對這幾章節(jié)的學(xué)習(xí),體會到作者在知識點介紹方面承上啟下,層層深入,由常見的
    發(fā)表于 01-10 22:08

    ElfBoard嵌入式教育科普|Linux系統(tǒng)I/O接口:Open函數(shù)詳解

    1.函數(shù)概述open()是Linux/Unix內(nèi)核提供的底層系統(tǒng)調(diào)用,核心功能是打開或創(chuàng)建文件。成功調(diào)用后,
    的頭像 發(fā)表于 12-29 11:41 ?1064次閱讀
    ElfBoard嵌入式教育科普|<b class='flag-5'>Linux</b>系統(tǒng)I/O接口:Open<b class='flag-5'>函數(shù)</b>詳解

    基于 DR1M90 的 Linux-RT 內(nèi)核開發(fā):從編譯配置到 GPIO / 按鍵應(yīng)用實現(xiàn)(1)

    本手冊由創(chuàng)龍科技研發(fā),針對 DR1M90,詳述 Linux-RT 實時內(nèi)核開發(fā):含實時性測試(LinuxLinux-RT 對比、CPU 空載 / 滿負荷 / 隔離狀態(tài)測試)、
    的頭像 發(fā)表于 12-02 10:38 ?1196次閱讀
    基于 DR1M90 的 <b class='flag-5'>Linux</b>-RT <b class='flag-5'>內(nèi)核</b>開發(fā):從編譯配置到 GPIO / 按鍵應(yīng)用實現(xiàn)(1)

    Linux內(nèi)核模塊的加載機制

    使用insmod或modprobe命令來加載模塊。insmod是直接加載,而modprobe會處理依賴關(guān)系。 2、如何工作 那內(nèi)核模塊具體是怎么工作的呢?當(dāng)執(zhí)行insmod時,會調(diào)用系統(tǒng)調(diào)用
    發(fā)表于 11-25 06:59

    Linux內(nèi)核printk日志級別全解析:從參數(shù)解讀到實操配置

    一、開篇:一個命令引出的核心問題 在?Linux?終端執(zhí)行?cat /proc/sys/kernel/printk,你可能會看到這樣的輸出: 這串?dāng)?shù)字不是隨機的,而是內(nèi)核日志系統(tǒng)的“核心配置開關(guān)
    的頭像 發(fā)表于 11-20 15:54 ?1715次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>printk日志級別全解析:從參數(shù)解讀到實操配置

    探索操作系統(tǒng)底層的關(guān)鍵接口

      在linux中,將程序的運行空間分為內(nèi)核空間與用戶空間(內(nèi)核態(tài)和用戶態(tài)),在邏輯上它們之間是相互隔離的,因此用戶程序不能訪問內(nèi)核數(shù)據(jù),也無法使用
    的頭像 發(fā)表于 11-08 12:42 ?752次閱讀

    深入了解系統(tǒng)調(diào)用API:探索操作系統(tǒng)底層的關(guān)鍵接口

    ,也無法使用內(nèi)核函數(shù)。當(dāng)用戶進程必須訪問內(nèi)核或使用某個內(nèi)核函數(shù)時,就得使用系統(tǒng)調(diào)用(System
    的頭像 發(fā)表于 11-03 09:20 ?717次閱讀

    如何配置和驗證Linux內(nèi)核參數(shù)

    Linux系統(tǒng)運維和性能優(yōu)化中,內(nèi)核參數(shù)(sysctl)的配置至關(guān)重要。合理的參數(shù)調(diào)整可以顯著提升網(wǎng)絡(luò)性能、系統(tǒng)穩(wěn)定性及資源利用率。然而,僅僅修改參數(shù)是不夠的,如何驗證這些參數(shù)是否生效同樣關(guān)鍵。
    的頭像 發(fā)表于 05-29 17:40 ?1167次閱讀

    如何在Linux內(nèi)核5.18版本之后和64位架構(gòu)中從內(nèi)核空間調(diào)用ioctl?

    我嘗試在最近的內(nèi)核中重新構(gòu)建以前版本 (4.19) 的 Linux 設(shè)備驅(qū)動程序,即嵌入式平臺上的 6.1.22,ARM64 架構(gòu)。 驅(qū)動程序管理 tty 設(shè)備。 當(dāng)我調(diào)用類似于用戶空間
    發(fā)表于 04-02 06:06

    樹莓派4 性能大比拼:標準Linux與實時Linux 4.19內(nèi)核的延遲測試

    引言本文是對我之前關(guān)于RaspberryPi3同一主題的帖子的更新。與之前的帖子一樣,我使用的是隨Raspbian鏡像提供的標準內(nèi)核,以及應(yīng)用了RT補丁的相似內(nèi)核版本。對于實時版,我
    的頭像 發(fā)表于 03-25 09:39 ?838次閱讀
    樹莓派4 性能大比拼:標準<b class='flag-5'>Linux</b>與實時<b class='flag-5'>Linux</b> 4.19<b class='flag-5'>內(nèi)核</b>的延遲測試