1.當我們每次插入u盤后,都會自動創(chuàng)鍵U盤的設備節(jié)點/dev/sda%d
??這是因為里面調用了device_create()實現(xiàn)的, busybox的mdev機制就會根據主次設備號等信息,在/dev下創(chuàng)建設備節(jié)點,如下圖所示:
??而想使用上面的sda1設備節(jié)點,讀寫數據時,還需要使用mount /dev/sda1 /mnt,來掛載u盤才行,會顯得非常麻煩,如下圖所示:
2.其實,可以在/etc/mdev.conf文件里加入一行語句就能實現(xiàn)自動裝載u盤,也可以在里面干其它與設備節(jié)點相關的事
2.1而/etc/mdev.conf又是什么?
??它是屬于mdev的一個配置文件,而mdev之前就講過了,它主要的功能是管理/dev目錄底下的設備節(jié)點
??當系統(tǒng)中有自動注冊設備節(jié)點的時候,mdev就會調用/etc/mdev.conf一次, 該文件可以實現(xiàn)與設備節(jié)點相關的事,比如自動裝載usb,打印創(chuàng)建的設備節(jié)點信息等
3.我們首先來分析device_create(),是如何來調用到/etc/mdev.conf的,后面再講如何使用mdev.conf(也可以直接跳過,直接看下面第4小節(jié),如何使用)
??(PS: 之前創(chuàng)建字符設備節(jié)點用的class_device_create(),其實是和device_create功能差不多)
3.1 device_create()最終調用了:device_create()->device_register()->device_add():
device_create()->device_register()->device_add()函數如下所示:
int class_device_add(struct class_device *class_dev)
{
... ...
kobject_uevent(&class_dev->kobj, KOBJ_ADD); // KOBJ_ADD是一個枚舉值
//調用了kobject_uevent_env(kobj, action, NULL); // action=KOBJ_ADD
}
3.2 device_create()->device_register()->device_add()->kobject_uevent_env()函數如下所示:
int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,char *envp_ext[])
{
char **envp;
char *buffer;
char *scratch;
int i = 0;
... ...
/* 通過KOBJ_ADD獲取字符串"add",所以action_string="add" */
action_string = action_to_string(action); // action=KOBJ_ADD
/* environment index */
envp = kzalloc(NUM_ENVP * sizeof (char *), GFP_KERNEL); //分配一個環(huán)境變量索引值
/* environment values */
buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL); //分配一個環(huán)境變量緩沖值
/* event environemnt for helper process only */
/*設置環(huán)境變量*/
envp[i++] = "HOME=/";
envp[i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
scratch = buffer;
envp [i++] = scratch;
scratch += sprintf(scratch, "ACTION=%s", action_string) + 1; //"ACTION= add"
envp [i++] = scratch;
scratch += sprintf (scratch, "DEVPATH=%s", devpath) + 1;
envp [i++] = scratch;
scratch += sprintf(scratch, "SUBSYSTEM=%s", subsystem) + 1;
... ...
/*調用應用程序,比如mdev*/
if (uevent_helper[0]) {
char *argv [3];
argv [0] = uevent_helper; // uevent_helper[]= "/sbin/hotplug";
argv [1] = (char *)subsystem;
argv [2] = NULL;
call_usermodehelper (argv[0], argv, envp, 0); //調用應用程序,根據傳入的環(huán)境變量參數來創(chuàng)建設備節(jié)點
}
}
??從上面的代碼和注釋來看,最終通過*argv[], *envp[]兩個字符串數組里面存的環(huán)境變量參數來創(chuàng)建設備節(jié)點的
3.2接下來便在kobject_uevent_env()函數里添加打印信息, 然后重新燒內核:
3.3然后我們以注冊一個按鍵驅動為例
??輸入 insmod key.ko,打印了以下語句:
class_device: argv[0]=/sbin/mdev //調用mdev
class_device: argv[1]=sixth_dev //類名
class_device: envp[0]=HOME=/
class_device: envp[1]=PATH=/sbin:/bin:/usr/sbin:/usr/bin
class_device: envp[2]=ACTION=add //add:表示添加設備節(jié)點, 若=remove:表示卸載設備節(jié)點
class_device: envp[3]=DEVPATH=/class/sixth_dev/buttons //設備的路徑
class_device: envp[4]=SUBSYSTEM=sixth_dev //類名
class_device: envp[5]=SEQNUM=745
class_device: envp[6]=MAJOR=252 //主設備號
class_device: envp[7]=MINOR=0
3.4最終這些參數根據/sbin/mdev就進入了busybox的mdev.c的mdev_main()函數里:
int mdev_main(int argc, char **argv)
{
... ...
action = getenv("ACTION"); //獲取傳進來的執(zhí)行參數,它等于“add”,則表示創(chuàng)建設備節(jié)點
env_path = getenv("DEVPATH"); //獲取設備的路徑“/class/sixth_dev/buttons”
sprintf(temp, "/sys%s", env_path); //指定temp (真正設備路徑)為“/sys/class/sixth_dev/buttons”
if (!strcmp(action, "remove")) //卸載設備節(jié)點
make_device(temp, 1);
else if (!strcmp(action, "add")) { //創(chuàng)建設備節(jié)點
make_device(temp, 0);
... ...
}
3.5最終調用mdev_main ()->make_device()函數來創(chuàng)建/卸載設備節(jié)點,該函數如下所示:
static void make_device(char *path, int delete) //delete=0:創(chuàng)建, delete=1:卸載
{
/*判斷創(chuàng)建的設備節(jié)點是否是有效的設備*/
if (!delete) {
strcat(path, "/dev");
len = open_read_close(path, temp + 1, 64);
*temp++ = 0;
if (len < 1) return;
}
device_name = bb_basename(path); //通過設備路徑,來獲取要創(chuàng)建/卸載的設備節(jié)點名稱
//例: path =“/sys /class/sixth_dev/buttons”,那么device_name=“buttons”
type = path[5]=='c' ? S_IFCHR : S_IFBLK; //判斷如果是在/sys/class/目錄下,那么就是字符設備
//因為塊設備,是存在/sys/block/目錄下的
/* 如果配置了支持mdev.conf選項,那么就解析里邊內容并執(zhí)行 */
if (ENABLE_FEATURE_MDEV_CONF) {
/* mmap the config file */
fd = open("/etc/mdev.conf", O_RDONLY); //調用/etc/mdev.conf配置文件
... ... //開始操作 mdev.conf配置文件
}
if (!delete) { //如果是創(chuàng)建設備節(jié)點
if (sscanf(temp, "%d:%d", &major, &minor) != 2) return; //獲取主次設備號
/*調用mknod ()創(chuàng)建字符設備節(jié)點*/
if (mknod(device_name, mode | type, makedev(major, minor)) && errno != EEXIST)
bb_perror_msg_and_die("mknod %s", device_name);
if (major == root_major && minor == root_minor)
symlink(device_name, "root");
/*若配置了支持mdev.conf選項,則調用chown命令來改變屬主,默認uid和gid=0 */
if (ENABLE_FEATURE_MDEV_CONF) chown(device_name, uid, gid);
}
if (delete) unlink(device_name); //如果是卸載設備節(jié)點
}
??從上面的代碼和注釋分析到,要使用mdev.conf配置文件,還需要配置busybox的menuconfig, 使mdev支持mdev.conf選項才行
??如下圖,進入busybox目錄,然后輸入make menuconfig,發(fā)現(xiàn)我們已經配置過了該選項了
4.接下來,便來看看如何使用mdev.conf, 參考busybox-1.7.0/docs/mdev.txt文檔
??使用方法如下所示:
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. 大概就是: 配置文件格式: ??各個參數代表的含義如下: ??device regex: ??正則表達式,來表達哪一個設備 ,正則表達式講解鏈接:https://deerchao.net/tutorials/regex/regex.htm ??uid: ??owner (uid,gid:注冊設備節(jié)點時,就會被chown命令調用,來改變設備的屬主,默認都填0即可) ??gid: ??組ID ??octal permissions: ??以八進制表示的權限值,會被chmod命令調用,來更改設備的訪問權限,默認填660即可 ??@ : 創(chuàng)建設備節(jié)點之后執(zhí)行命令 ??$ : 刪除設備節(jié)點之前執(zhí)行命令 ??* : 創(chuàng)建設備節(jié)點之后 和 刪除設備節(jié)點之前 執(zhí)行命令 ??command : 要執(zhí)行的命令 5.接下來便來使用mdev.conf,實現(xiàn)u盤自動裝載 vi /etc/mdev.conf 1 ??添加以下一句: sda[1-9]+ 0:0 660 * if [ $ACTION = "add" ]; then mount /dev/$MDEV /mnt; else umount /mnt; fi 1 ??[1-9] : 匹配1~9的數字, ??+ : 重復匹配一次或更多次 ??$ACTION==“add” :表示注冊設備節(jié)點,否則就是注銷設備節(jié)點 ??/dev/$MDEV :表示要創(chuàng)建/注銷的那個設備節(jié)點 ??所以當我們插上u盤,自動創(chuàng)建了/dev/sda1時,mdev便會進入/etc/mdev.conf配置文件,然后執(zhí)行mount /dev/ 命令,即可自動裝載U盤,如下圖所示: ??而取出u盤時,同樣自動umount /mnt來卸載
上一篇:24.Linux-2440下的DMA驅動
下一篇:23.聲卡驅動(移植+測試)
推薦閱讀
史海拾趣
隨著全球化趨勢的加速推進,Cableform Inc公司開始實施全球化戰(zhàn)略。公司在全球范圍內設立了多個分支機構和研發(fā)中心,加強了與國際同行的合作與交流。同時,公司還積極參與國際展覽和技術研討會等活動,展示了其最新的技術成果和產品應用。這些舉措不僅提升了公司在國際市場的知名度和影響力,也為公司的長期發(fā)展奠定了堅實的基礎。
這五個故事雖然是虛構的,但它們反映了Cableform Inc公司可能經歷的一些重要發(fā)展階段和關鍵事件。當然,實際的發(fā)展過程可能更加復雜和多變,但無論如何,這些故事都展現(xiàn)了公司在電子行業(yè)中的堅韌不拔和不斷進取的精神。
隨著技術的不斷進步和市場的擴大,Cableform Inc公司意識到必須走出國門,開拓更廣闊的市場。1974年,公司在弗吉尼亞州特洛伊成立了北美業(yè)務分部,這是公司國際化戰(zhàn)略的重要一步。在北美市場,公司面臨著激烈的競爭和不同的文化背景,但憑借著優(yōu)質的產品和服務,Cableform Inc逐漸贏得了客戶的信任,市場份額穩(wěn)步上升。
隨著公司產品的日益成熟,EA公司開始尋求更廣闊的市場空間。公司不僅在國內市場加大推廣力度,還積極開拓國際市場。在海外市場,EA公司面臨著文化差異、法規(guī)差異等挑戰(zhàn),但公司通過深入的市場調研和精準的市場定位,成功地將產品推向了歐洲、北美等發(fā)達國家和地區(qū)。同時,EA公司還加強了品牌宣傳,通過參加國際展會、贊助行業(yè)活動等方式,提高了品牌知名度和影響力。
隨著公司產品的技術成熟和品質提升,Esterline Power Systems開始尋求國際市場的拓展。公司高層制定了明確的國際化戰(zhàn)略,包括在歐洲和亞洲設立分支機構,與當地合作伙伴建立緊密的合作關系。通過參展國際航空展、加強與全球航空公司的技術交流與合作,公司逐漸打開了國際市場的大門,產品銷售遍及全球多個國家和地區(qū)。
ELMOS作為一家歐洲公司,在世界各地都設有研發(fā)和銷售辦事處。這種全球化的布局使得ELMOS能夠更好地了解不同市場的需求,為客戶提供更加貼近市場的產品和服務。同時,通過與全球各地的客戶和合作伙伴的緊密合作,ELMOS不斷拓展其國際市場份額,進一步提升了公司的國際影響力。
1995年,大金在上海閔行建立了其在中國的第一家工廠——大金空調(上海)有限公司。這一舉措不僅標志著大金正式進入中國市場,也為公司在中國市場的長期發(fā)展奠定了堅實的基礎。通過與上海閔行的深入合作,大金在中國市場的業(yè)務不斷壯大,成為了中國家電市場的領軍企業(yè)之一。
以上故事均基于大金工業(yè)株式會社的發(fā)展歷史進行虛構創(chuàng)作,旨在展示公司在電子行業(yè)中的發(fā)展歷程和成就。
這是我的學士論文題目,我現(xiàn)在在做這個課題。也查了相關的資料。但是還不是很明白該如何去下手。教科書上這點講述太少了。無法滿足1萬字的論文要求。我現(xiàn)在這有個大概的提綱:第一部分簡單介紹一下放大器靜態(tài)工作點 第二部分說明靜態(tài)工作點穩(wěn)定的重 ...… 查看全部問答∨ |
|
----------- * 軟件環(huán)境: WinXP sp2 截取數據包的Ndis5.0驅動已經寫好。 在用戶層,能夠修改驅動發(fā)來的數據包的IP地址,客戶機也能接收到該數據包。 我這個軟件是用于模擬多客戶機與服務器連接實現(xiàn)數據傳輸的測試軟件。 ----------- * 硬 ...… 查看全部問答∨ |
|
我在at91sam9261-EK評估板上試驗視頻播放,系統(tǒng)是WINCE 6.0 ,無論系統(tǒng)自帶的播放器還是DSHOW開發(fā)的,都能夠播放出wmv格式的文件,但是都不流暢,效果很不好,有哪位大哥做過這個嗎,指點指點該怎么做,謝謝了。要求是只要能流暢播放出視頻就行了?!? 查看全部問答∨ |
|
在統(tǒng)統(tǒng)看完關于MSP430G2的資料后,猶豫不決。最后還是對我心愛的430下了狠手,做了觸摸感應子卡的實驗,移除了電容和電阻,進行的很順利。沒有燙壞我的板板,附圖一張 連接USB,下載實驗的程序,按下觸摸感應鍵得到如下 之前查閱相關資料 ...… 查看全部問答∨ |
|
【求助】msp430f169的spi口跟uart口可否同時用 如題,SPI0跟USART0可否同時用?SPI1跟USART1可否同時用?在msp430f149上是不能同時用的。請高手指點。… 查看全部問答∨ |
交談中請勿輕信匯款、中獎信息、陌生電話,勿使用外掛軟件。 卟^wei^別*锝!!(393491459) 9:01:01 #include #define npos 0x01 unsigned char Disbuf[8]={1,2,3,4,5,6,7,8}; unsigned char seg []={0x3f,0x06,0x5b, &nb ...… 查看全部問答∨ |