




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Linux操作系統(tǒng)分析中國科學(xué)技術(shù)大學(xué)計(jì)算機(jī)系陳香蘭051287161312Autumn 2021管理I/O設(shè)備I/O體系結(jié)構(gòu)總線:PC的CPU、RAM、I/O設(shè)備之間需要某些數(shù)據(jù)通路來保證信息的流動(dòng)總類:ISA、 EISA、 VESA、PCI以及MCA等等三種根本類型數(shù)據(jù)總線pentium,64位地址總線pentium,32位控制總線當(dāng)總線用于CPU與I/O設(shè)備之間的連接時(shí),成為I/O總線6/29/20223統(tǒng)一編址典型arm 和 獨(dú)立編址典型PC在x86處理器中,只使用了32位地址總線中的16位對(duì)I/O設(shè)備進(jìn)行尋址尋址范圍?使用64位數(shù)據(jù)總線中的8、16、32位傳送數(shù)據(jù)I/O設(shè)備與CPU之
2、間的連接層次為:CPUI/O端口I/O接口設(shè)備控制器6/29/20224PC的I/O體系結(jié)構(gòu)6/29/20225I/O端口I/O port每個(gè)I/O端口8位,由于只使用16位地址總線訪問,因此I/O地址空間一共提供65536個(gè)I/O端口在端口地址對(duì)齊的情況下,連續(xù)的I/O端口可以看成16位/32位端口特定的指令用來訪問I/O端口:in,ins,out,outsI/O端口的另外一種訪問方法直接映射到物理地址空間可以使用存儲(chǔ)器操作指令,如mov,and,or等等6/29/20226I/O端口中的存放器命令狀態(tài)輸入數(shù)據(jù)輸出數(shù)據(jù)6/29/20227Linux中訪問I/O端口的操作inb、inw、inl
3、inb_p、inw_p、inl_poutb、outw、outloutb_p、outw_p、outl_pinsb、insw、insloutsb、outsw、outsl參見io_32.h的最后幾個(gè)宏和宏擴(kuò)展6/29/20228I/O端口的分配不同的設(shè)備使用各自不同的端口內(nèi)核使用資源信息來記錄端口分配信息在這里,一個(gè)資源表示I/O端口地址的一個(gè)范圍所有同種資源使用樹形結(jié)構(gòu)記錄,ioport_resource。一個(gè)較大范圍可以進(jìn)一步劃分為子范圍,使用兄弟鏈表來表示一個(gè)資源表示I/O端口地址的一個(gè)范圍6/29/20229為什么使用樹型結(jié)構(gòu)以IDE硬盤接口為例來說明IDE硬盤接口的端口地址:0 xf000
4、0 xf00fIDE鏈的主盤使用0 xf0000 xf007的子范圍從盤使用0 xf0080 xf00f的子范圍這樣,一個(gè)父結(jié)點(diǎn)+2個(gè)子節(jié)點(diǎn)父節(jié)點(diǎn)的范圍能夠覆蓋所有子節(jié)點(diǎn)的范圍6/29/202210I/O端口資源樹ioport_resource的根節(jié)點(diǎn)跨越了整個(gè)I/O地址空間0655656/29/202211相關(guān)的操作任何設(shè)備驅(qū)動(dòng)程序都可以使用以下三個(gè)函數(shù)來進(jìn)行資源的請(qǐng)求和釋放request_resource、allocate_resource、release_resource6/29/2022126/29/2022136/29/2022146/29/2022156/29/2022166/29
5、/202217I/O接口I/O接口是處于一組I/O端口和對(duì)應(yīng)的設(shè)備控制器之間的一種硬件電路I/O端口設(shè)備:將I/O端口中的值轉(zhuǎn)換成設(shè)備所需要的命令和數(shù)據(jù)設(shè)備I/O端口:檢測(cè)設(shè)備狀態(tài)的變化,更新端口中相應(yīng)的狀態(tài)存放器連接到PIC上,代表設(shè)備發(fā)出中斷請(qǐng)求專用I/O接口和通用I/O接口6/29/202218專用I/O接口專用于一個(gè)特定的硬件設(shè)備在一些情況下,設(shè)備控制器與這種I/O接口處于同一塊卡中可以是內(nèi)部設(shè)備PC機(jī)箱內(nèi)部,也可以是外部設(shè)備鍵盤接口,連接到鍵盤控制器上圖形接口,和圖形卡中的控制器封裝在一起磁盤接口,連接到磁盤控制器總線鼠標(biāo)接口,連接到鼠標(biāo)控制器網(wǎng)絡(luò)接口,與網(wǎng)卡中的控制器封裝在一起6/
6、29/202219通用I/O接口現(xiàn)代PC都包含連接很多外部設(shè)備的幾個(gè)通用I/O接口并口:傳輸單位1個(gè)字節(jié)串口:逐位傳送,內(nèi)部包含一個(gè)UART通用異步收發(fā)器,字節(jié)位序列PCMCIA接口SCSI接口:把PC主總線連接到次總線SCSI總線的電路USB口通用總線接口可以代替上述并口、串口、SCSI接口6/29/202220設(shè)備控制器復(fù)雜的設(shè)備需要一個(gè)設(shè)備控制器device controller來驅(qū)動(dòng)2個(gè)重要作用對(duì)I/O接口接收到的高級(jí)命令進(jìn)行解釋,并通過向設(shè)備發(fā)送適當(dāng)?shù)碾娦盘?hào)來控制設(shè)備執(zhí)行特定的操作對(duì)從設(shè)備接收到的電信號(hào)進(jìn)行解釋和轉(zhuǎn)換,并修改狀態(tài)存放器典型的設(shè)備控制器,例如磁盤控制器有些簡(jiǎn)單的設(shè)備沒有
7、設(shè)備控制器PICPIT6/29/202221I/O共享存儲(chǔ)器很多硬件設(shè)備都有自己的存儲(chǔ)器,通常稱之為I/O共享存儲(chǔ)器I/O Shared Memory,如顯存映射I/O共享存儲(chǔ)器的地址根據(jù)設(shè)備和總線類型的不同,可以在三個(gè)不同的物理地址范圍之間進(jìn)行映射對(duì)于連接到ISA總線上的大多數(shù)設(shè)備0 xa00000 xfffff640KB1MB對(duì)于使用VESA局部總線的一些老設(shè)備圖形卡0 xe000000 xffffff現(xiàn)在根本不生產(chǎn)6/29/202222對(duì)于連接到PCI總線的設(shè)備映射到RAM物理地址4GB的頂端關(guān)于圖形加速端口AGPAccelerated Graphics Port標(biāo)準(zhǔn)是高性能圖形卡的PC
8、I增強(qiáng)版不僅有I/O共享存儲(chǔ)器,還能通過圖形地址再映射表GARTGraphics Address Remapping Table直接對(duì)主板的RAM局部進(jìn)行尋址具有更高的數(shù)據(jù)傳輸速率6/29/202223I/O共享存儲(chǔ)器的訪問對(duì)于物理地址1M之內(nèi)的I/O共享存儲(chǔ)器訪問直接訪問3G以上的對(duì)應(yīng)線性區(qū)間addr+3G對(duì)于高端I/O共享存儲(chǔ)器訪問沒有直接映射在3G以上的線性區(qū)間需要為其創(chuàng)立一塊非連續(xù)線性區(qū),并將其映射到高端I/O共享存儲(chǔ)器的物理地址上ioremap/iounmap,類似vmallocioremap_nocacheio_mem=ioremap(某個(gè)物理起始地址,長(zhǎng)度訪問io_mem+相對(duì)于
9、起始地址的偏移處6/29/202224訪問I/O共享存儲(chǔ)器的一些體系結(jié)構(gòu)相關(guān)的接口readb、readw、readlwriteb、writew、writelmemcpy_fromio、memcpy_toiomemset_io例如訪問0 xfc000000I/O單元io_mem=ioremap(0 xfb000000,0 x2000000)t2=readb(io_mem+0 x1000000)6/29/2022256/29/2022266/29/2022276/29/202228DMA直接存儲(chǔ)器訪問,Direct Memory Access所有的PC都包含一個(gè)DMACDMA控制器一種輔助處理器用
10、來控制在RAM和I/O設(shè)備之間傳送數(shù)據(jù)設(shè)置并激活DMACDMAC自行傳送數(shù)據(jù)數(shù)據(jù)傳送結(jié)束后,DMAC發(fā)出一個(gè)中斷請(qǐng)求當(dāng)CPU和DMAC并發(fā)訪問同一個(gè)存儲(chǔ)單元時(shí),通過存儲(chǔ)器仲裁器解決沖突使用者:慢速設(shè)備如,磁盤驅(qū)動(dòng)器ULK3上還有關(guān)于DMA的更多的內(nèi)容6/29/202229設(shè)備驅(qū)動(dòng)程序模型現(xiàn)在,硬件設(shè)備往往具有相似的功能,例如電源管理即插即用熱插拔Linux2.6試圖為硬件設(shè)備的驅(qū)動(dòng)程序開發(fā)者提供一種統(tǒng)一的模型設(shè)備驅(qū)動(dòng)程序模型SysfsKobject,kset,subsystem6/29/202230kobject是驅(qū)動(dòng)程序模型中的一個(gè)核心數(shù)據(jù)結(jié)構(gòu),與sysfs文件系統(tǒng)自然的邦定在一起:每個(gè)ko
11、bject對(duì)應(yīng)sysfs文件系統(tǒng)中的一個(gè)目錄kobject往往被嵌入到設(shè)備驅(qū)動(dòng)程序模型中的組件中,如總線、設(shè)備和驅(qū)動(dòng)程序的描述符Kobject的作用是,為所屬“容器提供引用計(jì)數(shù)器維持容器的層次列表或組為容器的屬性提供一種用戶態(tài)查看的視圖6/29/202231指向包含有容器名稱的字符串6/29/202232Kset是同類型kobject結(jié)構(gòu)的一個(gè)集合體,通過kset數(shù)據(jù)結(jié)構(gòu)可將kobjects組織成一棵層次樹6/29/202233設(shè)備驅(qū)動(dòng)程序模型的組件設(shè)備:device_type對(duì)象;device對(duì)象驅(qū)動(dòng)程序:device_driver對(duì)象總線:bus_type;bus_register();類
12、:class6/29/202234設(shè)備文件Unix類操作系統(tǒng)都是基于文件概念的文件是以字符序列而構(gòu)成的信息載體,因此一個(gè)I/O設(shè)備也可以當(dāng)作文件來處理與普通文件交互的系統(tǒng)調(diào)用也可以直接用于I/O設(shè)備例如對(duì)/dev/lp0設(shè)備文件的write()可以將數(shù)據(jù)發(fā)往打印機(jī)6/29/202235設(shè)備文件的分類根據(jù)設(shè)備驅(qū)動(dòng)程序的根本特性,設(shè)備文件可以分為:字符設(shè)備塊設(shè)備塊設(shè)備數(shù)據(jù)可以被隨機(jī)訪問在用戶看來,訪問任何位置的數(shù)據(jù)時(shí)間大致相同典型例子:硬盤、軟盤、CD-ROM、DVD播放器等6/29/202236字符設(shè)備要么不可以隨機(jī)訪問,例如聲卡如果可被隨機(jī)訪問往往通過順序訪問方式實(shí)現(xiàn),但隨著數(shù)據(jù)的位置的不同,
13、其訪問時(shí)間會(huì)相差很大,例如磁帶網(wǎng)絡(luò)網(wǎng)卡不與文件相關(guān)聯(lián),使用專門的處理方式6/29/202237老式的設(shè)備文件在Linux2.4中存在兩種設(shè)備文件老式的設(shè)備文件Devfs設(shè)備文件老式的設(shè)備文件這是存放在文件系統(tǒng)中的實(shí)際文件索引節(jié)點(diǎn)不對(duì)磁盤上的數(shù)據(jù)塊編址,而是包含硬件設(shè)備的一個(gè)標(biāo)識(shí)每個(gè)設(shè)備文件包括:名字類型字符/塊設(shè)備號(hào)主設(shè)備號(hào):次設(shè)備號(hào)同一設(shè)備驅(qū)動(dòng)程序不同設(shè)備設(shè)備標(biāo)識(shí)符6/29/202238mknod()系統(tǒng)調(diào)用用來創(chuàng)立老式的設(shè)備文件設(shè)備文件名操作權(quán)限和設(shè)備類型其中設(shè)備類型指定:S_IFCHR或S_IFBLK設(shè)備號(hào)16位,主設(shè)備號(hào):次設(shè)備號(hào)6/29/202239設(shè)備文件通常包含在/dev目錄中一
14、些設(shè)備文件的例子6/29/202240注意:字符設(shè)備與塊設(shè)備具有獨(dú)立的編號(hào),例如,塊設(shè)備(3,0)不同于字符設(shè)備(3,0)設(shè)備文件通??梢员硎疽粋€(gè)硬件設(shè)備,例如磁盤/dev/hda或硬件設(shè)備的某一物理或邏輯分區(qū),例如磁盤分區(qū)/dev/hda2或一個(gè)虛擬的邏輯設(shè)備不會(huì)與任何硬件設(shè)備相關(guān)聯(lián),例如/dev/null代表一個(gè)“黑洞6/29/202241對(duì)內(nèi)核而言,一個(gè)設(shè)備文件的名字是無關(guān)緊要的,關(guān)鍵在于設(shè)備文件的類型及其主次設(shè)備號(hào)如,建立一個(gè)設(shè)備文件/tmp/disk,其類型為塊設(shè)備,設(shè)備號(hào)為3,0,那么內(nèi)核認(rèn)為它與/dev/hda等價(jià)6/29/202242設(shè)備文件的用戶態(tài)處理使用主次設(shè)備號(hào)標(biāo)識(shí)設(shè)備存
15、在局限性8位長(zhǎng)的主次設(shè)備號(hào)不夠用在/dev中的大多數(shù)設(shè)備是不存在的設(shè)備文件僅僅被分配一次,具體參見documentation/devices.txt文件,該文件存放了官方注冊(cè)的已分配設(shè)備號(hào)和/dev設(shè)備節(jié)點(diǎn)include/linux/major.h也包含了一些主設(shè)備號(hào)對(duì)應(yīng)的宏一般的Linux系統(tǒng)夠用了,但不適用于大規(guī)模系統(tǒng)、高端系統(tǒng)6/29/202243Linux2.6增加了設(shè)備號(hào)的編碼大小32位主設(shè)備號(hào)的編碼為12位次設(shè)備號(hào)的編碼為20位能兼容老式的設(shè)備號(hào)官方注冊(cè)表不能靜態(tài)的分配附加的可用設(shè)備號(hào)6/29/202244動(dòng)態(tài)分配設(shè)備號(hào)驅(qū)動(dòng)程序指定設(shè)備號(hào)的分配范圍,而不是一個(gè)精確的值。由內(nèi)核分配一
16、個(gè)適宜的設(shè)備號(hào)范圍給驅(qū)動(dòng)程序設(shè)備驅(qū)動(dòng)程序可以不再需要從官方注冊(cè)表中分配一個(gè)設(shè)備號(hào)而使用當(dāng)前系統(tǒng)中空閑的設(shè)備號(hào)問題:沒有永久性需要一個(gè)標(biāo)準(zhǔn)的方法將驅(qū)動(dòng)程序使用的設(shè)備號(hào)輸出到用戶態(tài)應(yīng)用程序中即設(shè)備驅(qū)動(dòng)程序模型中:把主次設(shè)備號(hào)存放在/sys/class目錄下的dev屬性中6/29/202245動(dòng)態(tài)的創(chuàng)立設(shè)備文件Linux可以動(dòng)態(tài)的創(chuàng)立設(shè)備文件udev用戶態(tài)工具集系統(tǒng)啟動(dòng)時(shí),/dev目錄下是空的udev程序掃描/sys/class目錄來尋找dev文件,根據(jù)這里的信息在/dev目錄下建立必要的設(shè)備文件并根據(jù)配置文件為其分配一個(gè)文件名,并創(chuàng)立一個(gè)符號(hào)鏈接這樣,/dev目錄下只有內(nèi)核所支持的所有設(shè)備的設(shè)備文
17、件,而沒有任何其他文件6/29/202246設(shè)備文件的VFS處理進(jìn)程訪問普通文件時(shí),通過文件系統(tǒng)訪問磁盤分區(qū)中的數(shù)據(jù)塊當(dāng)進(jìn)程訪問設(shè)備文件時(shí),卻可以驅(qū)動(dòng)硬件設(shè)備例如,進(jìn)程訪問計(jì)算機(jī)上的溫度計(jì)對(duì)應(yīng)的設(shè)備文件獲得溫度HOW?VFS6/29/202247VFSVFS在設(shè)備文件翻開時(shí)使用與設(shè)備相關(guān)的函數(shù)調(diào)用替換其缺省的文件操作這些設(shè)備相關(guān)函數(shù)調(diào)用對(duì)硬件設(shè)備進(jìn)行操作過程:在解析路徑名后,將建立索引節(jié)點(diǎn)對(duì)象、目錄項(xiàng)對(duì)象和文件對(duì)象假設(shè)發(fā)現(xiàn)是一個(gè)設(shè)備文件,那么調(diào)用init_special_inode來進(jìn)行6/29/2022486/29/2022496/29/202250 6/29/202251設(shè)備驅(qū)動(dòng)程序這是一
18、個(gè)軟件層,使得硬件設(shè)備能夠響應(yīng)預(yù)定義好的編程接口,就是一組控制設(shè)備的VFS函數(shù)接口open,read,lseek,ioctl等上述函數(shù)的具體實(shí)現(xiàn)由設(shè)備驅(qū)動(dòng)程序提供此外設(shè)備驅(qū)動(dòng)程序必須首先注冊(cè)并初始化自己并在進(jìn)行數(shù)據(jù)傳送的時(shí)候監(jiān)控I/O操作6/29/202252注冊(cè)設(shè)備驅(qū)動(dòng)程序注冊(cè)一個(gè)設(shè)備驅(qū)動(dòng)程序意味著分配一個(gè)新的device_driver描述符,將其插入到設(shè)備驅(qū)動(dòng)程序模型的數(shù)據(jù)結(jié)構(gòu)中,并把它與對(duì)應(yīng)的設(shè)備文件連接起來使得對(duì)設(shè)備文件發(fā)出的系統(tǒng)調(diào)用可以由內(nèi)核轉(zhuǎn)化為相應(yīng)的設(shè)備驅(qū)動(dòng)程序?qū)?yīng)的函數(shù)訪問一個(gè)沒有注冊(cè)設(shè)備驅(qū)動(dòng)程序的設(shè)備文件將會(huì)返回錯(cuò)誤碼-ENODEV6/29/202253注冊(cè)時(shí)機(jī)如果設(shè)備驅(qū)動(dòng)程
19、序被靜態(tài)編譯進(jìn)內(nèi)核,那么注冊(cè)發(fā)生在內(nèi)核初始化階段如果作為一個(gè)內(nèi)核模塊來編譯,那么在裝入模塊的時(shí)候注冊(cè)并在卸載模塊時(shí)注銷在這種情況下,當(dāng)模塊卸載時(shí),驅(qū)動(dòng)程序要注銷自己char_device_struct chrdevs數(shù)組register_chrdev/unregister_chrdevregister_chrdev_region/alloc_chrdev_region/unregister_chrdev_region +cdev_add register_blkdev /unregister_blkdev各總線設(shè)備,總線驅(qū)動(dòng)會(huì)提供相關(guān)接口字符設(shè)備塊設(shè)備6/29/202254例如對(duì)于一個(gè)通用的P
20、CI設(shè)備設(shè)備驅(qū)動(dòng)程序分配一個(gè)pci_driver類型的描述符調(diào)用pci_register_driver()6/29/2022556/29/202256設(shè)備驅(qū)動(dòng)程序的初始化對(duì)設(shè)備驅(qū)動(dòng)程序進(jìn)行注冊(cè)與初始化是兩件不同的事情注冊(cè)應(yīng)當(dāng)盡早:使得用戶可以使用設(shè)備文件初始化應(yīng)當(dāng)推遲到最后可能的時(shí)候原因:初始化就意味著需要分配系統(tǒng)中的稀缺資源,例如:1,中斷向量動(dòng)態(tài)分配的情況下2,用于DMA傳送的緩沖區(qū)的頁框3,包括DMA通道本身6/29/202257為了確保資源在需要時(shí)能夠獲得,在獲得后不再被請(qǐng)求,設(shè)備驅(qū)動(dòng)程序通常使用引用計(jì)數(shù)器Open,+release,-在open時(shí),假設(shè)+前為0,那么驅(qū)動(dòng)程序必須分配資
21、源并激活硬件設(shè)備上的中斷和DMA在release時(shí),假設(shè)-后為0,那么禁止中斷和DMA并釋放所分配的資源6/29/202258監(jiān)控I/O操作I/O操作的持續(xù)時(shí)間通常不可預(yù)知,可能與各種因素相關(guān),例如機(jī)械裝置的狀態(tài),如對(duì)于磁盤來講,磁頭的當(dāng)前位置或?qū)嶋H的隨機(jī)事件,例如數(shù)據(jù)包何時(shí)到達(dá)網(wǎng)卡以及人為因素,例如人對(duì)鍵盤、鼠標(biāo)的使用,以及發(fā)現(xiàn)打印機(jī)卡紙時(shí)的操作為此,設(shè)備驅(qū)動(dòng)程序必須通過某種監(jiān)控手段監(jiān)控I/O操作終止或超時(shí)6/29/202259兩種可用的技術(shù)輪詢模式polling modeCPU重復(fù)檢查輪詢?cè)O(shè)備的狀態(tài)存放器,直到存放器的值說明I/O操作已經(jīng)完成為止中斷模式interrupt mode如果I/
22、O控制器能夠通過IRQ線發(fā)出I/O操作結(jié)束的信號(hào),就可以使用中斷模式6/29/202260輪詢模式的簡(jiǎn)單例子Why -count也可以使用jiffies進(jìn)行超時(shí)判斷假設(shè)時(shí)間比較長(zhǎng),比方ms級(jí),可以在每次輪詢操作之后調(diào)用schedule主動(dòng)放棄CPU,直到下次被調(diào)度再次輪詢可以用來粗略的判斷超時(shí)6/29/202261中斷模式的簡(jiǎn)單例子假定實(shí)現(xiàn)一個(gè)簡(jiǎn)單的輸入字符設(shè)備的驅(qū)動(dòng)程序當(dāng)在對(duì)應(yīng)的設(shè)備文件上發(fā)出read()系統(tǒng)調(diào)用時(shí),一條輸入命令被發(fā)往設(shè)備的控制存放器在一個(gè)不可預(yù)知的長(zhǎng)時(shí)間后,設(shè)備把一個(gè)字節(jié)的數(shù)據(jù)放在輸入存放器驅(qū)動(dòng)程序然后將這個(gè)字節(jié)作為read()系統(tǒng)調(diào)用的結(jié)果返回6/29/202262這個(gè)驅(qū)
23、動(dòng)程序包含兩個(gè)函數(shù):實(shí)現(xiàn)文件對(duì)象read方法的foo_read()函數(shù)處理中斷的foo_interrupt()函數(shù)只要用戶讀設(shè)備文件,foo_read()函數(shù)就會(huì)被觸發(fā)對(duì)I/O設(shè)備發(fā)出讀命令等待讀操作的結(jié)束,由中斷處理程序喚醒將獲得的數(shù)據(jù)送到用戶空間中6/29/202263從設(shè)備上讀入數(shù)據(jù)喚醒read的剩余局部6/29/202264再看foo_read的輸入?yún)?shù)Struct file*filp,在這個(gè)數(shù)據(jù)的私有數(shù)據(jù)項(xiàng)中,VFS已經(jīng)將其轉(zhuǎn)換成設(shè)備驅(qū)動(dòng)程序的私有的信息foo_dev_t, 被定義為包含如下信息:一個(gè)信號(hào)量,互斥使用intr作為標(biāo)志0:沒有發(fā)生/處理中斷1:處理了中斷一個(gè)等待隊(duì)列,用
24、來給foo_read睡眠一個(gè)數(shù)據(jù)區(qū),長(zhǎng)度為1,用來存放讀到的數(shù)據(jù)6/29/202265char* buf,用戶提供的存放數(shù)據(jù)的空間Count和ppos都沒有用到再看看foo_interrupt()中,這是通過foo一個(gè)全局變量獲得設(shè)備的私有數(shù)據(jù)結(jié)構(gòu)的,這個(gè)數(shù)據(jù)結(jié)構(gòu)與foo_read()中通過filp中獲得的私有數(shù)據(jù)一致foo_interrupt的輸入?yún)?shù)沒有得到使用,這是一種很普遍的情況6/29/202266內(nèi)核支持的級(jí)別Linux內(nèi)核并不完全支持所有可能存在的I/O設(shè)備一般來說,事實(shí)上有三種可能的方式支持硬件設(shè)備根本不支持應(yīng)用程序使用使用適當(dāng)?shù)膇n/out指令直接與設(shè)備的I/O端口進(jìn)行交互與
25、內(nèi)核設(shè)備驅(qū)動(dòng)程序毫無關(guān)系最常見于X Window系統(tǒng)對(duì)圖形顯示的傳統(tǒng)處理方式6/29/202267最小支持內(nèi)核不識(shí)別硬件設(shè)備,但能識(shí)別它的I/O接口。用戶程序把I/O接口視為能夠讀寫字符流的順序設(shè)備用來處理連接到通用I/O接口上的外部硬件設(shè)備使用設(shè)備文件和設(shè)備驅(qū)動(dòng)例如并口、串口擴(kuò)展支持內(nèi)核識(shí)別硬件設(shè)備,并處理I/O接口本身。內(nèi)核必須為每個(gè)這樣的設(shè)備提供一個(gè)設(shè)備驅(qū)動(dòng)程序除了串口、并口之外的其他通用I/O接口上連接的外部設(shè)備都需要擴(kuò)展支持6/29/202268字符設(shè)備驅(qū)動(dòng)程序處理字符設(shè)備驅(qū)動(dòng)程序相比照較容易不需要復(fù)雜的緩沖策略,也不涉及磁盤高速緩存不同的字符設(shè)備的需求也是不同的有的有復(fù)雜的通信協(xié)議
26、有的只需要簡(jiǎn)單得I/O端口讀寫塊設(shè)備驅(qū)動(dòng)程序要比字符設(shè)備驅(qū)動(dòng)程序復(fù)雜的多6/29/202269字符設(shè)備驅(qū)動(dòng)程序的數(shù)據(jù)結(jié)構(gòu)和相關(guān)接口cdev_alloc()分配一個(gè)cdev描述符6/29/202270cdev_add()在設(shè)備驅(qū)動(dòng)程序模型中注冊(cè)一個(gè)cdev描述符6/29/202271分配設(shè)備號(hào)為了記錄目前已經(jīng)分配了哪些字符設(shè)備號(hào),內(nèi)核使用散列表chrdevs表的大小不超過設(shè)備號(hào)的范圍兩個(gè)不同的設(shè)備號(hào)范圍可能共享一個(gè)主設(shè)備號(hào)。由于設(shè)備號(hào)范圍不重疊,因此次設(shè)備號(hào)應(yīng)該完全不同chrdevs包含255個(gè)表項(xiàng)6/29/202272Hash函數(shù)分配設(shè)備號(hào):新設(shè)備驅(qū)動(dòng)采用這種方法alloc_chrdev_re
27、gionregister_chrdev_region+cdev_add6/29/2022736/29/2022746/29/202275分配一個(gè)固定的設(shè)備號(hào):老式的直接register_chrdev無需再cdev_add關(guān)于字符設(shè)備驅(qū)動(dòng)程序的訪問,在前面講過了6/29/202276塊設(shè)備驅(qū)動(dòng)程序典型的塊設(shè)備驅(qū)動(dòng)程序都有很高的平均訪問時(shí)間例如磁盤的每次操作都需要幾個(gè)ms,主要是為了定位磁頭,一旦定位后,就可以以穩(wěn)定的高速率傳輸數(shù)據(jù)幾十MB/秒定義:相鄰的數(shù)據(jù)指當(dāng)數(shù)據(jù)以相鄰的方式存放在磁外表時(shí),一次單獨(dú)操作就可以訪問它們6/29/202277內(nèi)核對(duì)塊設(shè)備處理程序的支持具有以下特點(diǎn):通過VFS提供統(tǒng)
28、一接口對(duì)磁盤數(shù)據(jù)進(jìn)行有效的預(yù)讀為數(shù)據(jù)提供磁盤高速緩存6/29/202278塊設(shè)備的處理一個(gè)塊設(shè)備操作所涉及的內(nèi)核組件6/29/202279在塊設(shè)備處理所涉及的多個(gè)內(nèi)核組件中,每個(gè)組件采用不同的長(zhǎng)度來管理磁盤數(shù)據(jù)扇區(qū):硬盤塊設(shè)備控制器按照扇區(qū)的大小來傳遞數(shù)據(jù)。按Linux慣例,大小為512個(gè)字節(jié)。有的設(shè)備可以有更大的扇區(qū)大小,由設(shè)備驅(qū)動(dòng)程序進(jìn)行轉(zhuǎn)換塊:文件的邏輯存儲(chǔ)單位。Linux要求必須是2的冪,但不能超過一個(gè)頁框的大小。在80 x86中,可以是512、1024、2048和4096字節(jié)段:一個(gè)內(nèi)存頁或者內(nèi)存頁的一局部,包含磁盤上物理相鄰的數(shù)據(jù)塊頁:磁盤高速緩存作用于一個(gè)頁,每個(gè)頁正好裝在一個(gè)物
29、理頁框中6/29/2022806/29/202281通用塊層通用塊層是一個(gè)內(nèi)核組件,處理來自系統(tǒng)中的所有塊設(shè)備發(fā)出的請(qǐng)求該層的存在,使得內(nèi)核可以將數(shù)據(jù)緩沖區(qū)放在高端內(nèi)存通過一些附加的手段,實(shí)現(xiàn)“零-復(fù)制管理邏輯卷:幾個(gè)磁盤分區(qū),即使位于不同的塊設(shè)備中,也可以被看作是一個(gè)單一的分區(qū)發(fā)揮大局部新磁盤控制器的高級(jí)特性通用塊層的核心數(shù)據(jù)結(jié)構(gòu)是bio描述符,用來描述塊設(shè)備的I/O操作6/29/202282磁盤是一個(gè)由通用塊層處理的邏輯塊設(shè)備通常一個(gè)磁盤對(duì)應(yīng)于一個(gè)硬件塊設(shè)備,例如硬盤、軟盤或光盤磁盤也可以是一個(gè)虛擬設(shè)備,可以建立在幾個(gè)物理磁盤分區(qū)上或者一些RAM專用頁中的內(nèi)存區(qū)上磁盤是由gendisk對(duì)象
30、描述的6/29/202283通常磁盤被劃分成幾個(gè)邏輯分區(qū)。每個(gè)塊設(shè)備文件要么代表整個(gè)磁盤,要么代表磁盤中的某一個(gè)邏輯分區(qū)例如一個(gè)主設(shè)備號(hào)3,次設(shè)備號(hào)0的設(shè)備文件/dev/had代表的可能是一個(gè)主的IDE磁盤,而/dev/hda1和/dev/hda2那么代表該磁盤上的前2個(gè)分區(qū),它們的主設(shè)備號(hào)都是3,而次設(shè)備號(hào)那么是1和2一般磁盤中的分區(qū)是通過連續(xù)的次設(shè)備號(hào)來區(qū)分的磁盤的分區(qū)表保存在hd_struct結(jié)構(gòu)的數(shù)組中6/29/2022846/29/202285磁盤的分區(qū)表保存在hd_struct結(jié)構(gòu)的數(shù)組中6/29/202286當(dāng)內(nèi)核發(fā)現(xiàn)一個(gè)新的磁盤時(shí)啟動(dòng)階段,或者可移動(dòng)介質(zhì)插入一個(gè)驅(qū)動(dòng)器中,或者在
31、運(yùn)行期間附加一個(gè)外置式磁盤時(shí)調(diào)用alloc_disk,分配并初始化一個(gè)新的gendisk對(duì)象假設(shè)新磁盤被劃分為假設(shè)干個(gè)分區(qū),那么還會(huì)分配并初始化hd_struct類型的數(shù)組然后調(diào)用add_disk將新磁盤插入到通用塊層的數(shù)據(jù)結(jié)構(gòu)中6/29/202287提交請(qǐng)求:當(dāng)向通用塊層提交一個(gè)I/O請(qǐng)求時(shí):首先調(diào)用bio_alloc分配一個(gè)bio描述符,然后進(jìn)行初始化然后調(diào)用generic_make_request,這是通用塊層的主要入口點(diǎn)6/29/202288I/O調(diào)度程序塊設(shè)備請(qǐng)求及其優(yōu)化雖然塊設(shè)備驅(qū)動(dòng)程序可以一次傳送一個(gè)單獨(dú)的數(shù)據(jù)塊,但是內(nèi)核并不會(huì)為每個(gè)要訪問的數(shù)據(jù)塊都執(zhí)行一次I/O操作內(nèi)核試圖把幾
32、個(gè)塊合并在一起,作為一個(gè)整體來處理,從而減少磁頭的平均移動(dòng)時(shí)間HOW?6/29/202289為讀寫一個(gè)磁盤塊的請(qǐng)求生成塊設(shè)備請(qǐng)求但推遲這個(gè)請(qǐng)求執(zhí)行的時(shí)間這是提高塊設(shè)備性能的關(guān)鍵機(jī)制當(dāng)請(qǐng)求發(fā)生時(shí),內(nèi)核檢查是否能通過稍微擴(kuò)展前一個(gè)一直處于等待狀態(tài)的請(qǐng)求而滿足新的請(qǐng)求,從而減少定位的時(shí)間,提高效率6/29/202290每個(gè)塊設(shè)備驅(qū)動(dòng)程序都維護(hù)著自己的請(qǐng)求隊(duì)列;每個(gè)物理塊設(shè)備應(yīng)當(dāng)有一個(gè)請(qǐng)求隊(duì)列請(qǐng)求可以以提高磁盤性能的方式進(jìn)行排序低級(jí)的設(shè)備驅(qū)動(dòng)程序一般采用如下策略:處理請(qǐng)求隊(duì)列上的第一個(gè)請(qǐng)求,并設(shè)置設(shè)備控制器,以便在數(shù)據(jù)傳送完成時(shí)可以產(chǎn)生一個(gè)中斷,然后就停止當(dāng)設(shè)備控制器產(chǎn)生中斷時(shí),中斷處理程序就激活下半
33、局部。下半局部將被處理的請(qǐng)求刪除,并繼續(xù)16/29/202291請(qǐng)求隊(duì)列由一個(gè)大的描述符request_queue表示參見blkdev.h文件實(shí)際上,請(qǐng)求隊(duì)列是一個(gè)雙向鏈表,其元素是請(qǐng)求描述符I/O調(diào)度程序?qū)⑻峁讉€(gè)預(yù)先確定好的元素的排序方式每個(gè)塊設(shè)備的待處理請(qǐng)求都是用一個(gè)請(qǐng)求描述符request來表示的6/29/202292塊設(shè)備驅(qū)動(dòng)程序塊設(shè)備驅(qū)動(dòng)程序是Linux塊子系統(tǒng)中的最底層組件它們從I/O調(diào)度程序中獲得請(qǐng)求,然后按照要求處理這些請(qǐng)求每個(gè)塊設(shè)備驅(qū)動(dòng)程序?qū)?yīng)一個(gè)device_driver描述符每個(gè)磁盤都與一個(gè)device描述符關(guān)聯(lián)塊設(shè)備描述符block_device6/29/202293塊設(shè)備描述符與塊子系統(tǒng)其他結(jié)構(gòu)的鏈接6/29/202294注冊(cè)和初始化塊設(shè)備驅(qū)動(dòng)程序自定義驅(qū)動(dòng)程序描述符預(yù)訂主設(shè)備號(hào)初始化自定義描述符初始化gendisk描述符初始化塊設(shè)備操作表分配和初始化請(qǐng)求隊(duì)列設(shè)置中斷處理程序注冊(cè)磁盤6/29/202295策略例程策略例程是塊設(shè)備驅(qū)動(dòng)程序的一個(gè)函數(shù)或一組函數(shù)與硬件塊設(shè)備之間相互作用,以滿足調(diào)度隊(duì)列中所聚集的請(qǐng)求通過請(qǐng)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 買賣合同范本免
- 鹵肉教學(xué)員合同范本
- 上海企業(yè)記賬報(bào)稅合同范本
- 廠區(qū)白蟻防治合同范本
- 吳中區(qū)工程咨詢合同范本
- 課題立項(xiàng)成果申報(bào)書
- 廠房消防檢測(cè)服務(wù)合同范本
- 單位轉(zhuǎn)讓出租車合同范本
- 賣別墅合同范本
- 廠房拆遷工程合同范例
- GT 42456-2023 工業(yè)自動(dòng)化和控制系統(tǒng)信息安全 IACS組件的安全技術(shù)要求
- 《胎心監(jiān)護(hù)及判讀》
- 2023-2024全國初中物理競(jìng)賽試題第09講杠桿(原卷版)
- 2023-2024學(xué)年人教版新教材必修第二冊(cè) 第七章第一節(jié) 認(rèn)識(shí)有機(jī)化合物(第1課時(shí)) 教案
- 裝飾裝修工程安全管理培訓(xùn)學(xué)習(xí)
- 非煤露天礦山風(fēng)險(xiǎn)辨識(shí)與評(píng)估及風(fēng)險(xiǎn)控制
- 2022版義務(wù)教育(物理)課程標(biāo)準(zhǔn)(附課標(biāo)解讀)
- AIB(2022版)統(tǒng)一檢查標(biāo)準(zhǔn)-前提方案與食品安全程序
- 《土地管理法》課件
- 網(wǎng)絡(luò)安全技術(shù)服務(wù)方案
- 地鐵站務(wù)員職業(yè)發(fā)展規(guī)劃
評(píng)論
0/150
提交評(píng)論