色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > udev機(jī)制

udev機(jī)制 時(shí)間:2018-08-16      來源:未知

問題背景:用戶插入U(xiǎn)盤后需要自動(dòng)打開U盤目錄,但是發(fā)現(xiàn)U盤每次掛載點(diǎn)都不一樣,測試兩個(gè)U盤的掛載點(diǎn)分別是/media/sda1和/media/sda4,所以就需要了解一下linux的udev機(jī)制了

我們知道,每個(gè)設(shè)備注冊后會自動(dòng)產(chǎn)生設(shè)備節(jié)點(diǎn),以字符設(shè)備為例,不管是misc_register還是配合cdev_add接口注冊驅(qū)動(dòng),都需要調(diào)用device_create來創(chuàng)建設(shè)備節(jié)點(diǎn),就從這個(gè)函數(shù)入手,看其在3.2.0內(nèi)核版本的注冊流程

device_create

device_create_vargs

device_register(struct device *dev)

device_add(dev);

kobject_uevent(&dev->kobj, KOBJ_ADD);

kobject_uevent_env(kobj, action, NULL);

char *action_string = kobject_actions[action]; //action_string = "add"

struct kobj_uevent_env *env = kzalloc(sizeof(struct kobj_uevent_env), GFP_KERNEL);

add_uevent_var(env, "ACTION=%s", action_string); //env[0] = "ACTION=add"

add_uevent_var(env, "DEVPATH=%s", devpath); //這兩個(gè)先不關(guān)注

add_uevent_var(env, "SUBSYSTEM=%s", subsystem);

argv [0] = uevent_helper;

argv [1] = (char *)subsystem;

argv [2] = NULL;

add_uevent_var(env, "HOME=/"); //設(shè)置其他環(huán)境變量

add_uevent_var(env, "PATH=/sbin:/bin:/usr/sbin:/usr/bin");

//調(diào)用argv[0]指向的應(yīng)用程序來根據(jù)環(huán)境變量env->envp一些參數(shù)來創(chuàng)建設(shè)備節(jié)點(diǎn)

call_usermodehelper(argv[0], argv, env->envp, UMH_WAIT_EXEC);

到這里,我們基本知道,內(nèi)核在啟動(dòng)時(shí)候已經(jīng)設(shè)置了一些環(huán)境變量,可以在終端用命令env看一下

TSLIB_TSDEVICE=/dev/input/event0

QTDIR=/usr/gui/qt

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin

HOME=/home/root

我的板子由于需要QT,所以一些環(huán)境變量已經(jīng)改過或者添加了新的

那么上面提到用戶空間的argv[0]即uevent_helper到底是什么呢?

從內(nèi)核源碼看uevent_helper初始化地方看是全部設(shè)置為"/sbin/hotplug"

可是我在板子上執(zhí)行 ls /sbin/hotplug 命令并沒有發(fā)現(xiàn)這個(gè)程序,簡單的辦法就是打印一下了。

在調(diào)用call_usermodehelper之前加上下面打印

 

printk("uevent_helper = %s\n", uevent_helper);

for(i=0; env->envp[i]; i++)

{

printk("envp[%d] = %s\n", i,env->envp[i]);

}

重新編譯內(nèi)核然后啟動(dòng)截取部分打印如下(每注冊一個(gè)驅(qū)動(dòng)都會出現(xiàn)這一串打印):

看門狗注冊

uevent_helper = /sbin/hotplug

envp[0] = ACTION=add

envp[1] = DEVPATH=/devices/platform/omap/omap_wdt/misc/watchdog

envp[2] = SUBSYSTEM=misc

envp[3] = MAJOR=10

envp[4] = MINOR=130

envp[5] = DEVNAME=watchdog

envp[6] = SEQNUM=520

envp[7] = HOME=/

envp[8] = PATH=/sbin:/bin:/usr/sbin:/usr/bin

按鍵注冊

uevent_helper = /sbin/hotplug

envp[0] = ACTION=add

envp[1] = DEVPATH=/devices/platform/gpio-keys/input/input2

envp[2] = SUBSYSTEM=input

envp[3] = PRODUCT=19/1/1/100

envp[4] = NAME="gpio-keys" envp[5] = PHYS="gpio-keys/input0" envp[6] = PROP=0 envp[7] = EV=3 envp[8] = KEY=14001 40000000 envp[9] = MODALIAS=input:b0019v0001p0001e0100-e0,1,kramlsfw envp[10] = SEQNUM=572 envp[11] = HOME=/ envp[12] = PATH=/sbin:/bin:/usr/sbin:/usr/bin

我插入的2GB U盤 uevent_helper = /sbin/hotplug envp[0] = ACTION=add envp[1] = DEVPATH=/bus/hid/drivers/generic-usb envp[2] = SUBSYSTEM=drivers envp[3] = SEQNUM=551 envp[4] = HOME=/ envp[5] = PATH=/sbin:/bin:/usr/sbin:/usr/bin sd 0:0:0:0: [sda] 3919872 512-byte logical blocks: (2.00 GB/1.86 GiB)

uevent_helper仍然是hotplug,查了一些資料,貌似是說2.6以后udev機(jī)制替換了hotplug,而嵌入式中的udev即mdev,所以要去看下文件系統(tǒng)busybox的mdev源碼 相關(guān)資料鏈接:

//blog.chinaunix.net/uid-14753126-id-2978523.html

//www.cnblogs.com/hnrainll/archive/2011/06/23/2088250.html

mdev.c mdev_main action = getenv("ACTION"); //插入u盤就是"add" env_path = getenv("DEVPATH"); sprintf(temp, "/sys%s", env_path); //u盤的 temp = "/sys/bus/hid/drivers/generic-usb" make_device(temp, 0); device_name = bb_basename(path); //根據(jù)上面temp取出設(shè)備名字 if (ENABLE_FEATURE_MDEV_CONF) { //如果配置了支持mdev.conf選項(xiàng),那么就解析里邊內(nèi)容并執(zhí)行 .... } type = path[5]=='c' ? S_IFCHR : S_IFBLK; //判斷是字符還是塊設(shè)備 sscanf(temp, "%d:%d", &major, &minor) //取出主次設(shè)備號 mknod(device_name, mode | type, makedev(major, minor)) //創(chuàng)建設(shè)備節(jié)點(diǎn)

 

這就是設(shè)備從內(nèi)核到用戶空間創(chuàng)建設(shè)備節(jié)點(diǎn)的整個(gè)過程,而如果我們要對設(shè)備節(jié)點(diǎn)做手腳,就需要從mdev下手了 busybox源碼有個(gè)幫助文檔mdev.txt講了應(yīng)該如何去操作mdev.conf,從而實(shí)現(xiàn)一些高級功能,比如U盤自動(dòng)掛載

 

文檔很短,其中重要就是下面這段內(nèi)容: ---------------------------------------------------------------------------- ------------- MDEV Config (/etc/mdev.conf) ------------- Mdev has an optional config file for controlling ownership/permissions of device nodes if your system needs something more than the default root/root 660 permissions. The file has the format: : For example: hd[a-z][0-9]* 0:3 660 The config file parsing stops at the first matching line. If no line is matched, then the default of 0:0 660 is used. To set your own default, simply create your own total match like so: .* 1:1 777 If you also enable support for executing your own commands, then the file has the format: : [<@|$|*>   
  
 
 
] The special characters have the meaning: @ Run after creating the device. $ Run before removing the device. * Run both after creating and before removing the device. The command is executed via the system() function (which means you're giving a command to the shell), so make sure you have a shell installed at /bin/sh. For your convenience, the shell env var $MDEV is set to the device name. So if the device 'hdc' was matched, MDEV would be set to "hdc". ----------------------------------------------------------------------------

大體意思就是: 配置文件格式: : [<@|$|*>   
  
 
 
] 各個(gè)參數(shù)代表的含義如下: device regex:正則表達(dá)式,表示哪一個(gè)設(shè)備 uid: owner gid: 組ID octal permissions:以八進(jìn)制表示的屬性 @:創(chuàng)建設(shè)備節(jié)點(diǎn)之后執(zhí)行命令 $:刪除設(shè)備節(jié)點(diǎn)之前執(zhí)行命令 *: 創(chuàng)建設(shè)備節(jié)點(diǎn)之后 和 刪除設(shè)備節(jié)點(diǎn)之前 執(zhí)行命令 command:要執(zhí)行的命令 所以如果要想讓U盤自動(dòng)掛載怎么辦呢?就需要在/etc下建立mdev.conf文件,并編輯內(nèi)容如下: sda[1-9]+ 0:3 660 * if [ $ACTION = "add" ]; then mount /dev/$MDEV /mnt; else umount /mnt; fi 其中sda[1-9]+是一個(gè)正則表達(dá)式,表示sda1...sda9(U盤默認(rèn)設(shè)備節(jié)點(diǎn)名),0:3 660就是 : 這部分內(nèi)容,剩下的一大串shell命令就是掛載命令了 搞懂了這些再去操作U盤相關(guān)修改就很容易了。

 

---------------------------------------------------------------------------- 公司fs的配置非常麻煩,不符合上述流程,后是通過搜"mount"關(guān)鍵字找到其實(shí)是/etc/udev/scripts/mount.sh操控這個(gè)流程 那么需要做如下內(nèi)容修改: 第23-25行: ! test -d "/media/$name" && mkdir -p "/media/$name" if ! $MOUNT -t auto $DEVNAME "/media/$name" 改為: ! test -d "/upan" && mkdir -p "/upan" if ! $MOUNT -t auto $DEVNAME "/upan" 這樣無論哪個(gè)u盤都會掛載到/upan目錄下了

上一篇:STM32F030 Nucleo-做個(gè)準(zhǔn)確的延時(shí)SysTick

下一篇:利用udev、sys動(dòng)態(tài)創(chuàng)建linux設(shè)備結(jié)點(diǎn)

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號-5,京公海網(wǎng)安備11010802025203號

回到頂部

主站蜘蛛池模板: 色欲久久九色一区二区三区 | 久久影院午夜伦手机不四虎卡 | 啦啦啦高清在线观看视频www | 国产青榴视频在线观看 | 法国啄木乌AV片在线播放 | 亚洲日韩国产一区二区三区 | 亚洲欧美在线观看, | WWW插插插无码免费视频网站 | www.中文字幕在线 | 午夜羞羞影院男女爽爽爽 | 在线免费高清一区二区三区 | 啦啦啦免费播放视频在线观看 | 日本视频免费高清一本18 | 少妇高潮灌满白浆毛片免费看 | 最近中文字幕高清2019中文字幕 | 夜色资源站ye321mp4 | 丰满多毛少妇做爰视频爽爽和R | 日美一级片 | 亚洲成L人在线观看线路 | 东京热一精品无码AV | 亚洲欧美日韩精品成人 | 成在线人免费无码高潮喷水 | 男吃奶玩乳尖高潮视频 | 亚洲午夜无码久久久久小说 | 日韩1234区 | 首页 国产 欧美 日韩 丝袜 | 农村黄色一级片 | 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 成人高清在线观看 | 男人和女人做爽爽免费视频 | 精品免费看国产一区二区 | 玩偶姐姐免费 | 真人无码作爱免费视频网站 | 青青艹av | 国产AV无码专区亚洲版 | 欧洲欧美人成视频在线 | 亚洲欧美牲交 | 亚洲综合精品视频 | 老司机在线网站 | 黄色污污网站 | 国产黄色片麻豆 |