版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、設(shè)備驅(qū)動程序第三章 Linux文件系統(tǒng)與設(shè)備文件系統(tǒng) 目錄Linux文件操作 Linux文件系統(tǒng) devfs設(shè)備文件系統(tǒng) udev設(shè)備文件系統(tǒng) 目錄Linux文件操作 Linux文件系統(tǒng) devfs設(shè)備文件系統(tǒng) udev設(shè)備文件系統(tǒng) 文件操作的相關(guān)系統(tǒng)調(diào)用創(chuàng)立參數(shù)mode指定新建文件的存取權(quán)限,它同umask一起決定文件的最終權(quán)限翻開Open函數(shù)有兩個形式,其中pathname是我們要翻開的文件名,flags可以是下表的一個值或者是幾個值的組合如果文件翻開成功,open函數(shù)會返回一個文件描述符,以后對該文件的所有操作就可以通過對這個文件描述符進行操作來實現(xiàn)文件操作的相關(guān)系統(tǒng)調(diào)用O_RDONL、
2、YO_WRONY、O_RDWR這三個標志只能使用任意的一個如果使用了O_CREATE標志,那么使用的函數(shù)是后者。這個時候我們還要指定mode標志,用來表示文件的訪問權(quán)限。Mode可以是下表的值的組合文件操作的相關(guān)系統(tǒng)調(diào)用除了可以通過上述宏進行或邏輯產(chǎn)生標志以外,我們也可以自己用數(shù)字來表示,Linux總共用5個數(shù)字來表示文件的各種權(quán)限:第一位表示設(shè)置用戶ID,第二位表示設(shè)置組ID,第三位表示用戶自己的權(quán)限位,第四位表示組的權(quán)限,第五位表示其他人的權(quán)限。每個數(shù)字可以取1執(zhí)行權(quán)限、2寫權(quán)限、4讀權(quán)限、0無或者是這些值的和。文件操作的相關(guān)系統(tǒng)調(diào)用讀寫函數(shù)Write實現(xiàn)將把length個字節(jié)從buf指向
3、的緩沖區(qū)寫文件描述符fd所指向的文件中,返回值為實際寫入的字節(jié)數(shù)。函數(shù)read實現(xiàn)從文件描述符fd所指定的文件中讀取length個字節(jié)到buf指向的緩沖區(qū)中,返回值為實際讀取的字節(jié)數(shù)。以O(shè)_CREAT為標志的open函數(shù)實際上實現(xiàn)了文件創(chuàng)立的功能,因此,下面的函數(shù)等同creat函數(shù)。文件操作的相關(guān)系統(tǒng)調(diào)用定位該函數(shù)將文件讀寫指針相對whence移動offset個字節(jié)。操作成功時,返回文件指針相對于文件頭的位置。關(guān)閉Fd是要關(guān)閉的文件描述符C庫函數(shù)的文件操作C庫函數(shù)的文件操作是獨立于具體的操作系統(tǒng)平臺的,不管是在DOS、Windows、Linux還是在VxWorks中都是這些函數(shù)。創(chuàng)立和翻開讀寫
4、關(guān)閉目錄Linux文件操作 Linux文件系統(tǒng) devfs設(shè)備文件系統(tǒng) udev設(shè)備文件系統(tǒng) Linux文件系統(tǒng)目錄結(jié)構(gòu)目錄內(nèi)容/頂層根目錄。其它目錄都在這個根目錄下 /bin基本命令可執(zhí)行文件的存放位置 /sbin系統(tǒng)管理類命令可執(zhí)行文件的存放位置 /devdev 是設(shè)備(device)的英文縮寫。這是個十分重要的目錄。它包含了所有Linux系統(tǒng)中使用的外部設(shè)備文件。要注意的是這里的設(shè)備文件不是指設(shè)備的驅(qū)動程序,而是指訪問外部設(shè)備的接口文件。 /usr用戶應用程序和文檔目錄 /etc這個目錄下存放系統(tǒng)的配置文件。 /liblib是庫(library)英文縮寫。這個目錄用于存放系統(tǒng)動態(tài)鏈接庫。
5、所有動態(tài)鏈接程序都要用到這個目錄下的庫文件。 /proc這是Linux的一個特殊文件系統(tǒng),主要用于存放內(nèi)核及進程信息 /tmp臨時文件目錄,許多程序都需要用到此目錄進行讀寫操作 /var系統(tǒng)日志和一些服務程序臨時文件的存放目錄Linux文件系統(tǒng)與設(shè)備驅(qū)動 Linux文件系統(tǒng)與設(shè)備驅(qū)動應用程序和VFS之間的接口是系統(tǒng)調(diào)用,而VFS與磁盤文件系統(tǒng)以及普通設(shè)備之間的接口是file_operations結(jié)構(gòu)體成員函數(shù)。由于字符設(shè)備的上層沒有磁盤文件系統(tǒng),所以字符設(shè)備的file_operations成員函數(shù)就直接由設(shè)備驅(qū)動提供了, file_operations正是字符設(shè)備驅(qū)動的核心。Linux文件系統(tǒng)
6、與設(shè)備驅(qū)動File結(jié)構(gòu)體文件結(jié)構(gòu)代表一個翻開的文件,系統(tǒng)中每個翻開的文件在內(nèi)核空間都有一個關(guān)聯(lián)的struct file。它由內(nèi)核在翻開文件時創(chuàng)立,并傳遞給在文件上進行操作的任何函數(shù)。在文件的所有實例都關(guān)閉后,內(nèi)核釋放這個數(shù)據(jù)結(jié)構(gòu)。Inode結(jié)構(gòu)體VFS inode包含文件訪問權(quán)限、屬主、組、大小、生成時間、訪問時間、最后修改時間等信息。從一個inode中獲得主設(shè)備號和次設(shè)備號:Linux文件系統(tǒng)與設(shè)備驅(qū)動同一類設(shè)備使用相同的主設(shè)備號,使用的驅(qū)動相同。次設(shè)備號用于區(qū)分具體的設(shè)備。查看/dev目錄可以獲知系統(tǒng)中包含的設(shè)備文件。 mknod /dev/global_chardev c 254 0 查
7、看/proc/devices可以獲知系統(tǒng)中注冊的設(shè)備,第1列為主設(shè)備號,第2列為設(shè)備名。目錄Linux文件操作 Linux文件系統(tǒng) devfs設(shè)備文件系統(tǒng) udev設(shè)備文件系統(tǒng) 傳統(tǒng)方式int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);major是為設(shè)備驅(qū)動程序向系統(tǒng)申請的主設(shè)備號。某些主設(shè)備號已經(jīng)靜態(tài)地指派給了大局部常見設(shè)備。在內(nèi)核源代碼樹的Documentation/device.txt文件中可以找到這些設(shè)備的列表。由于許多編號已經(jīng)分配了,為新設(shè)備選擇一個唯一的編號
8、是很困難的,如果為0那么系統(tǒng)為此設(shè)備動態(tài)地分配一個主設(shè)備號。name是設(shè)備名(將出現(xiàn)在/proc/devices),和/dev/下的設(shè)備名要一致。返回值: 此函數(shù)返回0表示成功。返回-EINVAL表示申請的主設(shè)備號非法,一般來說是主設(shè)備號大于系統(tǒng)所允許的最大設(shè)備號。返回 -EBUSY表示所申請的主設(shè)備號正在被其它設(shè)備驅(qū)動程序使用。如果是動態(tài)分配主設(shè)備號成功,此函數(shù)將返回所分配的主設(shè)備號。傳統(tǒng)方式如果 register_chrdev操作成功,設(shè)備名就會出現(xiàn)在/proc/devices文件里。在成功地向系統(tǒng)注冊了設(shè)備驅(qū)動程序后(調(diào)用register_chrdev() 成功后),就可以用mknod命
9、令來把設(shè)備映射為一個特別文件,其它程序使用這個設(shè)備的時候,只要對此特別文件進行操作就行了。動態(tài)分配的缺點是:由于分配給你的主設(shè)備號不能保證總是一樣的,因而你無法用mknod命令事先創(chuàng)立設(shè)備節(jié)點即設(shè)備文件 ,如何解決?unregister_chrdev(unsigned int major, const char *name);傳統(tǒng)方式如果開發(fā)人員不打算將設(shè)備驅(qū)動程序與外界共享,那么什么號碼都可以,只要它與當前內(nèi)核使用的其它主設(shè)備號都不沖突即可。然而,這樣的解決方案通常只是在驅(qū)動程序不會被其它人使用的情況下可行。如果開發(fā)人員想讓驅(qū)動程序與外界共享大多數(shù) Linux 開發(fā)人員常常采用這一方法,那么
10、僅僅從“真空中抽一個主設(shè)備號或者使用動態(tài)的主設(shè)備號分配就不行了。相反,開發(fā)人員必須聯(lián)系 Linux 內(nèi)核開發(fā)人員,這樣這個設(shè)備才能分配一個“正式主設(shè)備號。 傳統(tǒng)方式不幸的是,這種方法有很多可伸縮性問題。不僅設(shè)備驅(qū)動程序開發(fā)人員聯(lián)系內(nèi)核開發(fā)人員來獲取正式主設(shè)備號是一件討厭的事,內(nèi)核開發(fā)人員弄清他們怎樣分配所有這些主設(shè)備號甚至更加惱人。這種任務在很多方面很象系統(tǒng)管理員跟蹤公司局域網(wǎng)靜態(tài) IP 地址分配的工作 這并不十分有趣。正如系統(tǒng)管理員可以利用 DHCP 來緩解這種管理負擔,如果設(shè)備注冊有某種類似的方法就好了。另一方面,典型的 Linux 系統(tǒng)以一種不太理想而且麻煩的方式管理這些特殊的設(shè)備文件。
11、 如今,Linux 支持很多不同種類的硬件。這意味著嚴格意義上我們中絕大多數(shù)在 /dev 中都有數(shù)百個特殊文件來表示所有這些設(shè)備。還不止這樣,這些特殊文件中大多數(shù)甚至不會映射到系統(tǒng)中存在的設(shè)備上但需要它們存在,只是考慮到我們最終會在系統(tǒng)中添加新的硬件驅(qū)動器,這讓事情變得更令人困惑。從這個方面來看,我們就知道 /dev 需要徹底檢修 。Devfs設(shè)備文件系統(tǒng)Devfs,也叫設(shè)備文件系統(tǒng)Device Filesystem,設(shè)計它的唯一目的就是提供一個新的更理性的方式管理通常位于 /dev 的所有塊設(shè)備和字符設(shè)備。 使用Devfs需要在內(nèi)核添加對的 devfs 支持 。配置內(nèi)核。devfs 文件系統(tǒng)
12、是安裝在 /dev 中,/dev 包含了 devfs 名稱空間的表達。使用 devfs,可以只要查看 /dev 就知道系統(tǒng)上有什么設(shè)備。 Devfs設(shè)備文件系統(tǒng)驅(qū)動程序調(diào)用下面的函數(shù)來進行設(shè)備文件的創(chuàng)立和刪除工作:Devfs設(shè)備文件系統(tǒng)devfs_register 函數(shù)說明:功能:向系統(tǒng)注冊設(shè)備。dir :新創(chuàng)立的設(shè)備文件的父目錄,一般設(shè)為NULL, 表示父目錄為/dev。如果需要創(chuàng)立一個自己的目錄,那么驅(qū)動程序應該調(diào)用devfs_mk_dir。Name :設(shè)備名稱。Flags :Devfs標志的位掩碼。如果指定為DEVFS_FL_AUTO_DEVNUM,自動為設(shè)備分配設(shè)備號。那么主次設(shè)備號就
13、不再有用了,可以都為0。Major: 主設(shè)備號。Minor: 次設(shè)備號。 Mode :設(shè)備的訪問模式,和文件的訪問模式類似。Ops :設(shè)備的文件操作數(shù)據(jù)結(jié)構(gòu)指針。Info :filp-private_data的默認值,一般設(shè)為NULL。用devfs_register注冊的設(shè)備會自動創(chuàng)立/dev/下的設(shè)備文件,而用register_chrdev注冊的設(shè)備那么需要用戶手工mknod創(chuàng)立設(shè)備文件。Devfs設(shè)備文件系統(tǒng)Devfs_mk_dir函數(shù)說明:功能:在/dev下創(chuàng)立新的設(shè)備目錄 Dir:值為NULLName:設(shè)備目錄名Info:值為NULLDevfs設(shè)備文件系統(tǒng)舉例: devfs_gpf_d
14、ir = devfs_mk_dir(NULL, gpf, NULL); devfs_gpf_raw = devfs_register(devfs_gpf_dir, key, DEVFS_FL_AUTO_DEVNUM, 0, 0, S_IFCHR | S_IRUSR | S_IWUSR, &s3c2410_fops, NULL);分析: 這樣就會在/dev下建立一個/gpf/key的設(shè)備文件,相當于手動創(chuàng)立 mknod 文件路徑 c 主設(shè)備號 從設(shè)備號目錄Linux文件操作 Linux文件系統(tǒng) devfs設(shè)備文件系統(tǒng) udev設(shè)備文件系統(tǒng) Udev與Devfs的區(qū)別在Linux2.6內(nèi)核中,ud
15、ev取代了devfs,原因如下:Devfs所做的工作被確信可以在用戶態(tài)完成一些bug相當長的時間內(nèi)未被修復Devfs的維護者和作者停止了對代碼的維護工作Udev完全在用戶態(tài)工作,利用設(shè)備參加或移除時內(nèi)核所發(fā)送的熱插拔事件來工作。由于udev根據(jù)系統(tǒng)中硬件設(shè)備的狀態(tài)動態(tài)更新設(shè)備文件,進行設(shè)備文件的創(chuàng)立和刪除等,因此,在使用udev后,/dev目錄下就會只包含系統(tǒng)中真正存在的設(shè)備。Devfs與udev的另一個顯著區(qū)別在于:采用devfs,當一個并不存在的/dev節(jié)點被翻開的時候,devfs能自動加載對應的驅(qū)動,而udev那么不能。Sysfs文件系統(tǒng)與Linux設(shè)備模型Sysfs文件系統(tǒng)Linux2
16、.6引入了sysfs文件系統(tǒng),它是一個虛擬的文件系統(tǒng),它可以產(chǎn)生一個包括所有系統(tǒng)硬件的層級視圖,與提供進程和狀態(tài)信息的proc文件系統(tǒng)十分類似。Sysfs把連接在系統(tǒng)上的設(shè)備和總線組織成為一個分級的文件,它們可以由用戶空間存取,向用戶空間導出內(nèi)核數(shù)據(jù)結(jié)構(gòu)及它們的樹型。Sysfs的一個目的就是展示設(shè)備驅(qū)動模型中各組件的層次關(guān)系。 Sysfs文件系統(tǒng)與Linux設(shè)備模型Kobject內(nèi)核對象kobject是Linux2.6引入的設(shè)備管理機制,在內(nèi)核中由kobject結(jié)構(gòu)體表示,這個數(shù)據(jù)結(jié)構(gòu)使所有設(shè)備在底層都具有統(tǒng)一的接口。每個在內(nèi)核中注冊的kobject對象都對應于sysfs文件系統(tǒng)中的一個目錄。
17、Void kobject_init(struct kobject *kobj)Int kobject_set_name(struct kobject *kobj,const char*format,)Struct kobject *kobject_get(struct kobject *kobj)Void kobject_put(struct kobject *kobj)Int kobject_register(struct kobject *kobj)Void kobject_del(sturct kobject *kobj)Void kobject_unregister(struct ko
18、bject *kobj)Sysfs文件系統(tǒng)與Linux設(shè)備模型Kset內(nèi)核對象Kobject通常通過kset組織成層次化的結(jié)構(gòu),kset是具有相同類型的kobject的集合,在內(nèi)核中用kset數(shù)據(jù)結(jié)構(gòu)表示。包含在kset中的所有kobject被組織成一個雙向循環(huán)鏈表。Sysfs文件系統(tǒng)與Linux設(shè)備模型Subsystem內(nèi)核對象子系統(tǒng)Subsystem是一系列kset的集合,它描述系統(tǒng)中某一類設(shè)備子系統(tǒng)。Linux設(shè)備模型組件系統(tǒng)中的任一是設(shè)備在設(shè)備模型中都有一個deivce對象描述。屬性在bus、device、driver和class層次上都分別定義了其屬性結(jié)構(gòu)體,包括bus_attribute、driver_attribute、class_attribute、class_device_attributeUdev的組成Udev的設(shè)計目標:在用戶空間中執(zhí)行動態(tài)建立/刪除設(shè)備文件允許每個都不用關(guān)心主/次設(shè)備號提供LSB標準名稱如果需要,可提供固定的名稱Udev的組成Udev的工作過程當內(nèi)存檢測到在系統(tǒng)中出現(xiàn)了新設(shè)備后,內(nèi)核會在sysfs文件系統(tǒng)中為該
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 咖啡行業(yè)業(yè)務員招聘合同
- 城市排水施工合同
- 影視制作公司水電管理暫行辦法
- 煙草行業(yè)銷售:天價煙管理辦法
- 思政教師招聘合同模板
- 鋁合金門窗簡易工程施工合同
- 攝影棚租賃合同模板
- 2025版國有企業(yè)股權(quán)轉(zhuǎn)讓與項目合作合同范本2篇
- 2025年度安全技術(shù)咨詢與解決方案合同范本3篇
- 2024年生物質(zhì)生物質(zhì)顆粒燃料購銷及售后服務保障合同3篇
- 煙花采購協(xié)議書
- 統(tǒng)編版語文一年級上冊 j q x y 和 ü 的專項練習(無答案)
- 高考作文模擬寫作:“善言”與“敢言”+導寫及范文
- 城市軌道交通工程質(zhì)量安全控制要點
- 國開大學2023年01月22588《管理線性規(guī)劃入門》期末考試參考答案
- 公司廉潔從業(yè)反腐倡廉教育培訓課件(也適用新員工培訓)
- 公務車輛安全檢查表
- 《城市軌道交通車輛空調(diào)檢修》課程標準
- 裝飾快速成交銷售技巧
- 農(nóng)田輸配電工程施工方案
- 喇榮課誦集(早課部分)
評論
0/150
提交評論