背景:
由於調試內核或者由於分區大小限制,有時候內核組件不一定完全需要編進內核中。
所以,在開發中經常將內核組件編譯成為模塊,等到在恰當的時機加載。
概覽:
Linux內核模塊的編譯方法有兩種:
1.放入linux內核源碼中編譯。
2.獨立編譯模塊。
放入Linux內核源碼中編譯:
首先需要了解Kconfig和Makefile的作用
Kconfig:對應內核模塊的配置菜單。
Makefile:對應內核模塊的編譯選項。
Linux內核編譯過程:根據配置裁剪的結果配合Makefile完成內核編譯。
以ARM平台為例,具體配置過程:
1.當執行make menuconfig 時,系統首先讀取arch/arm/Kconfig生成整個配置界面 2.在讀取配置界面的同時,系統會讀取頂層目錄下的.config文件,生成所有配置選項的默認值 3.當修改玩配置並保存后,系統會更新頂層目錄下的.config 4.當執行make時,各層的Makefile會根據.config文件中的編譯選項來決定哪些文件會被編譯到內核中,或者編譯成模塊。
添加到內核的步驟這里省去:《簡單添加自己的驅動程序到Linux內核樹中》
在內核配置頁中,將組件配置成M模塊以后,可以參考使用以下命令。(下划線部分根據實際情況增減)
make ARCH=arm CROSS_COMPILE=arm-hisiv500-linux- modules
之后,便可以在打印信息中找到模塊所在路徑,拷貝出來即可。
例如
LD [M] drivers/media/usb/gspca/gspca_main.ko LD [M] fs/exfat/exfat.ko
獨立模塊編譯:
1.根據內核模塊編寫規則,編寫好有關的模塊。
2.新建Makefile,參考以下內容(根據實際情況進行修改,注意tab對齊)
# 最終的模塊名 obj-m += led_drv.o # 內核源碼所在根目錄 KERNELDIR:=/home/schips/linux3.18/ # 指定的編譯工具鏈 CROSS_COMPILE:=/usr/local/cross/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi- # 以下內容一般不做修改 PWD:=$(shell pwd) default: $(MAKE) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNELDIR) M=$(PWD) modules clean: rm -rf *.o *.order .*.cmd *.ko *.mod.c *.symvers *.tmp_versions
3. make 即可。
這里是Linux移植exfat驅動的實例:《Linux 內核添加exfat驅動》