日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年07月21日(星期一)

2021年07月21日 | 25.Linux-實現(xiàn)U盤自動掛載

發(fā)布者:素心輕語 來源: eefocus關鍵字:Linux  U盤  自動掛載 手機看文章 掃描二維碼
隨時隨地手機看文章

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來卸載

關鍵字:Linux  U盤  自動掛載 引用地址:25.Linux-實現(xiàn)U盤自動掛載

上一篇:24.Linux-2440下的DMA驅動
下一篇:23.聲卡驅動(移植+測試)

推薦閱讀

王傳福:要做開放, 首先要做到觀念上的開放。?“供應鏈體系”是整個汽車行業(yè)運轉的最重要支撐之一。任何一輛車,都不是由車企自己造出來的,在每個車企背后,都有龐大的供應鏈體系作為支持。?而從汽車行業(yè)之外沖進來的王傳福,卻堅持“垂直整合”的思路,把比亞迪打造成了行業(yè)內一個獨特的存在——自己研發(fā)生產零部件,然后組裝成整車,當然,也包括自...
對于美的、格力、碧桂園、哇哈哈、富士康等行業(yè)龍頭而言,在其自身的存量市場難以突破的情況下,紛紛進攻機器人增量市場,以尋求快速突進。 這些行業(yè)龍頭的跨界有著異曲同工之妙,一方面為了推動自身傳統(tǒng)業(yè)務的提效增速,為行業(yè)升級而跨界;另一方面都是在開拓自身的多元化業(yè)務,為搶占新的發(fā)展高地而跨界。 從應用機器人到制造機器人 “飲料巨頭”...
負責提供安全數字化體驗的智能邊緣平臺阿卡邁技術公司(Akamai Technologies, Inc.,以下簡稱:Akamai)(NASDAQ:AKAM)發(fā)布的一份最新報告指出,在2018年1月到2019年12月間,整個媒體行業(yè)共遭受了170億次撞庫攻擊。這份名為《Akamai 2020年互聯(lián)網狀況/媒體行業(yè)中的撞庫攻擊》(Akamai 2020 State of the Internet / Credential Stuffing in...
本篇詳細的記錄了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外設讀取EEPROM數據(以AT24C02為例)。1. 準備工作硬件準備開發(fā)板首先需要準備一個開發(fā)板,這里我準備的是STM32L4的開發(fā)板(BearPi):EEPROM小熊派開發(fā)板左邊的接口是E53接口,用來連接E53接口的擴展板,每個擴展板都板載了一塊EEPROM用來保存信息,如圖:AT24C02的原理圖如下(該原理圖...

史海拾趣

問答坊 | AI 解惑

急求 放大器靜態(tài)工作點穩(wěn)定問題的研究

這是我的學士論文題目,我現(xiàn)在在做這個課題。也查了相關的資料。但是還不是很明白該如何去下手。教科書上這點講述太少了。無法滿足1萬字的論文要求。我現(xiàn)在這有個大概的提綱:第一部分簡單介紹一下放大器靜態(tài)工作點 第二部分說明靜態(tài)工作點穩(wěn)定的重 ...…

查看全部問答∨

ADC0809

用ADC0809 采集電壓 程序怎么寫都有問題 誰能提供一共一個完整的參考程序 順便問問 它的時鐘可以用函數發(fā)生器提供500khz嗎 假如用外部提供 程序怎么寫呢…

查看全部問答∨

無線模塊選型指南 433mhz 2.4G

歡迎下載。很詳細。應用文檔。有部分代碼。…

查看全部問答∨

偽IP如何實現(xiàn)與客戶機TCP通信

----------- * 軟件環(huán)境: WinXP sp2 截取數據包的Ndis5.0驅動已經寫好。 在用戶層,能夠修改驅動發(fā)來的數據包的IP地址,客戶機也能接收到該數據包。 我這個軟件是用于模擬多客戶機與服務器連接實現(xiàn)數據傳輸的測試軟件。 ----------- * 硬 ...…

查看全部問答∨

求助,WINCE視頻播放

我在at91sam9261-EK評估板上試驗視頻播放,系統(tǒng)是WINCE 6.0 ,無論系統(tǒng)自帶的播放器還是DSHOW開發(fā)的,都能夠播放出wmv格式的文件,但是都不流暢,效果很不好,有哪位大哥做過這個嗎,指點指點該怎么做,謝謝了。要求是只要能流暢播放出視頻就行了?!?

查看全部問答∨

quartusII詳細使用指南---pdf

quartusII詳細使用指南。 pdf版強力推薦…

查看全部問答∨

MSP430G2開發(fā)板觸摸感應子卡學習心得

在統(tǒng)統(tǒng)看完關于MSP430G2的資料后,猶豫不決。最后還是對我心愛的430下了狠手,做了觸摸感應子卡的實驗,移除了電容和電阻,進行的很順利。沒有燙壞我的板板,附圖一張 連接USB,下載實驗的程序,按下觸摸感應鍵得到如下   之前查閱相關資料 ...…

查看全部問答∨

請幫忙看看我的問題,謝謝

錯誤是這樣提示的 undefined                        first referenced symbol                 ...…

查看全部問答∨

【求助】msp430f169的spi口跟uart口可否同時用

如題,SPI0跟USART0可否同時用?SPI1跟USART1可否同時用?在msp430f149上是不能同時用的。請高手指點。…

查看全部問答∨

求幫忙 430f149 流動顯示

交談中請勿輕信匯款、中獎信息、陌生電話,勿使用外掛軟件。 卟^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 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統(tǒng)推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved