Linux驅動開發 02 編譯驅動程式並安裝模組

2021-09-28 16:34:24 字數 3030 閱讀 5655

編譯驅動程式既可以在核心原始碼中進行,這樣可以通過make menuconfig來配置,也可以通過使用原始碼環境而不在原始碼中編譯。生成ko檔案,自己進行安裝模組。

在核心原始碼中編譯後生成的核心映象檔案包含該模組,啟動核心時,模組自動載入。這種方式又稱為靜態載入。響應的,不把模組編譯進核心,而使用命令載入的方式稱為動態載入

原始碼這種方式比較簡單,主要在於makefile檔案的編寫。直接上原始碼。

hello.c

#include #include module_license("dual bsd/gpl");

static int hello_init(void)

static void hello_exit(void)

module_init(hello_init);

module_exit(hello_exit);

module_author("aizizai");

module_description("a ****** hello world module~");

module_alias("a simpliest module");

makefile

config_module_sig=n

ifeq ($(kernelrelease),)

arch=x86_64

pwd:= $(shell pwd)

cross_compile=x86_64-linux-gnu-

cc=$(cross_compile)gcc

kerneldir=/usr/src/linux-source-4.4.0

hello.ko: hello.c

$(make) arch=$(arch) cross_compile=$(cross_compile) -c $(kerneldir) m=$(pwd) modules

else

obj-m += hello.o

endif

hello: hello.c

arm-linux-gnueabi-gcc $< -o $@ -g

clean:

rm -rf *.o *.ko *.mod.c .*.cmd *.markers *.order *.symvers .tmp_versions hello

其中 config_module_sig=n是因為自3.7核心以後有了核心簽名機制,不加上會提示模組沒有簽名。

編譯後如下圖:

安裝和解除安裝模組

sudo insmod hello.ko

sudo rmmod hello.ko

可以使用dmesg來檢視模組的列印資訊,如圖:

核心中使用kconfig來生成make menuconfig的選單。使用makefile來進行編譯,所以如果要在核心原始碼中編譯自己的驅動模組,就要修改這兩個檔案,同時又要在make menuconfig選單中配置選中。

先在核心原始碼/driver/目錄下建立hello資料夾

3.1 新建kconfig檔案

內容如下

hello module 就是make menuconfig的選單名

3.2 修改上層(driver目錄下的)kconfig

新增內容如下:

source "drivers/hello/kconfig"
3.3 修改makefile 如下
obj-$(config_hello)     += hello/
3.4 在make menuconfig中選中模組

路徑:driver device - hello module。如圖

3.5 編譯

aizizai@ubuntu:/usr/src/linux-source-4.4.0$ sudo make -j12
編譯後結果

aizizai@ubuntu:/usr/src/linux-source-4.4.0/drivers/hello$ ls

built-in.o hello.c hello.ko hello.mod.c hello.mod.o hello.o kconfig makefile modules.builtin modules.order

使用modinfo檢視模組資訊

自動安裝模組

sudo cp hello.ko /lib/modules/$(uname -r)/kernel/

sudo depmod

sudo modprobe hello

depmod 命令用於生成 modules.dep 和 map 檔案,該檔案用於在啟動時 modules 自動載入。該命令生成的檔案是 modules 之間依賴的乙個列表。(

modprobe可載入指定的個別模組,或是載入一組相依的模組。modprobe會根據depmod所產生的相依關係,決定要載入哪些模組。若在載入過程中發生錯誤,在modprobe會解除安裝整組的模組

linux驅動開發

這兩天在公司由於一直沒有太過於繁重的任務,於是便給分配了驅動開發的任務,之前一直不明白驅動開發和普通的嵌入式開發到底有什麼區別,然後有沒有經過系統的學習,於是就一直愣在那裡。不過慢慢的還是經過查資料,雖然 沒有編寫出來,但是對於系統的一些東西學習的終於有了一定的了解,感覺這個十分的重要,也為了給自己...

驅動 linux裝置驅動 字元裝置驅動開發

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...

02 Linux字元裝置驅動 LED驅動

字元裝置驅動程式的實現,主要工作就是實現 file operations 結構體中的函 數指標成員。參考 include linux fs.h 當應用程式使用 open 函式開啟某個字元裝置時,字元裝置驅動程式的file operations 結構體中的 open 成員就會被呼叫 當應用程式使用 r...