国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

sysfs 文件系統(tǒng)linux2.6內(nèi)核引入sysfs文件系統(tǒng),sysfs可以看成與proc,devfs和devpty同類別的文件系統(tǒng),該文件系統(tǒng)是虛擬的文件系統(tǒng),可以更方便對系統(tǒng)設(shè)備進(jìn)行管理。它可以產(chǎn)生一個包含所有系統(tǒng)硬件層次視圖,與提供進(jìn)程和狀態(tài)信息的proc文件系統(tǒng)十分類似。sysfs把連接在系統(tǒng)上的設(shè)備和總線組織成為一個分級的文件,它們可以由用戶空間存取,向用戶空間導(dǎo)出內(nèi)核的數(shù)據(jù)結(jié)構(gòu)以及它們的屬性。sysfs的一個目的就是展示設(shè)備驅(qū)動模型中各組件的層次關(guān)系,其頂級目錄包括block,bus,drivers,class,power和firmware等.

它把實際連接到系統(tǒng)上的設(shè)備和總線組織成一個分級的文件,用戶空間的程序同樣可以利用這些信息以實現(xiàn)和內(nèi)核的交互,該文件系統(tǒng)是當(dāng)前系統(tǒng)上實際設(shè)備樹的一個直觀反應(yīng),它是通過kobject子系統(tǒng)來建立這個信息的,當(dāng)一個kobject被創(chuàng)建的時候,對應(yīng)的文件和目錄也就被創(chuàng)建了,位于 /sys下的相關(guān)目錄下,既然每個設(shè)備在sysfs中都有唯一對應(yīng)的目錄,那么也就可以被用戶空間讀寫了。你可能根本沒有去關(guān)心過sysfs文件系統(tǒng)的掛載過程,它是這樣被掛載的。mount -t sysfs sysfs /sys

sysfs是一個特殊文件系統(tǒng),并沒有一個實際存放文件的介質(zhì)。sysfs的信息來源是kobject層次結(jié)構(gòu),讀一個sysfs文件,就是動態(tài)的從kobject結(jié)構(gòu)提取信息,生成文件。重啟后里面的信息當(dāng)然就沒了


sysfs文件系統(tǒng)與kobject結(jié)構(gòu)緊密關(guān)聯(lián),每個在內(nèi)核中注冊的kobject對象都對應(yīng)于sysfs文件系統(tǒng)中的一個目錄。Kobject 是Linux 2.6引入的新的設(shè)備管理機(jī)制,在內(nèi)核中由struct kobject表示。通過這個數(shù)據(jù)結(jié)構(gòu)使所有設(shè)備在底層都具有統(tǒng)一的接口,kobject提供基本的對象管理,是構(gòu)成Linux2.6設(shè)備模型的核心結(jié)構(gòu),Kobject是組成設(shè)備模型的基本結(jié)構(gòu)。類似于C++中的基類,它嵌入于更大的對象的對象中,用來描述設(shè)備模型的組件。如bus,devices, drivers 等。都是通過kobject連接起來了,形成了一個樹狀結(jié)構(gòu)。這個樹狀結(jié)構(gòu)就與/sys向?qū)?yīng)。


sysfs就是利用VFS的接口去讀寫kobject的層次結(jié)構(gòu),建立起來的文件系統(tǒng)。 kobject的層次結(jié)構(gòu)的注冊與注銷XX_register()形成的。文件系統(tǒng)是個很模糊廣泛的概念, linux把所有的資源都看成是文件,讓用戶通過一個統(tǒng)一的文件系統(tǒng)操作界面,也就是同一組系統(tǒng)調(diào)用,對屬于不同文件系統(tǒng)的文件進(jìn)行操作。這樣,就可以對用戶程序隱藏各種不同文件系統(tǒng)的實現(xiàn)細(xì)節(jié),為用戶程序提供了一個統(tǒng)一的,抽象的,虛擬的文件系統(tǒng)界面,這就是所謂"VFS(Virtual Filesystem Switch)"。這個抽象出來的接口就是一組函數(shù)操作。


我們要實現(xiàn)一種文件系統(tǒng)就是要實現(xiàn)VFS所定義的一系列接口,file_operations, dentry_operations, inode_operations等,供上層調(diào)用。file_operations是描述對每個具體文件的操作方法(如:讀,寫),dentry_operations結(jié)構(gòu)體指明了VFS所有目錄的操作方法, 而inode_operations提供所有結(jié)點(diǎn)的操作方法。

舉個例子,我們寫C程序,open(“hello.c”, O_RDONLY),它通過系統(tǒng)調(diào)用的流程是這樣的

open() -> 系統(tǒng)調(diào)用-> sys_open() -> filp_open()-> dentry_open() -> file_operations->open()         

不同的文件系統(tǒng),調(diào)用不同的file_operations->open(),在sysfs下就是sysfs_open_file()。


我們使用不同的文件系統(tǒng),就是將它們各自的文件信息都抽象到dentry和inode中去。這樣對于高層來說,我們就可以不關(guān)心底層的實現(xiàn),我們使用的都是一系列標(biāo)準(zhǔn)的函數(shù)調(diào)用。這就是VFS的精髓,實際上就是面向?qū)ο蟆?p>

注意sysfs是典型的特殊文件。它存儲的信息都是由系統(tǒng)動態(tài)的生成的,它動態(tài)的包含了整個機(jī)器的硬件資源情況。從sysfs讀寫就相當(dāng)于向 kobject層次結(jié)構(gòu)提取數(shù)據(jù)。


Linux內(nèi)核驅(qū)動的的platform機(jī)制

虛擬總線platform簡介


 從Linux 2.6起引入了一套新的驅(qū)動管理和注冊機(jī)制:platform_device和platform_driver。Linux中大部分的設(shè)備驅(qū)動,都可以使用這套機(jī)制,設(shè)備用platform_device表示,驅(qū)動用platform_driver進(jìn)行注冊。


 Linux platform. driver機(jī)制和傳統(tǒng)的device driver 機(jī)制(通過driver_register函數(shù)進(jìn)行注冊)相比,一個十分明顯的優(yōu)勢在于platform機(jī)制將設(shè)備本身的資源注冊進(jìn)內(nèi)核,由內(nèi)核統(tǒng)一管理,在驅(qū)動程序中使用這些資源時通過platform. device提供的標(biāo)準(zhǔn)接口進(jìn)行申請并使用。這樣提高了驅(qū)動和資源管理的獨(dú)立性,并且擁有較好的可移植性和安全性(這些標(biāo)準(zhǔn)接口是安全的)。platform機(jī)制的本身使用并不復(fù)雜,由兩部分組成:platform_device和platfrom_driver。通過platform機(jī)制開發(fā)底層設(shè)備驅(qū)動的大致流程如圖所示。

platform_device簡介


linux發(fā)明的platform虛擬總線,相應(yīng)的設(shè)備叫做

platform_device,相應(yīng)的驅(qū)動叫做

platfrom_driver。


    platform_device結(jié)構(gòu)體描述設(shè)備的名稱、資源信息等。該結(jié)構(gòu)被定include/linux/platform_device.h中,     定義的結(jié)構(gòu)體原型如下:


        struct platform_device {


               const char * name;    //定義平臺設(shè)備的名稱


               int id;


               struct device dev;


               u32 num_resources;


               struct resource * resource; //定義平臺設(shè)備的資源。


        };


    最重要的一個成員struct resource * resource。struct resource被定義在include/linux/ioport.h中,定義原型如下:


       struct resource {


               resource_size_t start;  //定義資源的起始地址


               resource_size_t end;  //定義資源的結(jié)束地址


               const char *name;    //定義資源的名稱


               unsigned long flags; //定義資源的類型,比如MEM,IO,IRQ,DMA類型


               struct resource *parent, *sibling, *child;  //資源鏈表指針


        };


    以RTC驅(qū)動為例(為什么用RTC,RTC是一個標(biāo)準(zhǔn)的plartform device,機(jī)制是相同的,但是相對比較簡單)

    在arch/arm/mach-sep4020/devices.c中加入rtc的plartform_device結(jié)構(gòu)體和resources結(jié)構(gòu)體:

        static struct resource sep4020_rtc_resource[] = {

              [0] = { .start = RTC_BASE_V,

                      .end   = RTC_BASE_V+ 0x2f,

                      .flags = IORESOURCE_MEM,

                    }

              [1] = {

                      .start = INTSRC_RTC,

                      .end   = INTSRC_RTC,

                      .flags = IORESOURCE_IRQ,

                    }

        }; 

        struct platform_device sep4020_device_rtc = {

              .name            = "sep4020_rtc",

              .id              = -1,

              .num_resources   = ARRAY_SIZE(sep4020_rtc_resource),

             .resource        = sep4020_rtc_resource,

        };   

    然后再通過4020.c文件中的__initdata設(shè)備數(shù)組將這個plartform_device結(jié)構(gòu)體注冊進(jìn)去了: 

        static struct platform_device *devices[] __initdata = {

               &serial_device,

             &sep4020_device_rtc,

               &epson_ohci_device,

               &sep4020_device_usbgadget

        };  

    platform_add_devices(devices, ARRAY_SIZE(devices)); 通過調(diào)用platform_add_devices()向系統(tǒng)中添加該設(shè)備了,該函數(shù)內(nèi)部調(diào)用platform_device_register( )進(jìn)行設(shè)備注冊。要注意的是,這里的platform_device設(shè)備的注冊過程必須在相應(yīng)設(shè)備驅(qū)動加載之前被調(diào)用,即執(zhí)行platform_driver_register()之前,原因是驅(qū)動注冊時需要匹配內(nèi)核中所有已注冊的設(shè)備名。(后面會詳細(xì)介紹device和driver之間是如何通過注冊的名字進(jìn)行連接的)

                                                           platform_driver簡介


   platform_driver結(jié)構(gòu)體的原型定義,在include/linux/platform_device.h中,代碼如下:


         struct platform_driver {

             int (*probe)(struct platform_device *);

             int (*remove)(struct platform_device *);

             void (*shutdown)(struct platform_device *);

             int (*suspend)(struct platform_device *, pm_message_t state);

             int (*suspend_late)(struct platform_device *, pm_message_t state);

             int (*resume_early)(struct platform_device *);

             int (*resume)(struct platform_device *);

             struct device_driver driver;

         };

   內(nèi)核提供的platform_driver結(jié)構(gòu)體的注冊函數(shù)為platform_driver_register(),

   其原型定義在driver/base/platform.c文件中,具體實現(xiàn)代碼如下:

         int platform_driver_register(struct platform_driver *drv)

         {

             drv->driver.bus = &platform_bus_type;

             if (drv->probe)  

                 drv->driver.probe = platform_drv_probe;

             if (drv->remove)

                 drv->driver.remove = platform_drv_remove;

             if (drv->shutdown)

                 drv->driver.shutdown = platform_drv_shutdown;

             if (drv->suspend)

                 drv->driver.suspend = platform_drv_suspend;

             if (drv->resume)

                 drv->driver.resume = platform_drv_resume;

             return driver_register(&drv->driver);

         }

    總結(jié),通常情況下只要和內(nèi)核本身運(yùn)行依賴性不大的外圍設(shè)備,相對獨(dú)立的,擁有各自獨(dú)自的資源(地址總線和IRQs),都可以用platform_driver實現(xiàn)。如:LCD,網(wǎng)卡、USB、UART等,都可以用platfrom_driver寫,而timer,irq等小系統(tǒng)之內(nèi)的設(shè)備則最好不用platfrom_driver機(jī)制。


關(guān)鍵字:sysfs  platform總線  linux2  6內(nèi)核  文件系統(tǒng) 引用地址:sysfs platform總線

上一篇:為你破解ARM中斷寄存器
下一篇:platform驅(qū)動模型編程總結(jié)(基于mini2440平臺的LED驅(qū)動)

推薦閱讀

隨著科學(xué)技術(shù)的飛速發(fā)展,越來越多的新思維、新技術(shù)開始切切實實地影響著我們的生活。耳機(jī)領(lǐng)域也隨著近幾年技術(shù)的更新?lián)Q代開始了一場龐大的革命即無線藍(lán)牙耳機(jī)取代有線耳機(jī)。相信大家雖然可能正在使用無線藍(lán)牙耳機(jī)但是卻對這個領(lǐng)域知之甚少,今天我就來簡單談?wù)勔恍┡笥逊答伣o我比較多的問題。??在聊藍(lán)牙耳機(jī)的類型、佩戴方式、以及名詞“聽診器效應(yīng)”之...
大眾作為老牌的燃油汽車生廠商,近日動作不斷,而其動機(jī)也非常明顯,那就是要革了燃油汽車的命。 德國汽車巨頭大眾汽車(Volkswagen)周五表示,隨著全球汽車制造商修訂電氣化計劃,大眾計劃到 2024 年投入 600 億歐元(約合 4660 億人民幣),進(jìn)行電動,混合動力和互聯(lián)汽車的轉(zhuǎn)型??偼顿Y額比先前宣布的投資額增加了 160 億歐元。 大眾汽車在其...
11月18日上午消息,隨著第一批采用自研芯片M1(Apple Silicon)的電腦開售,蘋果公司三名高管Greg Joswiak(蘋果全球營銷高級副總裁),Craig Federighi(蘋果公司軟件工程高級副總裁),Johny Srouji(蘋果芯片研發(fā)主管)等與媒體進(jìn)行了交流,以提供有關(guān)這顆蘋果自研芯片的更多細(xì)節(jié),他們詳細(xì)介紹了蘋果公司如何在構(gòu)建產(chǎn)品之初就軟硬合一公共開發(fā)的工...
恩智浦結(jié)合汽車網(wǎng)絡(luò)、網(wǎng)關(guān)和i.MX 8系列處理器,實現(xiàn)車輛的增強(qiáng)型服務(wù)、便捷性以及無線升級恩智浦半導(dǎo)體(NXP Semiconductors N.V.,納斯達(dá)克股票代碼:NXPI)日前宣布與福特汽車公司開展合作,為福特全球車隊(包括2021款F-150皮卡、Mustang Mach-E和Bronco越野車)增進(jìn)駕駛體驗、便捷性和服務(wù)。福特全新全聯(lián)網(wǎng)車輛架構(gòu)配合恩智浦車載網(wǎng)絡(luò)處理器和i.MX...

史海拾趣

小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

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