【文章內(nèi)容簡(jiǎn)介】
83。 * mmap(): map a region of the file into the virtual memory of a user process * fsync() / fasync(): synchronize any memory buffers with the physical device * readdir: read the files that are pointed to by a directory file * ioctl: set file attributes * check_media_change: check to see if a removable media has been removed (such as a floppy) * revalidate: verify that all cached information is valid Subsystem Description[虛擬文件系統(tǒng)]為了支持驅(qū)動(dòng)多種[邏輯文件系統(tǒng)]和多種[I/O設(shè)備],實(shí)現(xiàn)了兩個(gè)概念邏輯層——[設(shè)備驅(qū)動(dòng)層]和[邏輯文件系統(tǒng)層],并且是以一種易于擴(kuò)展的方法實(shí)現(xiàn)的。所謂[概念邏輯層]指是對(duì)多種實(shí)現(xiàn)細(xì)節(jié)進(jìn)行統(tǒng)一抽象,比如[設(shè)備驅(qū)動(dòng)層]對(duì)各種[I/O設(shè)備]進(jìn)行抽象,提供一致的訪問(wèn)接口;[邏輯文件系統(tǒng)層]亦如是。KEMIN:我對(duì)這幅構(gòu)圖有一點(diǎn)不解的,就是用戶進(jìn)程訪問(wèn)非磁盤(pán)設(shè)備(比如網(wǎng)卡)要不要通過(guò)邏輯文件系統(tǒng)層?答案是[設(shè)備文件系統(tǒng) ] 。 Device Drivers[設(shè)備驅(qū)動(dòng)層]負(fù)責(zé)對(duì)所有硬件設(shè)備進(jìn)行包裝抽象。Linux內(nèi)核支持三種設(shè)備驅(qū)動(dòng):字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。前兩者是與[虛擬文件系統(tǒng)]直接相關(guān)的。字符設(shè)備必須按順序訪問(wèn),而塊設(shè)備則可隨機(jī)訪問(wèn),但必須以塊為單位。所有設(shè)備驅(qū)動(dòng) 必須實(shí)現(xiàn)前面提到的文件接口(file interface)函數(shù)。從而,每個(gè)設(shè)備都可以看成文件,通過(guò)文件系統(tǒng)訪問(wèn)到它(這個(gè)文件被專稱為[設(shè)備文件])。當(dāng)內(nèi)核(或用戶進(jìn)程)都統(tǒng)一通過(guò)這個(gè) [文件接口]訪問(wèn)設(shè)備的時(shí)候,為系統(tǒng)添加新設(shè)備變得很容易;因?yàn)檫@個(gè)[文件接口]是抽象的(虛的),只要編寫(xiě)設(shè)備的硬件相關(guān)的代碼 實(shí)現(xiàn)這個(gè)接口即可。塊設(shè)備驅(qū)動(dòng)如果引入緩沖(buffer)機(jī)構(gòu)可大大提高I/O性能。因?yàn)榫彌_區(qū)可最少化讀寫(xiě)硬件設(shè)備的次數(shù)。內(nèi)核會(huì)為每一個(gè)設(shè)備指定一個(gè)請(qǐng)求隊(duì)列(request queue),當(dāng)[緩沖機(jī)構(gòu)]發(fā)現(xiàn)設(shè)備的緩沖區(qū)的數(shù)據(jù)不足以滿足一個(gè)請(qǐng)求時(shí),[緩沖機(jī)構(gòu)]會(huì)把該請(qǐng)求添加到設(shè)備請(qǐng)求隊(duì)列 ,然后眠掉該請(qǐng)求,直到緩沖區(qū)數(shù)據(jù)足夠。[緩沖機(jī)構(gòu)]由一個(gè)獨(dú)立的內(nèi)核線程——kflushd實(shí)現(xiàn)。kflushd也負(fù)責(zé)將緩沖數(shù)據(jù)寫(xiě)入外部設(shè)備,并清理緩沖區(qū)。主機(jī)和外設(shè)通信一般使用三種方式:輪詢、DMA和中斷。中斷相對(duì)前兩者要復(fù)