文章目錄
udev與mdev
配置mdev熱插拔
常用接口
class_create函數
class_destroy函數
device_create函數
device_destroy函數
驅動中的修改
點擊下方閱讀原文可訪問文中超鏈接
在之前的內容中,執行應用程序之前,都要手動使用mknod
命令來創建設備節點,這種方法非常的不方便,實際上現在的內核已經提供了一些接口,加上一個用戶空間程序就可以實現自動刪除與自動創建。
udev與mdev
引用維基百科的一段描述:
udev 是Linux kernel 2.6系列的設備管理器。它主要的功能是管理/dev目錄底下的設備節點。它同時也是用來接替devfs及hotplug的功能,這意味著它要在添加/刪除硬件時處理/dev目錄以及所有用戶空間的行為,包括加載firmware時。
udev
是一個用戶空間程序,一般用在PC機上,而在嵌入式系統中常用簡化版的mdev
來替代,在使用busybox
制作根文件系統時,里面就有mdev
這個應用程序(需要在配置中勾選),位于/sbin/mdev
。
配置mdev熱插拔
在根文件系統中的/etc/init.d/rcS
文件中添加如下的內容:
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
常用接口
位于頭文件:include\linux\device.h
class_create函數
此函數用以創建設備類,會在/sys/class/
目錄下生成對應的設備類,準確的說它應該是一個宏定義,原型如下:
#define class_create(owner, name) \
({ \
static struct lock_class_key __key; \
__class_create(owner, name, &__key); \
})
class_destroy函數
此函數用以銷毀設備類。
void class_destroy(struct class *cls);
device_create函數
此函數用以創建一個設備,也就對應了/dev/
目錄下的一個設備節點。
struct device *device_create(struct class *cls, struct device *parent,
dev_t devt, void *drvdata,
const char *fmt, ...);
device_destroy函數
此函數用以銷毀對應的設備。
void device_destroy(struct class *cls, dev_t devt);
驅動中的修改
在驅動中還需要使用相應的接口來告知內核此驅動的信息,這樣內核才能將信息傳遞給應用層的mdev
程序來創建和刪除設備節點。
static dev_t devno;
static struct class *test_char_dev_class;
static int __init test_init(void)
{
/*省略注冊字符設備步驟*/
/*創建設備類*/
test_char_dev_class = class_create(THIS_MODULE,"test_char_dev_class");
/*創建設備*/
device_create(test_char_dev_class,NULL,devno,NULL,"test_char_dev");
return 0;
}
static void __exit test_exit(void)
{
/*銷毀設備*/
device_destroy(test_char_dev_class,devno);
/*銷毀設備類*/
class_destroy(test_char_dev_class);
/*省略字符設備的注銷步驟*/
}
完成以上的操作后,每次裝載完驅動就可以不用再手動使用mknod
命令來創建設備節點了,卸載驅動后對應的設備節點也會自動刪除。
測試源碼獲取:點我