Linux內核目錄結構介紹(超詳細)

已經寫了一篇文章介紹Linux系統目錄的:https://blog.csdn.net/weixin_38715577/article/details/101033419

現在介紹一下Linux內核(kernel)的目錄結構。

內核在系統目錄下的路徑,一般爲:/usr/src/(我的ubuntu下測試的)

你也可以自己在/home目錄下創建一個文件夾命名爲work,作爲自己開發內核的工作目錄,然後去https://www.kernel.org/pub/linux/kernel/下載一個內核到/home/work/下,在這上面做相應開發比較好。

內核源碼的目錄結構和系統目錄結構類似,也是一個樹狀結構。

下圖是我的ubuntu16的內核源碼路徑和內核源碼目錄的樣子。

第一級目錄:

序號 第一級目錄 第二級目錄和文件
1 arch

這個文件夾包含了一個Kconfig文件,它用於設置這個目錄裏的源代碼編譯所需的一系列設定。

每個支持的處理器架構都在它相應的文件夾中,如arm64arm32、x86mips等。
/boot內核需要的特定平臺代碼
/boot/dts:設備樹文件
/lib通用函數特定體系結構的文件
/math-emu模擬FPU的代碼,在ARM中,使用/math-xxx代替
/mm:特定體系結構的內存管理文件
/include:特定體系的頭文件

2 block 此文件夾包含塊設備驅動程序的代碼,該目錄用於實現塊設備的基本框架和塊設備的I/O調度算法。塊設備是以數據塊方式接收和發送的數據的設備。數據塊都是一塊一塊的數據而不是持續的數據流。
3 crypto 這個文件夾包含許多加密算法的源代碼。例如,“sha1_generic.c”這個文件包含了SHA1加密算法的代碼。存放加密壓縮CRC校驗等算法相關代碼
4 Documentation 存放相關說明文檔,很多實用文檔,包括驅動編寫等
5 drivers 存放 Linux 內核設備驅動程序源碼。驅動源碼在 Linux 內核源碼中站了很大比例,常見外設幾乎都有可參考源碼,對驅動開發而言,該目錄非常重要。該目錄包含衆多驅動,目錄按照設備類別進行分類,如charblockinputi2cspipciusb
6 firmware 保存用於驅動第三方設備的固件
7 fs 這是文件系統的文件夾。理解和使用的文件系統所需要的所有的代碼就在這裏。在這個文件夾裏,每種文件系統都有自己的文件夾。例如,ext4文件系統的代碼在ext4文件夾內。 在fs文件夾內,開發者會看到一些不在文件夾中的文件。這些文件用來控制整個文件系統。例如,mount.h中會包含掛載文件系統的代碼。文件系統是以結構化的方式來存儲和管理的存儲設備上的文件和目錄。每個文件系統都有自己的優點和缺點。這是由文件系統的設計決定的。
8 include 存放內核所需、與平臺無關的頭文件,與平臺相關的頭文件已經被移動到 arch 平臺的include 目錄,如 ARM 的頭文件目錄<arch/arm/include/asm/>
9 init 包含內核初始化代碼,init文件夾包含了內核啓動的處理代碼(INITiation)。main.c是內核的核心文件,這是用來銜接所有的其他文件的源代碼主文件。
10 ipc 存放進程間通信代碼, 此文件夾中的代碼是作爲內核與進程之間的通信層。內核控制着硬件,因此程序只能請求內核來執行任務。假設用戶有一個打開DVD托盤的程序。程序不直接打開托盤,該程序通知內核,然後,內核給硬件發送一個信號去打開托盤。
11 kernel 這個文件夾中的代碼控制內核本身,在該文件夾下有個"power"文件夾,這裏的代碼可以使計算機重新啓動、關機和掛起。
12 lib 這個文件夾包含了內核需要引用的一系列內核庫文件代碼。
13 mm mm文件夾中包含了內存管理代碼。內存並不是任意存儲在RAM芯片上的。相反,內核小心地將數據放在RAM芯片上。內核不會覆蓋任何正在使用或保存重要數據的內存區域。
14 net net文件夾中包含了網絡協議代碼。這包括IPv6、AppleTalk、以太網、WiFi、藍牙等的代碼,此外處理網橋和DNS解析的代碼也在net目錄。
15 samples

存放提供的一些內核編程範例,如kfifo;後者相關用戶態編程範例,如hidraw

此文件夾包含了程序示例和正在編寫中的模塊代碼。假設一個新的模塊引入了一個想要的有用功能,但沒有程序員說它已經可以正常運行在內核上。那麼,這些模塊就會移到這裏。這給了新內核程序員一個機會通過這個文件夾來獲得幫助,或者選擇一個他們想要協助開發的模塊。

16 srcipts 這個文件夾有內核編譯所需的腳本。最好不要改變這個文件夾內的任何東西。否則,您可能無法配置或編譯內核。
17 security 這個文件夾是有關內核安全的代碼。它對計算機免於受到病毒和黑客的侵害很重要。否則,Linux系統可能會遭到損壞。
18 sound 這個文件夾中包含了聲卡驅動,存放聲音系統架構相關代碼和具體聲卡的設備驅動程序
19 tools 編譯過程中一些主機必要工具,這個文件夾中包含了和內核交互的工具。
20 usr 早期用戶空間代碼(所謂的initramfs)
21 virt 內核虛擬機KVM

以上是Linux內核源碼目錄的結構,大致瞭解每個目錄的左右,需要的時候知道在哪去找就行。

對於Linux內核驅動開發工程師來說,最常接觸的就是driver目錄,接下來就driver目錄做一些說明!

先看張圖:這是我虛擬機裏面 內核源碼下drivers的樣子

好了忘記它。沒什麼卵用,只是看一看加深印象。

下面是driver目錄下比較常用的驅動,本人才疏學淺,剛開始學習,怕有什麼錯漏,所以下圖是借鑑了:https://blog.csdn.net/hongwei_1990/article/details/89716970

序號 目錄 說明
1 drivers/gpio 系統GPIO子系統和驅動目錄,包括處理器內部GPIO以及外擴GPIO驅動。遵循GPIO子系統的驅動,可通過/sys/class/gpio進行訪問
2 drivers/hwmon 硬件監測相關驅動,如溫度傳感器風扇監測
3 drivers/i2c I2C子系統驅動。各I2C控制器的驅動在i2c/busses目錄下
4 drivers/input 輸入子系統驅動目錄
5 drivers/input/keyboard HID鍵盤驅動,如GPIO鍵盤矩陣鍵盤
6 drivers/input/touchscreen 觸摸屏驅動,如處理器的觸摸屏控制器驅動、外擴串行觸摸屏控制器驅動、串口觸摸屏控制器驅動等
7 drivers/leds LED子系統和驅動,如GPIO驅動LED。遵循 LED子系統的驅動 ,可通過/sys/class/leds進行訪問
8 drivers/mfd 多功能器件Multi-Function Device)驅動。如果一個器件能做多種用途,通常需要藉助MFD來完成。
9 drivers/misc 雜項Miscellaneous)驅動。特別需要關注<drivers/misc/eeprom/>目錄,提供了i2cspi接口的EEPROM驅動範例,所驅動的設備可通過/sys系統訪問
10 drivers/mmc SDSecure Digital)/MMCMutimedia Card)卡驅動目錄
11 drivers/mtd MTDMemory Technology Device)子系統和驅動,包括NANDoneNAND等。注意,UBI的實現也在MTD
12 drivers/mtd/nand NAND FALSHMTD驅動目錄,包括NAND基礎驅動控制器接口驅動
13 drivers/net 網絡設備驅動,包括MACPHYCANUSB 網卡無線PPP協議
14 drivers/net/can CAN設備驅動。Linux已經將CAN歸類到網絡中,採用socket_CAN接口
15 drivers/net/ethernet 所支持的MAC驅動。常見廠家的MAC驅動都能找到,如broadcomdavicommarvellmicrelsmsc等廠家的MAC,處理器自帶MAC驅動也在該目錄下
16 drivers/net/phy PHY驅動,像marvellmicrelsmsc的一些PHY驅動
17 drivers/rtc RTC子系統RTC芯片驅動
18 drivers/spi SPI子系統SPI控制器驅動,含GPIO 模擬SPI的驅動
19 drivers/tty tty驅動用於管理物理終端連接。
20 drivers/tty/serial 串口驅動,包括8250串口以及各處理器內部串口驅動實現
21 drivers/uio 用戶空間IO驅動
22 drivers/usb USB驅動,包括USB HOSTGadgetUSB轉串口以及OTG等支持
23 drivers/video Video驅動,包括Framebuffer驅動顯示控制器驅動背光驅動等。
24 drivers/video/backlight 背光控制驅動
25 drivers/video/logo Linux內核啓動LOGO圖片目錄
26 drivers/watchdog 看門狗驅動,包括軟件看門狗和各種硬件看門狗驅動實現

還有其他一些內核目錄沒介紹,需要的時候可以網上找資料。

希望與諸君共同學習進步!加油!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章