欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

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

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

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

0 引言

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

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

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

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

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

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

1 相關(guān)實(shí)驗(yàn)工具簡介

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

1.1 QEMU簡介

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

1.2 DDD簡介

DDD(Data Display Debugger)是命令行調(diào)試程序,它特有的圖形數(shù)據(jù)顯示功能可以把數(shù)據(jù)結(jié)構(gòu)按照圖形的方式顯示出來。DDD的功能非常強(qiáng)大,可以調(diào)試用C\C++ 、Ada、Fortran、Pascal、Modula-2和Modula-3編寫的程序。可以超文本方式瀏覽源代碼;同時(shí)可以進(jìn)行斷點(diǎn)設(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é)合到一個(gè)單一的可執(zhí)行文件。BusyBox提供了一個(gè)比較完善的環(huán)境,可以運(yùn)行任何小的系統(tǒng)或嵌入式系統(tǒng)。

2 驗(yàn)證流程

2.1 實(shí)驗(yàn)環(huán)境

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

2.2 實(shí)驗(yàn)工具搭建說明

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

⑴編譯內(nèi)核

選用Linux Kernel 3.5.4的內(nèi)核版本。在進(jìn)行內(nèi)核代碼的驗(yàn)證之前先要對目標(biāo)內(nèi)核進(jìn)行編譯,用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 命令建立一個(gè)大小為10 MB的磁盤鏡像文件。本實(shí)驗(yàn)內(nèi)核將運(yùn)行在這個(gè)系統(tǒng)上。在完成后掛載剛剛生成的鏡像。在鏡像中建立Linux根目錄下的文件夾dev、proc、sys。

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

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

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

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

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

3 驗(yàn)證演示實(shí)例

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

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

6357782753806600002796520.jpg

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

⑴因?yàn)樵贚inux內(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ù)進(jìn)入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è)備,如果找不到這個(gè)設(shè)備,則返回錯(cuò)誤。其內(nèi)核代碼如下所示:

if(!kobj)

return -ENXIO;

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

spin_lock(&cdev_lock);

p = inode->i_cdev;

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

4 結(jié)束語

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

參考文獻(xiàn)

[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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    316

    瀏覽量

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

    關(guān)注

    0

    文章

    23

    瀏覽量

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

    關(guān)注

    0

    文章

    19

    瀏覽量

    2607
  • qemu
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    5412
收藏 人收藏

    評論

    相關(guān)推薦

    如何把兩個(gè)數(shù)據(jù)返回給調(diào)用函數(shù)

    函數(shù)的處理結(jié)果包含兩個(gè)數(shù)據(jù),如何把兩個(gè)數(shù)據(jù)返回給調(diào)用函數(shù)? 第一種,把兩個(gè)數(shù)據(jù)封裝成一個(gè)結(jié)構(gòu)體,函數(shù)返回結(jié)構(gòu)體。 調(diào)用
    的頭像 發(fā)表于 01-08 10:15 ?116次閱讀

    飛凌嵌入式ElfBoard ELF 1板卡-Linux內(nèi)核移植之內(nèi)核簡介

    用戶提供移植好的板級開發(fā)包。板卡廠商也會對移植好的內(nèi)核版本進(jìn)行維護(hù),例如一些BUG修復(fù)或者物料替換。接下來講一下獲取這三種源碼的方法:獲取linux官網(wǎng)源碼地址:https
    發(fā)表于 12-13 09:03

    HAL庫的函數(shù)調(diào)用示例

    HAL(Hardware Abstraction Layer,硬件抽象層)庫是STM32等微控制器中常用的庫,它為開發(fā)者提供了訪問和控制硬件設(shè)備的接口。以下是一些常用的HAL庫函數(shù)及其調(diào)用示例: 一
    的頭像 發(fā)表于 12-02 14:01 ?693次閱讀

    嵌入式工程師都在找的【Linux內(nèi)核調(diào)試技術(shù)】建議收藏!

    Linux內(nèi)核調(diào)試器(KDB) KDB是Linux內(nèi)核的一個(gè)補(bǔ)丁,提供了一種在系統(tǒng)運(yùn)行時(shí)對內(nèi)核內(nèi)存和數(shù)據(jù)結(jié)構(gòu)進(jìn)行檢查的
    發(fā)表于 11-28 15:37

    什么叫系統(tǒng)的頻率響應(yīng)函數(shù)?它和傳遞函數(shù)有何關(guān)系

    系統(tǒng)的頻率響應(yīng)函數(shù)(Frequency Response Function, FRF)是描述線性時(shí)不變(Linear Time-Invariant, LTI)系統(tǒng)在不同頻率下輸入和輸出之間關(guān)系的數(shù)學(xué)
    的頭像 發(fā)表于 10-18 09:29 ?2446次閱讀

    壓敏電阻壓力與電阻函數(shù)關(guān)系

    壓敏電阻(也稱為力敏電阻)是一種將機(jī)械力轉(zhuǎn)換為電信號的元件,其電阻值隨外部壓力的變化而變化。這種變化關(guān)系通??梢酝ㄟ^實(shí)驗(yàn)測定,并可以近似地用數(shù)學(xué)函數(shù)來表示。然而,需要注意的是,具體的函數(shù)關(guān)系
    的頭像 發(fā)表于 09-25 09:30 ?992次閱讀

    linux驅(qū)動程序如何加載進(jìn)內(nèi)核

    Linux系統(tǒng)中,驅(qū)動程序是內(nèi)核與硬件設(shè)備之間的橋梁。它們允許內(nèi)核與硬件設(shè)備進(jìn)行通信,從而實(shí)現(xiàn)對硬件設(shè)備的控制和管理。 驅(qū)動程序的編寫 驅(qū)動程序的編寫是Linux驅(qū)動開發(fā)的基礎(chǔ)。在編
    的頭像 發(fā)表于 08-30 15:02 ?609次閱讀

    linux驅(qū)動程序的編譯方法是什么

    Linux驅(qū)動程序的編譯方法主要包括兩種: 與內(nèi)核一起編譯 和 編譯成獨(dú)立的內(nèi)核模塊 。以下是對這兩種方法的介紹: 一、與
    的頭像 發(fā)表于 08-30 14:46 ?775次閱讀

    linux驅(qū)動程序的編譯方法有哪兩種

    Collection)或其他C/C++編譯器來編譯源代碼文件。這種方法較為原始,需要開發(fā)者手動指定編譯器選項(xiàng)、包含路徑、庫文件等。然而,在Linux驅(qū)動開發(fā)中,由于驅(qū)動需要與內(nèi)核緊密集成,直接使用GCC編譯往往不夠方便,因?yàn)樾?/div>
    的頭像 發(fā)表于 08-30 14:39 ?922次閱讀

    Linux內(nèi)核測試技術(shù)

    Linux 內(nèi)核Linux操作系統(tǒng)的核心部分,負(fù)責(zé)管理硬件資源和提供系統(tǒng)調(diào)用接口。隨著 Linux 內(nèi)
    的頭像 發(fā)表于 08-13 13:42 ?604次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>測試技術(shù)

    Linux內(nèi)核中的頁面分配機(jī)制

    Linux內(nèi)核中是如何分配出頁面的,如果我們站在CPU的角度去看這個(gè)問題,CPU能分配出來的頁面是以物理頁面為單位的。也就是我們計(jì)算機(jī)中常講的分頁機(jī)制。本文就看下Linux內(nèi)核是如何管
    的頭像 發(fā)表于 08-07 15:51 ?363次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>中的頁面分配機(jī)制

    歡創(chuàng)播報(bào) 華為宣布鴻蒙內(nèi)核已超越Linux內(nèi)核

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

    使用 PREEMPT_RT 在 Ubuntu 中構(gòu)建實(shí)時(shí) Linux 內(nèi)核

    盟通技術(shù)干貨構(gòu)建實(shí)時(shí)Linux內(nèi)核簡介盟通技術(shù)干貨Motrotech如果需要在Linux中實(shí)現(xiàn)實(shí)時(shí)計(jì)算性能,進(jìn)而有效地將Linux轉(zhuǎn)變?yōu)镽TOS,那么大多數(shù)發(fā)行版都可以打上名為PREE
    的頭像 發(fā)表于 04-12 08:36 ?2823次閱讀
    使用 PREEMPT_RT 在 Ubuntu 中構(gòu)建實(shí)時(shí) <b class='flag-5'>Linux</b> <b class='flag-5'>內(nèi)核</b>

    函數(shù)多層調(diào)用的主要注意事項(xiàng)分析

    應(yīng)用方案設(shè)計(jì)中,開發(fā)者經(jīng)常會碰到某個(gè)子函數(shù)需要多次多級調(diào)用的情況。
    的頭像 發(fā)表于 03-27 15:36 ?1076次閱讀
    子<b class='flag-5'>函數(shù)</b>多層<b class='flag-5'>調(diào)用</b>的主要注意事項(xiàng)分析

    回調(diào)函數(shù)(callback)是什么?回調(diào)函數(shù)的實(shí)現(xiàn)方法

    回調(diào)函數(shù)是一種特殊的函數(shù),它作為參數(shù)傳遞給另一個(gè)函數(shù),并在被調(diào)用函數(shù)執(zhí)行完畢后被調(diào)用?;卣{(diào)
    發(fā)表于 03-12 11:46 ?3184次閱讀