linux驅動之模組化程式設計

2021-08-18 03:36:47 字數 3125 閱讀 1296

區別於直接編譯原始碼,可以快速編譯功能**,以模組的形式新增到linux系統中,便於測試,而不是反覆修復原始碼進行編譯。

包含標頭檔案,並通過module_license("gpl")告訴核心模組遵從gpl協議,這個事情必須要做。module_author("cyg")指定模組的作者,可不寫。

編輯模組的入口函式,一般叫***_init,在模組載入到linux核心時,linux會呼叫該函式。

編輯模組的出口函式,一般叫***_exit,在模組解除安裝的時候釋放資源。

核心通過module_init巨集查詢入口函式,用module_exit巨集查詢出口函式。

注意按該框架進行程式設計

printk函式用法與printf類似,printf用於使用者空間,printk用於核心空間。用printk函式時,核心會根據日誌級別,可能把訊息列印到當前控制台上。這些訊息正常輸出的前提是:日誌輸出級別小於console_loglevel(在核心中數字越小優先順序越高)。日誌級別一共有8個,printk的日誌級別定義如下(/linux/kernel.h):

沒有指定日誌級別的printk語句預設採用的級別是default_message_loglevel(這個預設級別一般為<4>,即與kern_warning乙個級別),可以通過cat /proc/sys/kernel/printk檢視系統預設的日誌級別

在 linux 剛啟動核心初始化時,控制台裝置還沒有初始化的時候,printk 只會把資訊輸送到 ring buffer 中,等控制台裝置初始化好後,再根據 ring buffer 中訊息的優先順序決定是否需要輸送到控制台裝置上。可以通過dmesgdmesg|tail讀取 ring buffer(環形緩衝區)資訊,通過dmesg -c清空 ring buffer。

呼叫 linux 原始碼樹的 makefile 進行收集編譯乙個模組所需要的資訊

linux 原始碼樹的 makefile 收集玩資訊後,呼叫模組的 makefile 獲取需要編譯成模組的.c檔案,最後生成模組.ko

模組的 makefile 例項如下:

obj-m := hello.o   

kerneldir := /home/fa/linux-3.4.y

pwd := $(shell pwd)

modules:

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

modules_install:

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

make -c 表示呼叫指定路徑下的 makefile ,m 後邊跟的是模組的絕對路徑,modules 告訴 makefile 要進行模組編譯。當我們在呼叫 linux 核心原始碼樹頂層的 makefile 時,找到的是頂層 makefile 的modules目標,擷取片段如下:

obj-m := hello.o,這裡的obj=m告訴 linux 原始碼樹的頂層 makefile 是動態編譯(編譯成模組),而不是編譯進核心(obj-y),頂層makefile會根據 hello.o 去找到 hello.c 檔案。

$ insmod ***.ko #載入,注意只有root超級使用者許可權才可以新增模組到核心

$ lsmod #檢視模組

$ rmmod ***.ko #解除安裝模組

編寫 hello 驅動

#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);

//載入或解除安裝時會有列印

# makefile

obj-m := hello.o

kerneldir := /home/fa/linux-3.4.y

pwd := $(shell pwd)

modules:

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

modules_install:

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

clean:

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

注意 makefile 的格式,如果直接 copy 可能會有格式錯誤,最好使用 vim 檢查一下

模組化程式設計

將乙個5元素陣列,右移n位,n從鍵盤輸入,首尾相接 例如 陣列中的元素為 那麼 n 3 的結果如下 資料是向右邊移三位,那麼,我轉化成先移一位的情況。因為當移一位的問題解決了,移動n位只需要將此過程迴圈n次即可 1.把a 1 放到臨時空間t t a 1 2.依次把前面元素的值放到後面的空間裡面.從後...

模組化程式設計小結

模組化程式設計,可以讓程式變得容易理解,結構更加清晰,下面小結一下如何進行模組化程式設計 本文以keil軟體進行舉例 1 將所需要的程式分為 c 和 h 兩類,其中 c 中用來實現程式,h 則用來宣告程式 2 在 c 的檔案中,包含所需的標頭檔案,如 include reg52.h 3 在宣告函式的...

模組化程式設計理解

工作中在做客戶運營系統時,發現js和css的引用還處於最原始的狀態沒有更新。在上乙個專案中通過物件和其中的方法實現了簡單的模組化程式設計。但隨著工程專案的龐大程度增加,簡單的物件已經滿足不了模組化程式設計的需求了,所以接觸了requirejs,了解了amd程式設計規範。和amd對應的是cmd,在no...