Linux Kernel 學習筆記3 裝置編號

2021-07-30 13:34:13 字數 1601 閱讀 6830

(本章基於:linux-4.4.0-37)

linux中裝置編號分為主、次兩種。主裝置編號表示裝置相連的驅動。次裝置號決定引用哪個裝置,這個由驅動自行定義。

在核心中,裝置編號型別為dev_t,本質就是乙個32位無符號整型的量,在linux/types.h中定義。其中主編號佔12位,次編號佔20位。通過下面的巨集可以獲取主次編號:

major(dev_t dev);

minor(dev_t dev);

相反,通過主次編號獲取裝置編號使用:

mkdev(int major, int minor);

以上巨集在linux/kdev_t.h中定義

靜態註冊裝置編號:

int register_chrdev_region(dev_t, unsigned, const char *);

1)需要註冊的裝置編號

2)連續編號個數

3)裝置名,會出現在/proc/devices中

註冊成功返回0,失敗返回乙個錯誤碼

靜態註冊需要實現準備好乙個裝置號,但必須去其他的驅動模組區分開來,不能重複,因此靜態註冊並不常用,更通用的方法是讓核心動態為你分配乙個裝置編號。

動態註冊裝置編號:

int alloc_chrdev_region(dev_t *, unsigned, unsigned, const char *);

1)裝置編號

2)第乙個次裝置號,常用0

3)連續編號個數

4)裝置名

成功註冊返回0,失敗返回乙個錯誤碼

無論用哪種方式註冊裝置編號,當不再使用的時候需要登出此裝置號,以防止不必要的資源占用。

登出裝置編號:

void unregister_chrdev_region(dev_t, unsigned);

1)待登出的裝置號

2)連續的裝置號個數

以上函式均在linux/fs.h中定義

例: hello.c

#include #include #include #include #include dev_t devid;

static __init int hello_init(void)

else

#else

//動態

if(( result = alloc_chrdev_region(&devid, 0, 1, "stone-alloc-dev") ) != 0) else

#endif

printk(kern_alert "hello init success!\n");

return 0;

}static __exit void hello_exit(void)

module_init(hello_init);

module_exit(hello_exit);

成功載入模組後可在/proc/devices中檢視

# cat /proc/devices | grep stone

247 stone-alloc-dev

Linux Kernel學習004 核心開發特點

相對與在使用者空間內的應用開發,核心開發有很多獨特之處 libc的實現是依賴於核心的,因此,核心中不存在可以直接使用的libc。但是,大部分常用的c語言庫函式都在核心中得到了實現 在lib目錄下 標頭檔案,基本的標頭檔案都位於include目錄和arch 處理器架構 include中。雖然c語言有國...

Linux kernel 關於keyboard部分

linux kernel 關於keyboard部分 keyboard.c 用於處理和鍵盤相關的input handler。其中包括後續的鍵碼轉換和輸出 atkbd.c 常用的鍵盤布局,用於獲得掃瞄碼,並將其傳送到input handler 鍊錶中 struct input handler kbd h...

Linux kernel併發處理

理解好併發處理,有幾個小概念是相關的。1.由於圖靈機本身是依賴side effect來工作,故同步互斥機制便有了必要性。角度來看,如果依賴了共享的變數,便意味著可能需要同步保護。如果是lamada演算的函式式程式設計,是不需要同步保護滴。2.死鎖dead lock的必要4條件。1.資源的獨占性 不可...