linux驅動學習筆記

2021-08-14 10:34:06 字數 2717 閱讀 2622

1.先從最簡單的例子開始

#include

#include

module_license("dual bsd/gpl");

static int hello_init(void)

printk(kern_alert "hello, world\n");

return 0;

static void hello_exit(void)

printk(kern_alert "goodbye, cruel world\n");

module_init(hello_init);

module_exit(hello_exit);

這個模組定義了兩個函式, 乙個在模組載入到核心時被呼叫

( hello_init )

以及乙個在模組被去除時被呼叫

( hello_exit ). moudle_init

和 module_exit

這幾行使用了特別的核心巨集來指出這兩個函式的角色

.另乙個特別的巨集

(module_license)

是用來告知核心

,該模組帶有乙個自由的許可證

;沒有這樣的說明

,在模組載入時核心會抱怨

. 對於這個小驅動,建立的makefile只要一行就行:

obj-m := hello.o 表明有乙個模組要從目標檔案

hello.o

建立.

在從目標檔案建立後結果模組命名為

hello.ko.

module.ko,

是來自2

個原始檔

(姑且稱之為

, file1.c

和 file2.c ),

正確的書寫應當是: 

obj-m := module.o

module-objs := file1.o file2.o

核心開發者開發了一種 makefile 方式

, 使得生活容易些對於那些在核心樹之外建立模組的人

.這個竅門是如下書寫你的

makefile: 

# if kernelrelease is defined, we've been invoked from the

這個 makefile 在一次典型的建立中要被讀2 次

.當從命令列中呼叫這個

makefile ,

它注意到

kernelrelease

變數沒有設定

.它利用這樣乙個事實來定位核心原始碼目錄

,即已安裝模組目錄中的符號連線指回核心建立樹

.如果你實際上沒有執行你在為其而建立的核心

,你可以在命令列提供乙個

kerneldir=

選項,

設定 kerneldir

環境變數

,或者重寫

makefile

中設定

kerneldir

的那一行

.一旦發現核心原始碼樹

, makefile

呼叫 default:

目標,

來執行第

2 個

make

命令(

在 makefile

裡引數化成

$(make))

象前面描述過的一樣來呼叫核心建立系統

.在第 2次讀

, makefile

設定 obj-m,

並且核心的

makefile

檔案完成實際的建立模組工作

. 2.載入和解除安裝模組

模組建立之後, 下一步是載入到核心

.如我們已指出的

, insmod

為你完成這個工作:

它依賴乙個在 kernel/module.c 中定義的系統呼叫

. 函式

sys_init_module

分配核心記憶體來存放模組

( 這個記憶體用

vmalloc

分配);

它接著拷貝模組的**段到這塊記憶體區

,借助核心符號表解決模組中的核心引用

,並且呼叫模組的初始化函式來啟動所有東西

. 模組可以用 rmmod 工具從核心去除.注意

, 如果核心認為模組還在用

(就是說

,乙個程式仍然有乙個開啟檔案對應模組輸出的裝置

),或者核心被配置成不允許模組去除

,模組去除會失敗

.可以配置核心允許"強行

"去除模組

,甚至在它們看來是忙的

.如果你到了需要這選項的地步,但是

, 事情可能已經錯的太嚴重以至於最好的動作就是重啟了

. # kernel build system and can use its language.

ifneq ($(kernelrelease),)

obj-m := hello.o

# otherwise we were called directly from the command

# line; invoke the kernel build system.

else

kerneldir ?= /lib/modules/$(shell uname -r)/build

pwd := $(shell pwd)

default:

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

endif 

linux驅動學習筆記(linux驅動標頭檔案說明)

include 是在linux 2.6.29 include linux下面尋找原始檔。include 是在linux 2.6.29 arch arm include asm下面尋找原始檔。include 是在linux 2.6.29 arch arm mach s3c2410 include ma...

linux驅動學習筆記(linux驅動標頭檔案說明)

include 是在linux 2.6.29 include linux下面尋找原始檔。include 是在linux 2.6.29 arch arm include asm下面尋找原始檔。include 是在linux 2.6.29 arch arm mach s3c2410 include ma...

linux驅動學習筆記(linux驅動標頭檔案說明)

include 是在linux 2.6.29 include linux下面尋找原始檔。include 是在linux 2.6.29 arch arm include asm下面尋找原始檔。include 是在linux 2.6.29 arch arm mach s3c2410 include ma...