溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

linux內(nèi)核的源代碼放在什么文件下

發(fā)布時(shí)間:2023-04-19 09:55:04 來源:億速云 閱讀:142 作者:iii 欄目:建站服務(wù)器

這篇文章主要介紹了linux內(nèi)核的源代碼放在什么文件下的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇linux內(nèi)核的源代碼放在什么文件下文章都會(huì)有所收獲,下面我們一起來看看吧。

linux內(nèi)核的源代碼放在/usr/src/linux目錄下。內(nèi)核源代碼的組成:1、arch目錄,包含了此核心源代碼所支持的硬件體系結(jié)構(gòu)相關(guān)的核心代碼;2、include目錄,包括了核心的大多數(shù)include文件;3、init目錄,包含核心啟動(dòng)代碼;4、mm目錄,包含所有的內(nèi)存管理代碼;5、drivers目錄,包含系統(tǒng)中所有的設(shè)備驅(qū)動(dòng);6、Ipc目錄,包含核心的進(jìn)程間通訊代碼。

linux內(nèi)核的源代碼放在哪里

Linux的內(nèi)核源代碼可以從很多途徑得到。一般來講,在安裝的linux系統(tǒng)下,/usr/src/linux目錄下的東西就是內(nèi)核源代碼。

對(duì)于源代碼的閱讀,要想比較順利,事先最好對(duì)源代碼的知識(shí)背景有一定的了解。

Linux內(nèi)核源代碼的組成如下(假設(shè)相對(duì)于linux目錄):

arch

這個(gè)子目錄包含了此核心源代碼所支持的硬件體系結(jié)構(gòu)相關(guān)的核心代碼。如對(duì)于X86平臺(tái)就是i386。

include

這個(gè)目錄包括了核心的大多數(shù)include文件。另外對(duì)于每種支持的體系結(jié)構(gòu)分別有一個(gè)子目錄。

init

此目錄包含核心啟動(dòng)代碼。

mm

此目錄包含了所有的內(nèi)存管理代碼。與具體硬件體系結(jié)構(gòu)相關(guān)的內(nèi)存管理代碼位于arch/*/mm目錄下,如對(duì)應(yīng)于X86的就是arch/i386/mm/fault.c 。

drivers

系統(tǒng)中所有的設(shè)備驅(qū)動(dòng)都位于此目錄中。它又進(jìn)一步劃分成幾類設(shè)備驅(qū)動(dòng),每一種也有對(duì)應(yīng)的子目錄,如聲卡的驅(qū)動(dòng)對(duì)應(yīng)于drivers/sound。

Ipc

此目錄包含了核心的進(jìn)程間通訊代碼。

modules

此目錄包含已建好可動(dòng)態(tài)加載的模塊。

fs Linux

支持的文件系統(tǒng)代碼。不同的文件系統(tǒng)有不同的子目錄對(duì)應(yīng),如ext2文件系統(tǒng)對(duì)應(yīng)的就是ext2子目錄。

Kernel

主要核心代碼。同時(shí)與處理器結(jié)構(gòu)相關(guān)代碼都放在arch/*/kernel目錄下。

Net

核心的網(wǎng)絡(luò)部分代碼。里面的每個(gè)子目錄對(duì)應(yīng)于網(wǎng)絡(luò)的一個(gè)方面。

Lib

此目錄包含了核心的庫代碼。與處理器結(jié)構(gòu)相關(guān)庫代碼被放在arch/*/lib/目錄下。

Scripts

此目錄包含用于配置核心的腳本文件。

Documentation

此目錄是一些文檔,起參考作用。

Linux 內(nèi)核源碼分析方法

1 內(nèi)核源碼之明晰

如果想透析Linux,深入操作系統(tǒng)的本質(zhì),閱讀內(nèi)核源碼是最有效的途徑。我們都知道,想成為優(yōu)秀的程序員,需要大量的實(shí)踐和代碼的編寫。編程固然重要,但是往往只編程的人很容易把自己局限在自己的知識(shí)領(lǐng)域內(nèi)。如果要擴(kuò)展自己知識(shí)的廣度,我們需要多接觸其他人編寫的代碼,尤其是水平比我們更高的人編寫的代碼。通過這種途徑,我們可以跳出自己知識(shí)圈的束縛,進(jìn)入他人的知識(shí)圈,了解更多甚至我們一般短期內(nèi)無法了解到的信息。Linux內(nèi)核由無數(shù)開源社區(qū)的“大神們”精心維護(hù),這些人都可以稱得上一頂一的代碼高手。透過閱讀Linux內(nèi)核代碼的方式,我們學(xué)習(xí)到的不光是內(nèi)核相關(guān)的知識(shí),在我看來更具價(jià)值的是學(xué)習(xí)和體會(huì)它們的編程技巧以及對(duì)計(jì)算機(jī)的理解。

我也是通過一個(gè)項(xiàng)目接觸了Linux內(nèi)核源碼的分析,從源碼的分析工作中,我受益頗多。除了獲取相關(guān)的內(nèi)核知識(shí)外,也改變了我對(duì)內(nèi)核代碼的過往認(rèn)知:

1.內(nèi)核源碼的分析并非“高不可攀”。內(nèi)核源碼分析的難度不在于源碼本身,而在于如何使用更合適的分析代碼的方式和手段。內(nèi)核的龐大致使我們不能按照分析一般的demo程序那樣從主函數(shù)開始按部就班的分析,我們需要一種從中間介入的手段對(duì)內(nèi)核源碼“各個(gè)擊破”。這種“按需索取”的方式使得我們可以把握源碼的主線,而非過度糾結(jié)于具體的細(xì)節(jié)。

2.內(nèi)核的設(shè)計(jì)是優(yōu)美的。內(nèi)核的地位的特殊性決定著內(nèi)核的執(zhí)行效率必須足夠高才可以響應(yīng)目前計(jì)算機(jī)應(yīng)用的實(shí)時(shí)性要求,為此Linux內(nèi)核使用C語言和匯編的混合編程。但是我們都知道軟件執(zhí)行效率和軟件的可維護(hù)性很多情況下是背道而馳的。如何在保證內(nèi)核高效的前提下提高內(nèi)核的可維護(hù)性,這需要依賴于內(nèi)核中那些“優(yōu)美”的設(shè)計(jì)。

3.神奇的編程技巧。在一般的應(yīng)用軟件設(shè)計(jì)領(lǐng)域,編碼的地位可能不被過度的重視,因?yàn)殚_發(fā)者更注重軟件的良好設(shè)計(jì),而編碼僅僅是實(shí)現(xiàn)手段問題——就像拿斧子劈柴一樣,不用太多的思考。但是這在內(nèi)核中并不成立,好的編碼設(shè)計(jì)帶來的不光是可維護(hù)性的提高,甚至是代碼性能的提升。

每個(gè)人對(duì)內(nèi)核的了理解都會(huì)有所不同,隨著我們對(duì)內(nèi)核理解的不斷加深,對(duì)其設(shè)計(jì)和實(shí)現(xiàn)的思想會(huì)有更多的思考和體會(huì)。因此本文更期望于引導(dǎo)更多徘徊在Linux內(nèi)核大門之外的人進(jìn)入Linux的世界,去親自體會(huì)內(nèi)核的神奇與偉大。而我也并非內(nèi)核源碼方面的專家,這么做也只是希望分享我自己的分析源碼的經(jīng)驗(yàn)和心得,為那些需要的人提供參考和幫助,說的“冠冕堂皇”一點(diǎn),也算是為計(jì)算機(jī)這個(gè)行業(yè),尤其是在操作系統(tǒng)內(nèi)核方面貢獻(xiàn)自己的一份綿薄之力。閑話少敘(已經(jīng)羅嗦了很多了,囧~),下面我就來分享一下自己的Linix內(nèi)核源碼分析方法。

2 內(nèi)核源碼它到底難不難

從本質(zhì)上講,分析Linux內(nèi)核代碼和看別人的代碼沒有什么兩樣,因?yàn)閿[在你面前的一般都不是你自己寫出來的代碼。我們先舉一個(gè)簡單的例子,一個(gè)陌生人隨便給你一個(gè)程序,并要你看完源碼后講解一下程序的功能的設(shè)計(jì),我想很多自我感覺編程能力還可以的人肯定覺得這沒什么,只要我耐心的把他的代碼從頭到尾看完,肯定能找到答案,并且事實(shí)確實(shí)是如此。那么現(xiàn)在換一個(gè)假設(shè),如果這個(gè)人是Linus,給你的就是Linux內(nèi)核的一個(gè)模塊的代碼,你還會(huì)覺得依然那么輕松嗎?不少人可能會(huì)有所猶豫。同樣是陌生人(Linus要是認(rèn)識(shí)你的話當(dāng)然不算,呵呵~)給你的代碼,為什么給我們的感覺大相徑庭呢?我覺得有以下原因:

1.Linux內(nèi)核代碼在“外界”看來多少有些神秘感,而且它很龐大,猛地?cái)[在面前可能感覺無法下手。比如可能來源于一個(gè)很細(xì)小的原因——找不到main函數(shù)。對(duì)于簡單的demo程序,我們可以從頭至尾的分析代碼的含義,但是分析內(nèi)核代碼這招就徹底失效了,因?yàn)闆]有人能把Linux代碼從頭到尾看上一遍(因?yàn)榇_實(shí)沒有必要,用到時(shí)看就可以了)。

2.不少人也接觸過大型軟件的代碼,但多數(shù)屬于應(yīng)用型項(xiàng)目,代碼的形式和含義都和自己常接觸的業(yè)務(wù)邏輯相關(guān)。而內(nèi)核代碼不同,它處理的信息多數(shù)和計(jì)算機(jī)底層密切相關(guān)。比如操作系統(tǒng)、編譯器、匯編、體系結(jié)構(gòu)等相關(guān)的知識(shí)的欠缺,也會(huì)讓閱讀內(nèi)核代碼障礙重重。

3.分析內(nèi)核代碼的方法不夠合理。面對(duì)大量的并且復(fù)雜的內(nèi)核代碼,如果不從全局的角度入手,很容易陷入代碼細(xì)節(jié)的泥淖中。內(nèi)核代碼雖然龐大,但是它也有它的設(shè)計(jì)原則和架構(gòu),否則維護(hù)它對(duì)任何人來說都是一個(gè)噩夢!如果我們理清代碼模塊的整體設(shè)計(jì)思路,再去分析代碼的實(shí)現(xiàn),可能分析源碼就是一件輕松快樂的事情了。

針對(duì)這些問題,我個(gè)人是這樣理解的。如果沒有接觸過大型軟件項(xiàng)目,可能分析Linux內(nèi)核代碼是一個(gè)很好的積累大型項(xiàng)目經(jīng)驗(yàn)的機(jī)會(huì)(確實(shí),Linux代碼是我目前接觸到的最大的項(xiàng)目了?。?。如果你對(duì)計(jì)算機(jī)底層了解的不夠透徹,那么我們可以選擇邊分析邊學(xué)習(xí)的方式去積累底層的知識(shí)??赡軇傞_始分析代碼的進(jìn)度會(huì)稍顯遲緩,但是隨著知識(shí)的不斷積累,我們對(duì)Linux內(nèi)核的“業(yè)務(wù)邏輯”會(huì)逐漸明朗起來。最后一點(diǎn),如何從全局的角度把握分析的源碼,這也是我想與大家分享的經(jīng)驗(yàn)。

3 內(nèi)核源碼分析方法

3.1 資料搜集

從人認(rèn)識(shí)新事物的角度來講,在探索事物本質(zhì)之前,必須有一個(gè)了解新鮮事物的過程,這個(gè)過程是的我們對(duì)新鮮事物產(chǎn)生一個(gè)初步的概念。比如我們想學(xué)習(xí)鋼琴,那么我們需要先了解彈奏鋼琴需要我們學(xué)習(xí)基本的樂理、簡譜、五線譜等基礎(chǔ)知識(shí),然后學(xué)習(xí)鋼琴彈奏的技巧和指法,最后才能真正的開始練習(xí)鋼琴。

分析內(nèi)核代碼也是如此,首先我們需要定位要分析的代碼涉及的內(nèi)容。是進(jìn)程同步和調(diào)度的代碼,是內(nèi)存管理的代碼,還是設(shè)備管理的代碼,還是系統(tǒng)啟動(dòng)的代碼等等。內(nèi)核的龐大決定著我們不能一次性將內(nèi)核代碼全部分析完成,因此我們需要給自己一個(gè)合理的分工。正如算法設(shè)計(jì)告訴我們的,要解決一個(gè)大問題,首先要解決它所涉及的子問題。

定位好要分析的代碼范圍,我們就可以動(dòng)用手頭的一切資源,盡可能的全面了解該部分代碼的整體結(jié)構(gòu)和大致功能。

linux內(nèi)核的源代碼放在什么文件下

這里所說的一切資源是指無論是Baidu、Google大型網(wǎng)絡(luò)搜索引擎,還是操作系統(tǒng)原理教材和專業(yè)書籍,亦或是他人提供的經(jīng)驗(yàn)和資料,甚至是Linux源碼提供的文檔、注釋和源碼標(biāo)識(shí)符的名稱(不要小看代碼中的標(biāo)識(shí)符的命名,有時(shí)它們能提供關(guān)鍵的信息)??傊@里的一切資源指的就是你能想到的一切可用資源。當(dāng)然,我們不太可能通過這種形式的信息搜集獲得所有的我們想要的信息,我們只求盡可能全面即可。因?yàn)樾畔⑺鸭脑饺?,之后分析代碼的過程能使用的信息就更多,分析過程的困難就會(huì)越小。

這里舉一個(gè)簡單的例子,假定我們要分析Linux的變頻機(jī)制實(shí)現(xiàn)的代碼。目前為止我們僅僅是知道這個(gè)名詞而已,透過字面含義我們可以大致猜測它應(yīng)該和CPU的頻率調(diào)節(jié)相關(guān)。通過信息搜集,我們應(yīng)該能得到如下的相關(guān)的信息:

1.CPUFreq機(jī)制。

2.performance、powersave、userspace、ondemand、conservative調(diào)頻策略。

3./driver/cpufreq/。

4./documention/cpufreq。

5.P state和C state。

分析Linux內(nèi)核代碼如果能搜集到這些信息,應(yīng)該說是非?!靶疫\(yùn)”了。畢竟有關(guān)Linux內(nèi)核的資料確實(shí)不如.NET和JQuery那么豐富,不過這相比于十?dāng)?shù)年前,沒有強(qiáng)大的搜索引擎,沒有相關(guān)的研究資料的時(shí)期應(yīng)該稱得上是“大豐收”時(shí)代了!我們通過簡單的“搜索”(可能會(huì)花費(fèi)一到兩天的時(shí)間吧),甚至找到了這部分代碼所在的源碼文件目錄,不得不說這樣的信息簡直是“價(jià)值連城”!

3.2 源碼定位

從資料搜集中,我們“有幸”找到了源碼相關(guān)的源碼目錄。但是這并非意味著我們的確就是分析這個(gè)目錄下的源代碼。有時(shí)我們找到的目錄有可能是分散的,也有時(shí)我們找到的目錄下有很多和具體機(jī)器相關(guān)的代碼,而我們更關(guān)心的是待分析代碼的主要機(jī)制,而非與機(jī)器相關(guān)的特化代碼(這樣更有助于我們理解內(nèi)核的本質(zhì))。因此,我們需要對(duì)資料中涉及代碼文件的資料進(jìn)行仔細(xì)甄選。當(dāng)然,這一步也不太可能一次性完成,誰也不能保證一次就能選擇出所有待分析的源碼文件而且一個(gè)不漏。但是我們也不必?fù)?dān)心,只要我們能抓住大多數(shù)模塊相關(guān)的核心源文件,通過后期對(duì)代碼的具體分析,就很自然的把它們?nèi)空页鰜怼?/p>

回到上述的例子中,我們認(rèn)真的閱讀/documention/cpufreq下的文檔說明。目前的Linux源碼會(huì)把模塊相關(guān)的文檔說明保存在源碼目錄的documention的文件夾下,如果待分析的模塊沒有文檔說明,這多少會(huì)增加定位關(guān)鍵源碼文件的難度,但是不會(huì)導(dǎo)致我們找不到我們要分析的源碼。通過閱讀文檔說明,我們至少能關(guān)注到/driver/cpufreq/cpufreq.c這個(gè)源文件。通過這個(gè)對(duì)源文件的文檔說明,結(jié)合之前搜羅到的調(diào)頻策略,我們很容易關(guān)注到cpufreq_performance.c、cpufreq_powersave.c、cpufreq_userspace.c、cpufreq_ondemand、cpufreq_conservative.c這五個(gè)源文件。所有涉及的文件都找完了嗎?不用擔(dān)心,從它們開始分析,遲早能找到其他的源文件。如果在windows下使用sourceinsight閱讀內(nèi)核源碼的話,我們通過函數(shù)的調(diào)用和查找符號(hào)引用等功能,結(jié)合代碼的分析可以很方便的找到另外的文件freq_table.c、cpufreq_stats.c和/include/linux/cpufreq.h。

linux內(nèi)核的源代碼放在什么文件下

按照搜索出的信息流動(dòng)方向,我們完全可以定位到需要分析的源碼文件。源碼定位這一步并非十分關(guān)鍵,因?yàn)槲覀儾恍枰页鏊性创a文件,我們可以把部分工作推遲到分析代碼的過程中。源碼定位也比較關(guān)鍵,找到一部分源碼文件是分析源碼的基礎(chǔ)。

3.3 簡單注釋

簡單注釋

在已定位好的源碼文件中,分析每個(gè)變量、宏、函數(shù)、結(jié)構(gòu)體等代碼元素的大致含義和功能。之所以稱此為簡單注釋,并非指這部分的注釋工作很簡單,而是指這部分的注釋可以不必過分細(xì)化,只要大致描述出相關(guān)代碼元素的含義即可。相反,這里的工作其實(shí)是整個(gè)分析流程中最困難的一步。因?yàn)檫@是第一次深入到內(nèi)核代碼的內(nèi)部,尤其是對(duì)于首次分析內(nèi)核源碼的人來說,大量的生疏GNU的C語法和鋪天蓋地的宏定義會(huì)令人很絕望。此時(shí)只要沉下心來,弄清每個(gè)關(guān)鍵的難點(diǎn),才能保證以后碰到類似的難點(diǎn)不會(huì)再被困住。而且,我們對(duì)內(nèi)核相關(guān)的其他知識(shí)會(huì)不斷的像樹一樣擴(kuò)展開來。

比如在cpufreq.c文件開始就會(huì)出現(xiàn)“DEFINE_PER_CPU”宏的使用,我們通過查閱資料可以基本弄清這個(gè)宏的含義和功能。這里使用的手段和之前搜集資料使用的方法基本一致,另外我們也可以使用sourceinsight提供的轉(zhuǎn)到定義等功能查看它的定義,或者使用LKML(Linux Kernel Mail List)查閱??傊盟锌赡艿氖侄?,我們總能得到這個(gè)宏的含義——為每個(gè)CPU定義一個(gè)獨(dú)立使用的變量。

我們也不要強(qiáng)求一次就能把注釋描述的很準(zhǔn)確(我們甚至都沒必要弄清每個(gè)函數(shù)的具體實(shí)現(xiàn)流程,只要弄清大致功能含義即可),我們結(jié)合搜集到的資料和后邊代碼的分析不斷的完善注釋的含義(源碼中原有的注釋和標(biāo)識(shí)符命名在此很有利用價(jià)值)。通過不斷的注釋,不斷的查閱資料,不斷的修改注釋的含義。

linux內(nèi)核的源代碼放在什么文件下

當(dāng)我們把所有涉及的源碼文件簡單注釋完畢后我們可以達(dá)到如下效果:

1.基本弄清了源碼中代碼元素存在的含義。

2.找出了該模塊所涉及的基本上全部的關(guān)鍵源碼文件。

結(jié)合之前搜集到的信息和資料對(duì)該待分析代碼的整體或者架構(gòu)描述,我們可以將分析的結(jié)果和資料對(duì)比,以確定和修正我們對(duì)代碼的理解。這樣,通過一遍的簡單注釋,我們就可以從整體上把握了源碼模塊的主要結(jié)構(gòu)。這也達(dá)到了我們簡單注釋的基本目的。

3.4 詳細(xì)注釋

完成代碼的簡單注釋后,可以認(rèn)為對(duì)模塊的分析工作完成了一半了,剩下的內(nèi)容就是對(duì)代碼的深入分析和徹底理解。簡單注釋總是不能將代碼元素的具體含義描述的十分精確,因此詳細(xì)注釋是十分有必要的。這一步中,我們需要弄清以下內(nèi)容:

1.變量定義在何時(shí)被使用。

2.宏定義的代碼何時(shí)被使用。

3.函數(shù)的參數(shù)和返回值的含義。

4.函數(shù)的執(zhí)行流程和調(diào)用關(guān)系。

5.結(jié)構(gòu)體字段的具體含義和使用條件。

我們甚至可以把這一步稱為函數(shù)詳細(xì)注釋,因?yàn)楹瘮?shù)之外的代碼元素的含義基本上在簡單注釋中已經(jīng)比較明確了。而函數(shù)本身的執(zhí)行流程、算法等是這部分注釋和分析的主要任務(wù)。

比如cpufreq_ondemand策略的實(shí)現(xiàn)算法(函數(shù)dbs_check_cpu中)是如何實(shí)現(xiàn)的。我們需要逐步分析該函數(shù)使用的變量和調(diào)用的函數(shù)等信息,弄清算法的來龍去脈。最好的結(jié)果,我們需要這些復(fù)雜函數(shù)的執(zhí)行流程圖和函數(shù)調(diào)用關(guān)系圖,這是最直觀的表達(dá)方式。

linux內(nèi)核的源代碼放在什么文件下

通過這一步的注釋,我們基本上能完全把握待分析代碼整體的實(shí)現(xiàn)機(jī)制了。而所有的分析工作可以認(rèn)為完成了80%。這一步工作尤其關(guān)鍵,我們必須盡量讓注釋的信息足夠的準(zhǔn)確,才能更好的理解待分析代碼的內(nèi)部模塊的劃分。雖然Linux內(nèi)核中使用了宏語法“module_init”和“module_exit”聲明模塊文件,但是對(duì)模塊內(nèi)部子功能的劃分是建立在充分了解模塊的功能基礎(chǔ)上的。只有正確劃分好模塊,我們才能弄清模塊提供了哪些外部函數(shù)和變量(使用EXPORT_SYMBOL_GPL或者EXPORT_SYMBOL導(dǎo)出的符號(hào))。才能繼續(xù)下一步的模塊內(nèi)標(biāo)識(shí)符依賴關(guān)系分析。

3.5 模塊內(nèi)部標(biāo)識(shí)符依賴關(guān)系

通過第四步對(duì)代碼模塊的劃分,我們就可以很“輕松”地逐個(gè)對(duì)模塊進(jìn)行分析。一般的,我們可以從文件底部的模塊出入口函數(shù)開始(“module_init”和“module_exit”聲明的函數(shù),一般都在文件最后),根據(jù)它們調(diào)用的函數(shù)(自己定義的或者其他模塊的函數(shù))和使用的關(guān)鍵變量(本文件內(nèi)的全局變量或者其他模塊的外部變量)畫出“函數(shù)-變量-函數(shù)”依賴關(guān)系圖——我們稱為標(biāo)識(shí)符依賴關(guān)系圖。

當(dāng)然,模塊內(nèi)標(biāo)識(shí)符依賴關(guān)系并非是單純的樹形結(jié)構(gòu),很多情況是錯(cuò)綜復(fù)雜的網(wǎng)絡(luò)關(guān)系。這時(shí)候,我們對(duì)代碼的詳細(xì)注釋的作用就體現(xiàn)出來了。我們根據(jù)函數(shù)本身的含義,將模塊進(jìn)行子功能劃分,抽取出每個(gè)子功能的標(biāo)識(shí)符依賴樹。

linux內(nèi)核的源代碼放在什么文件下

通過標(biāo)識(shí)符依賴關(guān)系分析,可以很清晰的展示模塊定義的函數(shù)調(diào)用了那些函數(shù),使用了哪些變量,以及模塊子功能之間的依賴關(guān)系——公用了哪些函數(shù)和變量等。

3.6 模塊間相互依賴關(guān)系

模塊間相互依賴關(guān)系

一旦將所有的模塊內(nèi)部標(biāo)識(shí)符依賴關(guān)系圖整理完畢,根據(jù)模塊使用的其他模塊的變量或函數(shù),可以很容易得到模塊之間的依賴關(guān)系。

linux內(nèi)核的源代碼放在什么文件下

cpufreq代碼的模塊依賴關(guān)系可以表示為如下關(guān)系。

linux內(nèi)核的源代碼放在什么文件下

3.7 模塊架構(gòu)圖

透過模塊間的依賴關(guān)系圖,可以很清楚的表達(dá)模塊在整個(gè)待分析代碼中的地位和功能?;诖耍覀兛梢詫⒛K分類,整理出代碼的架構(gòu)關(guān)系。

linux內(nèi)核的源代碼放在什么文件下

如cpufreq的模塊依賴關(guān)系圖所示,我們可以很清楚的看到所有的調(diào)頻策略模塊都是依賴于核心模塊cpufreq、cpufreq_stats和freq_table的。如果我們把被依賴的三個(gè)模塊抽象為代碼的核心框架的話,這些調(diào)頻策略模塊都是建立在這個(gè)框架之上的,它們負(fù)責(zé)和用戶層交互。而核心模塊cpufreq提供了驅(qū)動(dòng)等相關(guān)的接口負(fù)責(zé)與系統(tǒng)底層交互。因此,我們可以得到如下的模塊架構(gòu)圖。

linux內(nèi)核的源代碼放在什么文件下

當(dāng)然,架構(gòu)圖并非模塊的無機(jī)拼接,我們還需要結(jié)合查閱的資料去豐富架構(gòu)圖的含義。因此,這里的架構(gòu)圖的細(xì)節(jié)會(huì)隨著不同的人的理解有所偏差。但是架構(gòu)圖主體的含義很基本一致的。至此,我們完成了待分析的內(nèi)核代碼的所有分析工作。

關(guān)于“l(fā)inux內(nèi)核的源代碼放在什么文件下”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“l(fā)inux內(nèi)核的源代碼放在什么文件下”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI