《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 設計應用 > 基于編譯選項的Linux內核交互式圖解軟件設計*
基于編譯選項的Linux內核交互式圖解軟件設計*
2015年微型機與應用第8期
潘朋飛,李素科,荊 琦
(北京大學 軟件與微電子學院,北京 102600)
摘要: Linux內核龐大并且可定制性非常高,而且目前市場上并沒有學習內核的指導軟件。針對Linux內核學習難、配置難等問題,對Linux內核模塊進行了重新的邏輯劃分,提出了“虛目錄”的概念,并在此基礎上,圍繞Linux內核的編譯選項設計并開發了一款學習指導軟件。該軟件為一套內核編譯配置的輔助工具,虛目錄的劃分清晰地展示了內核功能模塊的邏輯劃分,展開虛目錄后,會顯示與此虛目錄功能配置相關的所有編譯配置選項,使用戶了解到該目錄項的功能是通過哪些編譯選項來配置的。編譯配置選項之間存在著編譯依賴關系,本軟件可以從源碼的層次(如函數調用、變量引用等)來解釋編譯依賴關系的具體實現。
Abstract:
Key words :

  摘  要: Linux內核龐大并且可定制性非常高,而且目前市場上并沒有學習內核的指導軟件。針對Linux內核學習難、配置難等問題,對Linux內核模塊進行了重新的邏輯劃分,提出了“虛目錄”的概念,并在此基礎上,圍繞Linux內核的編譯選項設計并開發了一款學習指導軟件。該軟件為一套內核編譯配置的輔助工具,虛目錄的劃分清晰地展示了內核功能模塊的邏輯劃分,展開虛目錄后,會顯示與此虛目錄功能配置相關的所有編譯配置選項,使用戶了解到該目錄項的功能是通過哪些編譯選項來配置的。編譯配置選項之間存在著編譯依賴關系,本軟件可以從源碼的層次(如函數調用、變量引用等)來解釋編譯依賴關系的具體實現。
  關鍵詞: Linux內核;虛目錄;編譯選項;交互式圖解軟件
0 引言
  Linux操作系統以其開源源碼、高性能和高可靠性等諸多優勢在商業服務器和個人桌面系統中得到日益廣泛的應用。近年來,隨著Linux內核的不斷發展和完善,內核變得日趨龐大,想深入了解其模塊的劃分以及各個模塊的功能機制,也變得相對困難。在對Linux體系結構及內核功能模塊間關系分析的基礎上,對Linux內核進行了重新的邏輯架構劃分,形成“虛目錄”,并且將所有內核源碼分配到相應的虛目錄下。同時,Linux內核的可定制性也是非常高的,它有著數以萬計的編譯配置選項,針對不同的需求可以進行相應的配置。但是,如此大數目的編譯配置選項也正是問題的所在,不管是初學者,還是內核的精通者,都無法保證能了解到每個編譯配置選項處于內核的哪個大模塊中,以及編譯選項配置所涉及的文件,等等。通過對內核Kconfig文件的語法分析,識別出所有的編譯選項;通過對Makefile文件的語法分析,解析出每個編譯所需要的源碼文件;根據之前劃分好的虛目錄,以源碼文件作為中介,將編譯選項劃分到相應的虛目錄中。這樣就可以很清楚地知道內核的哪些功能(虛目錄)需要哪些配置選項去配置,以及每個配置選項配置需要涉及哪些文件。為了深入到最底層來了解每個功能以及配置的實現,對文件進行解析,提取出具體函數以及變量的調用關系。虛目錄與編譯選項的關系,通過逐層細化,可以很清晰地體現到底層的函數與變量的關系上,對各個模塊功能的具體實現進行了很好的展示。
  使用本交互式圖解軟件可以從細節上理清Linux的代碼,從宏觀上的邏輯模塊(虛目錄)層層細化到小模塊、編譯選項、文件、函數來快速地認識Linux內核以及內核各個模塊間的關系。
1 虛目錄
  1.1 虛目錄概念
  本軟件是對于Linux內核架構、編譯選項以及各層次關系的詳細展示。Linux內核架構也是整個軟件依托的基礎。但是Linux內核源碼的固有架構(目錄劃分)是相對工程化的,不便于用戶的理解,比如:(1)/kernel文件夾意義不明確,包括多個功能模塊中的內容;(2)對于arch文件夾,實際運行的Linux內核只對應一個架構,并且arch文件夾下的內容與許多其他功能模塊緊密相關;(3)/mm、/virt/kvm等目錄需要繼續細化。
  于是本文提出了虛目錄的思想,虛目錄是與實目錄(即內核源碼的相對路徑)相對應的說法。本文將內核源代碼根據其功能及邏輯關系進行了重新劃分。與實目錄相比,虛目錄體現了內核的邏輯結構,虛目錄按照內核的功能對源碼進行了重新的組織,更人性化,更體現了源碼的相關性和功能性。
  1.2 虛目錄劃分
  對于虛目錄的劃分,主要是從以下4個方面來綜合考慮的:
  (1)重點閱讀了Linux內核源碼[1-6]。眾所周知,功能相關聯或者類似的內核代碼大多都在相同目錄下(比如ext4和btrfs都在fs目錄下),因此Linux內核源碼的組織方式可以作為模塊劃分的一個重要參考;
  (2)參考關于內核的經典書籍(如:《Understanding the Linux Kernel》[1]、《Professional Linux Kernel Architecture》[2]、《Linux內核源代碼情景分析》[3]、《Linux操作系統內核分析》[4]、《Linux內核分析及高級編程》[5]、《Linux內核完全注釋》[6]等),這些書籍的各個章節(比如進程、內存管理、虛擬文件系統)既可作為各個子模塊來進行單獨分析,同時排版上相鄰的章節(比如進程、中斷等)關聯比較緊密,可以考慮劃分到大的模塊中來進行分析;
  (3)參考現有的一些模塊劃分手段,比如主流的五大子系統的劃分:內存管理、進程調度、進程間通信、虛擬文件系統、網絡子系統,以及kernel map圖;
  (4)查看了Linux內核的維護者列表,由相同人員來維護的內容,往往是同一個子模塊,或者是同一模塊的不同子模塊,這可以作為模塊劃分輔助手段,來幫助確定各個模塊的劃分;
  (5)與紅帽、阿里等內核小組負責人進行交流,對于存在疑問、分歧的劃分點進行討論,以保證劃分的合理性。
  虛目錄相對于實目錄,最大的改變在于以下幾點:
  (1)/kernel文件夾:實目錄中,此文件夾的意義并不是很明確,所包含的文件功能涉及很多模塊,需要將其劃分到多個模塊中;
  (2)/arch文件夾:實際運行的Linux系統中只有一種體系架構,任一體系結構中包含的文件也是涉及內核中的各個大模塊的,為了保證其他各個模塊功能的完整性,需要將/arch文件夾下的各個體系架構所包含的文件細分到其他各大模塊中,剩余的common文件應該隸屬于系統管理;
  (3)/mm、/virt/kvm等目錄:內核中有一些這樣的模塊,從它的機制來理解,它應該是架構分層的,但是在實際的源碼中卻并非如此,它將包含的所有文件平級地放在了一個大文件夾下,對于這樣的模塊,本文按照架構和功能對其重新做了劃分;
  (4)將Linux內核分成以下8大模塊:進程管理、內存管理、系統運行、文件系統、網絡模塊、安全模塊、設備管理和虛擬化(各個模塊具體內容可以參看下面的模塊圖);同時,由于各個大模塊的功能和復雜程度各不相同,為了較好地對各模塊進行分析,并沒有拘泥于嚴格的模塊分層,而是針對每個特定的模塊進行了適當的分層,從而更好地完成對各個模塊的分析。
  圖1為Linux內核虛目錄。

Image 002.png

2 軟件架構設計
  本軟件采用B/S架構,系統架構圖如圖2所示。

Image 003.png

  根據上面的架構設計,可以把系統分為圖3所示的幾個模塊。
  各模塊設計如下:

Image 004.png

  展示模塊:負責前臺數據的展示,可以分為如下兩個子模塊:
  (1)布局模塊:用來計算各個矢量圖的坐標位置布局,以及拖拽、放大、縮小等之后的布局。
  (2)渲染模塊:將布局模塊計算好之后的坐標,使用Raphael的庫來渲染到界面上。
  數據交互模塊:
  (1)數據獲取模塊:從MySQL數據庫中獲取數據,經過格式化之后,轉換成json格式。
  (2)數據持久化模塊:提供數據持久化接口,可以將數據持久化到數據庫中。
  數據爬取模塊:
  (1)數據實體(虛目錄、模塊、文件、函數、變量)爬取:①爬取虛目錄、模塊以及文件并存儲到數據庫之中;②爬取文件中函數及變量的數據,并存儲到數據庫中。
  (2)關系爬取:爬取(1)中的元素之間的關系,并存儲到數據庫中。
  2.1 展示模塊
  前端采用Jquery和Raphael在Web界面上畫出所需要的矢量圖,用來表示模塊及模塊之間的關系,以及函數/變量之間的關系。
  2.2 數據交互模塊
  交互式圖解軟件中,使用PHP作為中間層,連接前端界面與后端數據庫,前端使用的JavaScript繪圖引擎會向PHP發出getJSON請求,PHP解析參數,完成指定類型的數據查詢工作,最后形成與前端統一標準json結構,利用回調函數的形式返回給前端繪圖引擎。其整個過程如圖4所示。

Image 005.png

  2.3 數據爬取模塊
  數據爬取模塊主要負責數據實體(虛目錄、模塊、文件、函數、變量)爬取以及這些實體之間關系的爬取。爬取模塊邏輯如圖5所示。

Image 006.png

  整體思想:
  (1)根據Linux內核文檔kconfig-language.txt的說明,了解Kconfig語法規則。在此基礎上,對Linux內核的Kconfig文件做語法分析,爬取出Linux定義的編譯選項及其之間的關系。
  (2)根據Linux內核文檔makefile.txt和modules.txt的說明,了解Makefile文件中,定義編譯選項對應文件的規則。在此規則基礎上,對Linux內核的Makefile文件進行語法分析,爬取出編譯選項與文件關系。
  (3)函數與文件關系的數據爬取方面,可用的現成開源工具較多,經過調研,可以使用到的工具主要有:Clang編譯器、ctags、cscope、eclipse CDT插件、pycparser等。互補的運用這些工具,對Linux內核源碼文件進行AST或者符號標記的生成并輸出為中間文件,然后對這些文件進行讀取,可以解析獲得變量、函數、宏的定義與它們之間的調用關系。
  在爬取完上述關系之后,存在一個比較大的疑問,即虛目錄如何與編譯選項對應虛目錄與編譯選項的對應,可以通過文件巧妙的連接起來。對于劃分好的虛目錄的爬取,得到了虛目錄與文件的層次結構;對于Makefile的爬取,得到了編譯選項與文件的對應關系。從而,通過一個編譯選項包含了哪些文件,這些文件位于哪些虛目錄下,就可以確定編譯選項位于哪些虛目錄下了。
3 軟件展示
  3.1 實例場景
  內核的輸入和輸出都屬于設備驅動的范疇。在進行虛目錄劃分時,將其劃分為設備驅動下輸入子系統。內核的輸入子系統是對分散、多種不同類別的輸入設備(如鍵盤、鼠標、操縱桿、觸摸屏、加速計和手寫板)進行統一處理的驅動程序。
  內核輸入子系統的頂層核心編譯選項配置是CONFIG_INPUT,Kconfig中說明如圖6所示。

Image 007.png

  可以看出,此編譯選項默認為打開狀態,任何輸入設備(mouse、keyboard…)需要連接到系統,必須保證其為打開狀態,不然輸入設備是無法加載驅動的。
  相應Makefile的定義如圖7所示。

Image 008.png

  可以看出,配置該選項后,將編譯input.c、input-compat.c、input-mt.c、ff-core.c,通過實際分析文件可以了解到,這些文件中實現了諸如input_register_handler(),input_unregister_handler()等INPUT子系統的核心函數。
  而mosue dev很顯然屬于輸入設備中的一部分。既然CONFIG_INPUT是輸入子系統的頂層核心編譯選項,那么實際的輸入設備的配置必然是依賴于它的,從Kconfig的定義中發現/drivers/input/Kconfig片段如圖8所示。

Image 009.png

  INPUT_MOUSEDEV編譯選項確實處于INPUT配置的IF條件中(為了方便截圖,用省略號省去了其他配置說明)。

Image 010.png

  從相應的Makefile的定義(如圖9所示)中可以看出,配置該選項后,將編譯mousedev.c文件,通過實際分析文件可以了解到,文件中實現了諸如mousedev_init()、mousedev_exit()等與mouse dev相關的核心函數。
  實際分析文件中的函數如圖10所示。

Image 011.png

  mousedev_init()在進行鼠標設備初始化時,需要調用input.c的函數input_register_handler()注冊一個鼠標類型的Handler,這里的Handler是鼠標類設備的統一處理接口,如圖11所示。

Image 012.png

  同樣,mousedev_exit()在進行鼠標設備的退出時,需要調用文件input.c的函數input_unregister_handler()來注銷初始化時注冊的鼠標Handler。從最低層的函數調用中體現出了INPUT_MOUSEDEV對于INPUT編譯選項的依賴性。
  3.2 實際演示
  圖解軟件首頁如圖12所示。

Image 013.png

  對上述機制進行說明,當進行虛目錄劃分時,INPUT子系統被劃分到了設備驅動中,并且由于input.c和mousedev.c中實現的函數都是輸入輸出中通用的機制,因此二者都被劃分到了虛目錄input-common中,由于虛目錄和編譯選項的包含關系是通過文件聯系的,從而包含文件input.c和mousedev.c的編譯選項INPUT和INPUT_MOUSEDEV會出現在虛目錄input-common中。接下來通過圖解軟件進行展示(具體編譯選項位置:設備驅動->iput->input-common),展開后可以看到(注:以下展示過程中,為了使得所展示的模塊間關系突出,均使用過濾操作濾除了其他不相關線條):
  (1)INPUT_MOSUEDEV到INPUT編譯選項的依賴關系如圖13所示。


Image 014.png


  (2)展開編譯選項INPUT,可以看到INPUT_ MOUSEDEV對于INPUT編譯選項包含的文件drivers/input/input.c的依賴關系,如圖14所示。

Image 015.png

  (3)展開INPUT_MOUSEDEV編譯選項,可以看到,INPUT_MOUSEDE編譯選項包含的文件drivers/input/mousedev.c對于INPUT編譯選項包含的文件drivers/input/input.c的依賴關系,如圖15所示。

Image 001.png

  (4)展開文件drivers/input/mousedev.c,可以看到drivers/ input/mousedev.c包含的函數mouse_init和mouse_exit對于文件drivers/input/input.c的依賴關系,如圖16所示。

Image 016.png

  (5)展開文件drivers/input/input.c,可以看到drivers/input/mousedev.c包含的函數mouse_init和mouse_exit對于文件drivers/input/input.c包含的函數input_register_handler和input_unregister_handler的依賴關系,如圖17所示。

Image 017.png

4 結論
  本文在虛目錄的基礎上,圍繞著編譯選項提出了一套完整的開發交互式圖解軟件的設計方案。一方面,此交互式圖解軟件為Linux學習者提供了準確而便捷的途徑,同時也為高級用戶提供了深入探討Linux內核的平臺;另一方面,此軟件可以與“在線源碼協同分析平臺”和社區進行集成,將Linux體系構架的分析成果作為軟件中的編譯選項、文件以及函數和變量的注釋說明來在線展示,有著非常廣泛的應用前景。
  參考文獻
  [1] DANIEL P B, MARCO C. Understanding the Linux Kernel(3rd Edition)[M]. O′Reilly,2005.
  [2] MAUERER W. Professional Linux Kernel Architecture[M]. Wiley, 2008.
  [3] 胡希明,毛德操. Linux內核源代碼情景分析[M].杭州:浙江大學出版社,2001.
  [4] 陳莉君.Linux 操作系統內核分析[M].北京:人民郵電出版社,2000.
  [5] 吳國偉,李張,任廣臣.Linux內核分析及高級編程[M].北京:電子工業出版社,2008.
  [6] 趙炯.Linux內核完全注釋[M].北京:機械工業出版社,2004.

此內容為AET網站原創,未經授權禁止轉載。
主站蜘蛛池模板: 亚洲人成在线播放网站 | 久久精品国产只有精品2020 | 久久成人综合网 | 欧美大胆一级视频 | 国产成人久久精品二区三区 | 成人黄激情免费视频 | 5x性区m免费毛片视频看看 | 久久久久综合国产 | 热er99久久6国产精品免费 | 久久er精品视频 | 国产成人亚洲精品一区二区在线看 | 九九九国产视频 | 一级在线毛片 | 免费一级毛片在线观看 | 日韩一级特黄 | 久久久久久久国产精品 | a级毛片高清免费视频 | 国产91区 | 亚洲国产第一区二区香蕉日日 | 3级黄色 | 国产在线观看第一页 | 欧美中文字幕一区 | 欧美aaaaaabbbbb | 国产一国产一有一级毛片 | 久久zyz| 美女黄色影院 | 日本国产欧美色综合 | 国产精品线在线精品国语 | 久久精品视频3 | 97视频免费播放观看在线视频 | 一区二区三区在线免费看 | 精品国产午夜久久久久九九 | 成人国产在线24小时播放视频 | 国产日韩欧美亚洲 | 日韩国产欧美在线观看 | 国产精品国产 | 91免费公开视频 | 亚洲国产精品久久卡一 | 怡红院视频网 | 国产成人精品久久二区二区 | a级网站在线观看 |