(本章基於: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.資源的獨占性 不可...