《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 設(shè)計(jì)應(yīng)用 > Linux 內(nèi)核函數(shù)調(diào)用關(guān)系的驗(yàn)證方法
Linux 內(nèi)核函數(shù)調(diào)用關(guān)系的驗(yàn)證方法
2014年微型機(jī)與應(yīng)用第21期
劉志超,荊 琦
北京大學(xué) 軟件與微電子學(xué)院,,北京100038
摘要: 作為最流行的開源操作系統(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í)動(dòng)態(tài)監(jiān)控技術(shù)卻很少有人了解。本文提供一種動(dòng)態(tài)監(jiān)視內(nèi)核運(yùn)行過程的方法,。通過此方法可以動(dòng)態(tài)地觀察Linux內(nèi)核的函數(shù)調(diào)用情況,,以及CPU寄存器值等動(dòng)態(tài)信息。
Abstract:
Key words :

  摘 要: 作為最流行的開源操作系統(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í)動(dòng)態(tài)監(jiān)控技術(shù)卻很少有人了解,。本文提供一種動(dòng)態(tài)監(jiān)視內(nèi)核運(yùn)行過程的方法。通過此方法可以動(dòng)態(tài)地觀察Linux內(nèi)核的函數(shù)調(diào)用情況,,以及CPU寄存器值等動(dòng)態(tài)信息,。

  關(guān)鍵詞: Linux內(nèi)核;實(shí)時(shí),;動(dòng)態(tài),;函數(shù)調(diào)用

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)核的動(dòng)態(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è)相同的問題就是無法動(dòng)態(tài)實(shí)時(shí)地反應(yīng)內(nèi)核的運(yùn)行情況。而在分析Linux內(nèi)核的運(yùn)行機(jī)制尤其是在遇到通過函數(shù)指針的賦值調(diào)用的情況時(shí)能夠動(dòng)態(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)行動(dòng)態(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)核動(dòng)態(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編寫的程序,??梢猿谋痉绞綖g覽源代碼;同時(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,。

 ?、瓢惭bQEMU

  從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。

 ?、劝惭b 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所示,。

001.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;

  }

 ?、菣z測內(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)行動(dòng)態(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)行動(dòng)態(tài)分析的過程及通過這個(gè)套件捕捉到Linux內(nèi)核函數(shù)指針的動(dòng)態(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]http://www.qemu.org (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]http://www. BusyBox.net (2008).


此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載,。