模組
可以在執行時插入到核心中的**叫做模組
模組和應用程式的區別
應用程式 模組
1. 執行空間 使用者空間 核心空間
2. 入口函式 main 載入函式
3. 庫 usr/lib 核心原始碼庫
4. 資源釋放 可以釋放 必須釋放
5. 段錯誤的危害 危害小 危害大
模組三要素
模組許可證宣告(必須)
module_license( "gpl" )
模組載入函式(必須)
1 -- 預設形式
int init_module(void)
2 -- 自定義形式
int hello_init(void)
module_init(hello_init);
模組解除安裝函式(必須)
1 -- 預設形式
void cleanup_module(void)
2 -- 自定義形式
void hello_exit(void)
module_exit(hello_exit);
操作模組的命令
1. 插入模組
sudo insmod hello.ko
2. 檢視核心中插入的所以模組
lsmod
定位查詢
lsmod | grep hello
3. 檢視printk的資訊
dmesg
清除printk的緩衝區: sudo dmesg -c //先顯示再清除
sudo dmesg -c //直接清除
4. 刪除乙個模組
sudo rmmod hello
模組引數
insmod ***.ko btrate=115100
1. 在模組裡面定義乙個變數來接收引數
int myint = 0;
2. 宣告這個變數是用來接收引數的
module_param(引數名,引數型別,引數讀/寫許可權)
module_param(myint, int, 0600);
//引數描述 ,可以通過modinfo檢視
module_parm_desc (myshort, "a short integer");
3. 使用
insmod hello.ko myint=10 mystring="hello" myarr=1,3,5,7
多檔案程式設計
模組匯出符號
***********************************== 搭建字元裝置驅動的框架 *************************====
驅動分類
按訪問順序分類:
字元裝置
順序訪問
滑鼠,鍵盤,串列埠 幀緩衝裝置
c塊裝置
按塊進行訪問,一般都有緩衝區
儲存裝置
b網路裝置
soket
網絡卡裝置號
檢視當前主機的裝置號
1.cd /dev
ls -l |grep 裝置名 //顯示主裝置號和次裝置號
2.cat /proc/devices //只顯示主裝置號
本質:32位的無符號整形 dev_t
高12位:主裝置號 代表這個裝置屬於哪一類裝置
低20位:次裝置號 區分這個裝置屬於這類裝置中的具體哪乙個
自定義裝置號:
int major = 255;
int minor = 0;
//傳統的方法
dev_t devno = major << 20 | minor;
dev_t devno = mkdev(major, minor);
註冊裝置號
int register_chrdev_region(dev_t from, unsigned count, const char *name)
from:要註冊的裝置號
count:要註冊的數量
name:名字
返回值:成功返回0, 失敗返回負數
釋放裝置號:
void unregister_chrdev_region(dev_t from, unsigned count)
動態申請裝置號
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
dev:輸出引數,用來儲存申請到的裝置號
baseminor:你要申請的第乙個次裝置號
返回值:成功返回0, 失敗返回負數
最後:當前linux核心用的標頭檔案:
linux驅動開發 模組引數
在我們使用模組的時候需要在裝載時傳遞引數給模組,linux 支援在裝載模組的同時傳入引數 比如 num 和who就是傳入模組的引數 insmod hello.ko num 10 who jack 模組引數必須用module parm巨集宣告,這個巨集定義在,剛才連個引數在模組中的定義如下 stati...
RTC模組驅動開發總結
1 rtc模組的裝置驅動模型 2 i2c模組的驅動模型 3 rtc模組涉及的檔案和資料結構 934x.c 該檔案為系統的硬體平台檔案,定義了rtc模組用到的硬體資源,包括記憶體位址空間,gpio,中斷資源,並將rtc裝置註冊進核心的裝置鍊錶中。rtc ds1307.c 該檔案為rtc模組的裝置驅動檔...
驅動開發 1 模組hello world
本文介紹在核心編譯模組 載入和解除安裝模組的過程。首先開發環境是linux 4.4.0 兩份 hello.c makefile。這兩份 放到 呢?答案是 都可以,不過要注意放在乙個資料夾下。這個資料夾的位置就是makefile中的current path,編譯終端在這個資料夾開啟就行。hello.c...