源碼分析:
class_device_create
class_device_register
class_device_add
kobject_uevent(&class_dev->kobj, KOBJ_ADD);
kobject_uevent_env(kobj, action, NULL);
// action_string = "add";
action_string = action_to_string(action);
/* 分配保存環境變量的內存 */
/* environment values */
buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL);
/* 設置環境變量 */ Garmen:環境變量是什麼?答:你在開發板輸入env就可以看到了環境變量了
envp [i++] = scratch;
scratch += sprintf(scratch, "ACTION=%s", action_string) + 1;
envp [i++] = scratch;
scratch += sprintf (scratch, "DEVPATH=%s", devpath) + 1;
envp [i++] = scratch;
scratch += sprintf(scratch, "SUBSYSTEM=%s", subsystem) + 1;
/* 調用應用程序: 比如mdev */
/* 啓動腳本 echo /sbin/mdev > /proc/sys/kernel/hotplug
* 設置了uevent_helper爲“/sbin/mdev“
*/
argv [0] = uevent_helper; // = "/sbin/mdev"
argv [1] = (char *)subsystem;
argv [2] = NULL;
/*Garmen:最終調用call_usermodehelper 這個函數*/
call_usermodehelper (argv[0], argv, envp, 0);
分析: busybox mdev.c
Garmen:應用程序會根據這些環境變量來創建設備節點
100ask: uevent_helper = /sbin/mdev
envp[0] = HOME=/
envp[1] = PATH=/sbin:/bin:/usr/sbin:/usr/bin
envp[2] = ACTION=add
envp[3] = DEVPATH=/class/sixth_drv/buttons
envp[4] = SUBSYSTEM=sixth_drv
envp[5] = SEQNUM=720
envp[6] = MAJOR=252
envp[7] = MINOR=0
mdev_main
temp = /sys/class/sixth_drv/buttons
make_device(temp, 0);
/* 確定設備文件名,類型,主次設備號 */
device_name = bb_basename(path); = "buttons"
'c' == > 字符設備節點
根據"/sys/class/sixth_drv/buttons/dev"的內容確定主次設備號
/*Garmen:調用mknod創建設備節點*/
mknod(device_name, mode | type, makedev(major, minor)
問:我接上U盤,想自動掛載,怎麼辦?
答:寫mdev.conf來自動掛載,就這麼簡單
mdev.conf的格式:
<device regex> <uid>:<gid> <octal permissions> [<@|$|*> <command>]
解析:
device regex:**正則表達式**,表示哪一個設備
uid: owner
gid: 組ID
octal permissions:以八進制表示的屬性
@:創建設備節點之後執行命令
$:刪除設備節點之前執行命令
*: 創建設備節點之後 和 刪除設備節點之前 執行命令
command:要執行的命令
1、
GID爲GroupId,即組ID,用來標識用戶組的唯一標識符
UID爲UserId,即用戶ID,用來標識每個用戶的唯一標示符
2、
正則表達式小解析:
①在電腦上查找文件:.c(“”表示通配符,任意字符的意思)
②更精確的話,用正則表達式:
“.”:表示人一直字符,()換行符除外)
“*”: 重複0次或者更多次
“+”: 重複1次或者更多次
“?”:重複0次或者1次
“[...]” :表示這些...字符裏面的某一個;例如[abc]表示abc字符裏面的某一個字符
寫mdev.conf
文件位置在:/etc/mdev.conf
1、
leds 0:0 777
led1 0:0 777
led2 0:0 777
led3 0:0 777
2、
leds?[123]? 0:0 777
3、
leds?[123]? 0:0 777 @ echo create /dev/$MDEV > /dev/console //Garmen:/dev/$MDEV:環境變量
4、
放置一個腳本
leds?[123]? 0:0 777 * if [ $ACTION = "add" ]; then echo create /dev/$MDEV > /dev/console; else echo remove /dev/$MDEV > /dev/console; fi
5、
leds?[123]? 0:0 777 * /bin/add_remove_led.sh
把命令寫入一個腳本:
add_remove_led.sh
#!/bin/sh
if [ $ACTION = "add" ];
then
echo create /dev/$MDEV > /dev/console;
else
echo remove /dev/$MDEV > /dev/console;
fi
6、U盤自動加載
sda[1-9]+ 0:0 777 * if [ $ACTION = "add" ]; then mount /dev/$MDEV /mnt; else umount /mnt; fi
7、
sda[1-9]+ 0:0 777 * /bin/add_remove_udisk.sh
add_remove_udisk.sh
#!/bin/sh
if [ $ACTION = "add" ];
then
mount /dev/$MDEV /mnt;
else
umount /mnt;
fi