STM32MP157 Linux系統(tǒng)移植開發(fā)篇7:Linux內(nèi)核目錄結(jié)構(gòu)詳解
本文章為《STM32MP157 Linux系統(tǒng)移植開發(fā)篇》系列中的一篇,筆者使用的開發(fā)平臺為華清遠(yuǎn)見FS-MP1A開發(fā)板(STM32MP157開發(fā)板)。stm32mp157是ARM雙核,2個(gè)A7核,1個(gè)M4核,A7核上可以跑Linux操作系統(tǒng),M4核上可以跑FreeRTOS、RT-Thread等實(shí)時(shí)操作系統(tǒng),STM32MP157開發(fā)板所以既可以學(xué)嵌入式linux,也可以學(xué)stm32單片機(jī)。
針對FS-MP1A開發(fā)板,除了Linux系統(tǒng)移植篇外,還包括其他多系列教程,包括Cortex-A7開發(fā)篇、Cortex-M4開發(fā)篇、擴(kuò)展板驅(qū)動移植篇、Linux應(yīng)用開發(fā)篇、FreeRTOS系統(tǒng)移植篇、Linux驅(qū)動開發(fā)篇、硬件設(shè)計(jì)篇、人工智能機(jī)器視覺篇、Qt應(yīng)用編程篇、Qt綜合項(xiàng)目實(shí)戰(zhàn)篇等。歡迎關(guān)注,更多stm32mp157開發(fā)教程及視頻,可加技術(shù)交流Q群459754978,感謝關(guān)注。
關(guān)于FS-MP1A開發(fā)板:
手機(jī)淘寶分享碼:復(fù)制本行文字打開手淘?T4FPXn3YYJ2?
鏈接:https://item.taobao.com/item.htm?id=622457259672
Linux內(nèi)核目錄結(jié)構(gòu)
Linux內(nèi)核源代碼非常龐大,隨著版本的發(fā)展不斷增加。它使用目錄樹結(jié)構(gòu),并且使用Makefile組織配置編譯。
初次接觸Linux內(nèi)核,最好仔細(xì)閱讀頂層目錄的readme文件,它是Linux內(nèi)核的概述和編譯命令說明。readme的說明更加針對X86等通用的平臺,對于某些特殊的體系結(jié)構(gòu),可能有些特殊的地方。
內(nèi)核源碼很復(fù)雜,包含多級目錄,形成一個(gè)龐大的樹狀結(jié)構(gòu),通常稱為Linux源碼目錄樹。本章節(jié)以linux 5.4.31為例來介紹一下linux內(nèi)核目錄結(jié)構(gòu)。
頂層目錄的Makefile是整個(gè)內(nèi)核配置編譯的核心文件,負(fù)責(zé)組織目錄樹中子目錄的編譯管理,還可以設(shè)置體系結(jié)構(gòu)和版本號等。
首先來看第一級目錄

目錄
內(nèi)容
arch
包含各體系結(jié)構(gòu)特定的代碼,如 arm、x86、ia64、mips等,在每個(gè)體系結(jié)構(gòu)目錄下通常都有:
/boot:內(nèi)核需要的 特定平臺代碼。
/kernel:體系結(jié)構(gòu)特有的代碼。
/lib:通用函數(shù)在特定體系結(jié)構(gòu)的實(shí)現(xiàn)。
/math-emu:模擬FPU的代碼。
/mm:特定體系結(jié)構(gòu)的內(nèi)存管理實(shí)現(xiàn)。
/include:特定體系的頭文件 。
block
存放塊設(shè)備相關(guān)代碼
crypto
存放加密、壓縮、CRC校驗(yàn)等算法相關(guān)代碼
Documentation
存放相關(guān)說明文檔,很多實(shí)用文檔,包括驅(qū)動編寫等
drivers
存放 Linux 內(nèi)核設(shè)備驅(qū)動程序源碼。
驅(qū)動源碼在 Linux 內(nèi)核源碼中占了很大比例,常見外設(shè)幾乎都有可參考源碼,對驅(qū)動開發(fā)而言,該目錄非常重要。
該目錄包含眾多驅(qū)動,目錄按照 設(shè)備類別 進(jìn)行分類,如char、block、input、i2c、spi、pci、usb等。
firmware
存放處理器相關(guān)的一些特殊固件
fs
存放所有文件系統(tǒng)代碼,如fat、ext2、ext3、ext4、ubifs、nfs、sysfs等。
include
存放內(nèi)核所需、與平臺無關(guān)的頭文件,與平臺相關(guān)的頭文件已經(jīng)被移動到arch平臺的include目錄,如 ARM 的頭文件目錄<arch/arm/include/asm/>
init
包含內(nèi)核初始化代碼
ipc
存放進(jìn)程間通信代碼
kernel
包含Linux內(nèi)核管理代碼
lib
庫文件代碼實(shí)現(xiàn)
mm
存放內(nèi)存管理代碼
net
存放網(wǎng)絡(luò)相關(guān)代碼
samples
存放提供的一些內(nèi)核編程范例,如kfifo;
相關(guān)用戶態(tài)編程范例,如hidraw。
scripts
存放一些腳本文件,如menuconfig腳本
security
存放系統(tǒng)安全性相關(guān)代碼
sound
存放聲音、聲卡相關(guān)驅(qū)動
tools
編譯過程中一些主機(jī)必要工具
usr
cpio相關(guān)實(shí)現(xiàn)
virt
內(nèi)核虛擬機(jī)KVM
Linux內(nèi)核源碼中接近一半的代碼量是驅(qū)動,對某一個(gè)特定主板的系統(tǒng)而言,驅(qū)動也占據(jù)很大的比例,底層開發(fā)的很大一部分是驅(qū)動相關(guān)工作。掌握從眾多驅(qū)動中找到正確的驅(qū)動源碼文件,并根據(jù)產(chǎn)品的實(shí)際需求進(jìn)行修改調(diào)整的方法,能有效促進(jìn)產(chǎn)品開發(fā)的進(jìn)度。
Linux內(nèi)核源碼樹drivers目錄很復(fù)雜,包含了各種外設(shè)的驅(qū)動。對嵌入式Linux開發(fā)而言,通常需要關(guān)注如下目錄。
目錄
說明
drivers/gpio
系統(tǒng)GPIO子系統(tǒng) 和 驅(qū)動目錄,包括處理器內(nèi)部GPIO以及外擴(kuò)GPIO驅(qū)動。遵循GPIO子系統(tǒng)的驅(qū)動,可通過/sys/class/gpio進(jìn)行訪問
drivers/hwmon
硬件監(jiān)測相關(guān)驅(qū)動,如溫度傳感器、風(fēng)扇監(jiān)測等
drivers/i2c
I2C子系統(tǒng)驅(qū)動。各I2C控制器的驅(qū)動在i2c/busses目錄下
drivers/input
輸入子系統(tǒng)驅(qū)動目錄
drivers/input/keyboard
非HID鍵盤驅(qū)動,如GPIO鍵盤、矩陣鍵盤等
drivers/input/touchscreen
觸摸屏驅(qū)動,如處理器的觸摸屏控制器驅(qū)動、外擴(kuò)串行觸摸屏控制器驅(qū)動、串口觸摸屏控制器驅(qū)動等
drivers/leds
LED子系統(tǒng)和驅(qū)動,如GPIO驅(qū)動的LED。遵循 LED子系統(tǒng)的驅(qū)動 ,可通過/sys/class/leds進(jìn)行訪問
drivers/mfd
多功能器件(Multi-Function Device)驅(qū)動。如果一個(gè)器件能做多種用途,通常需要借助MFD來完成。
drivers/misc
雜項(xiàng)(Miscellaneous)驅(qū)動。所驅(qū)動的設(shè)備可通過/sys系統(tǒng)訪問
drivers/mmc
SD(Secure Digital)/MMC(Mutimedia Card)卡驅(qū)動目錄
drivers/mtd
MTD(Memory Technology Device)子系統(tǒng)和驅(qū)動,包括NAND、oneNAND等。
drivers/mtd/nand
NAND FALSH的MTD驅(qū)動目錄,包括NAND的基礎(chǔ)驅(qū)動和控制器接口驅(qū)動
drivers/net
網(wǎng)絡(luò)設(shè)備驅(qū)動,包括MAC、PHY、CAN、USB 網(wǎng)卡、無線、PPP協(xié)議等
drivers/net/can
CAN設(shè)備驅(qū)動。
Linux已經(jīng)將CAN歸類到網(wǎng)絡(luò)中,采用socket_CAN接口
drivers/net/ethernet
所支持的MAC驅(qū)動。
常見廠家的MAC驅(qū)動都能找到,如broadcom、davicom、marvell、micrel、smsc等廠家的MAC,處理器自帶MAC的驅(qū)動也在該目錄下
drivers/net/phy
PHY驅(qū)動,比如marvell、micrel和smsc的一些PHY驅(qū)動
drivers/rtc
RTC子系統(tǒng)和RTC芯片驅(qū)動
drivers/spi
SPI子系統(tǒng)和SPI控制器驅(qū)動,含GPIO 模擬SPI的驅(qū)動
drivers/tty
TTY 驅(qū)動
drivers/tty/serial
串口驅(qū)動,包括8250串口以及各處理器內(nèi)部串口驅(qū)動實(shí)現(xiàn)
drivers/uio
用戶空間IO驅(qū)動
drivers/usb
USB驅(qū)動,包括USB HOST、Gadget、USB轉(zhuǎn)串口以及OTG等支持。
drivers/video
Video驅(qū)動,包括Framebuffer驅(qū)動、顯示控制器驅(qū)動和背光驅(qū)動等。
drivers/video/backlight
背光控制驅(qū)動
drivers/video/logo
Linux內(nèi)核啟動LOGO圖片目錄
drivers/watchdog
看門狗驅(qū)動,包括軟件看門狗和各種硬件看門狗驅(qū)動實(shí)現(xiàn)