版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Linux操作系統(tǒng)分析xlanchen@2007.6.25EmbeddedOperatingSystems2文件系統(tǒng)相關(guān)Unix文件系統(tǒng)概述Linux的虛擬文件系統(tǒng)I/O設(shè)備管理存儲(chǔ)相關(guān)磁盤(pán)高速緩存文件訪問(wèn)對(duì)換Ext2、ext3Unix文件系統(tǒng)概述xlanchen@2007.10.18xlanchen@2007.6.25EmbeddedOperatingSystems4提綱文件硬鏈接和軟鏈接文件類型文件描述符與索引節(jié)點(diǎn)訪問(wèn)權(quán)限和文件模式文件操作的系統(tǒng)調(diào)用xlanchen@2007.6.25EmbeddedOperatingSystems5文件Unix文件是以字節(jié)序列組成的信息載體內(nèi)核不解釋文件的內(nèi)容文件的組織xlanchen@2007.6.25EmbeddedOperatingSystems6文件、目錄和目錄樹(shù)文件被組織成一個(gè)樹(shù)狀的命名空間文件:葉結(jié)點(diǎn)目錄:根節(jié)點(diǎn)(根目錄“/”)和中間節(jié)點(diǎn)目錄使用一個(gè)目錄名標(biāo)識(shí)。目錄節(jié)點(diǎn)包含它下面的文件及子目錄的所有信息文件名和目錄名不能使用“/”和字符“\0”,其他ASCII字符都OK長(zhǎng)度:不同的文件系統(tǒng)有不同的限制,
通常<256個(gè)字符同一個(gè)目錄下,不允許文件重名;不同目錄下無(wú)妨xlanchen@2007.6.25EmbeddedOperatingSystems7當(dāng)前工作目錄Unix的每個(gè)進(jìn)程都有一個(gè)當(dāng)前工作目錄,currentworkingdirectory,屬于進(jìn)程的執(zhí)行上下文絕對(duì)路徑:用來(lái)在命名空間中指定一個(gè)特定的文件,以“/”打頭,表示以根目錄作為起點(diǎn),
形如“/home/chenxl/sample/test.c”相對(duì)路徑:以當(dāng)前工作目錄作為起點(diǎn)例如當(dāng)前目錄為“/home/chenxl”,則上述文件的相對(duì)路徑可以是“sample/test.c”xlanchen@2007.6.25EmbeddedOperatingSystems8“.”和“..”前者表示當(dāng)前工作目錄后者表示當(dāng)前工作目錄的父目錄若當(dāng)前工作目錄是根目錄“/”,那么“.”和“..”相等例如,當(dāng)前目錄是“/home/chenxl”,則上述文件的相對(duì)路徑還可以表示為“./sample/test.c”“./../chenxl/sample/test.c”“../../home/chenxl/sample/test.c”xlanchen@2007.6.25EmbeddedOperatingSystems9硬鏈接和軟鏈接硬鏈接(hardlink)一般情況下,一個(gè)常見(jiàn)的文件名代表了到對(duì)應(yīng)文件的一個(gè)硬鏈接一個(gè)文件可以有不同的硬鏈接,他們可以在同一個(gè)目錄下,也可以在不同的目錄下,因此一個(gè)文件可以有不同的文件名下面的命令可以創(chuàng)建一個(gè)硬鏈接
$lnp1p2其中p1指明一個(gè)現(xiàn)有的文件的路徑名p2指明新建立的硬鏈接的路徑名xlanchen@2007.6.25EmbeddedOperatingSystems10硬鏈接的限制不允許用戶給目錄創(chuàng)建硬鏈接只有在同一個(gè)文件系統(tǒng)的文件之間才能創(chuàng)建硬鏈接軟鏈接(symboliclink)符號(hào)鏈接是一種特殊的文件(短文件),它包含另一個(gè)文件的任意一個(gè)路徑名可以指向任意一個(gè)文件系統(tǒng)的任意文件,甚至一個(gè)不存在的文件下面的命令可以創(chuàng)建一個(gè)軟鏈接$ln-sp1p2p2指明新建立的軟連接的路徑名。在實(shí)現(xiàn)上,文件系統(tǒng)抽出p2的目錄部分,在此目錄下創(chuàng)建一個(gè)符號(hào)鏈接文件xlanchen@2007.6.25EmbeddedOperatingSystems11文件類型Unix文件的類型可以是常規(guī)文件(regularfile)目錄符號(hào)鏈接面向塊的設(shè)備文件面向字符的設(shè)備文件管道和命名管道套接字基本類型設(shè)備和驅(qū)動(dòng)相關(guān)用于進(jìn)程間通信xlanchen@2007.6.25EmbeddedOperatingSystems12文件描述符和索引節(jié)點(diǎn)文件系統(tǒng)處理文件所需要的所有信息都包含在索引節(jié)點(diǎn)inode中每個(gè)文件都有自己的inode一般而言,inode應(yīng)當(dāng)包含如下信息文件類型與文件相關(guān)的硬鏈接的個(gè)數(shù)以字節(jié)為單位的文件的長(zhǎng)度設(shè)備標(biāo)識(shí)符(即包含文件的設(shè)備的標(biāo)識(shí)符)在文件系統(tǒng)中標(biāo)識(shí)文件的inode號(hào)文件擁有者的UID文件的GID一些時(shí)間戳:inode狀態(tài)的改變時(shí)間、文件的最后訪問(wèn)時(shí)間、最后修改時(shí)間訪問(wèn)權(quán)限和文件模式xlanchen@2007.6.25EmbeddedOperatingSystems13訪問(wèn)權(quán)限和文件模式文件潛在的用戶分為3種類型文件所有者同組用戶其他用戶訪問(wèn)權(quán)限:讀、寫(xiě)、執(zhí)行每類用戶都有這三種權(quán)限文件的訪問(wèn)權(quán)限使用9個(gè)不同的bit來(lái)表示此外還有三種附加標(biāo)記suid、sgid、stickyxlanchen@2007.6.25EmbeddedOperatingSystems14文件操作的系統(tǒng)調(diào)用創(chuàng)建/刪除打開(kāi)/關(guān)閉讀/寫(xiě)定位更名#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>int
open(constchar*pathname,intflags);int
open(constchar*pathname,intflags,mode_tmode);int
creat(constchar*pathname,mode_tmode);#include<unistd.h>ssize_t
write(intfd,constvoid*buf,size_tcount);int
unlink(constchar*pathname);#include<sys/types.h>#include<unistd.h>off_t
lseek(intfildes,off_toffset,intwhence);#include<stdio.h>int
rename(constchar*oldpath,constchar*newpath);Linux的虛擬文件系統(tǒng)xlanchen@2007.10.18xlanchen@2007.6.25EmbeddedOperatingSystems16提綱虛擬文件系統(tǒng)VFS的作用VFS的數(shù)據(jù)結(jié)構(gòu)文件系統(tǒng)類型文件系統(tǒng)安裝路徑名查找VFS系統(tǒng)調(diào)用的實(shí)現(xiàn)文件加鎖xlanchen@2007.6.25EmbeddedOperatingSystems17虛擬文件系統(tǒng)VFS的作用虛擬文件系統(tǒng)VirtualFilesystemVirtualFilesystemSwitchVFS是一個(gè)軟件層,用來(lái)處理與Unix標(biāo)準(zhǔn)文件系統(tǒng)相關(guān)的所有系統(tǒng)調(diào)用。是用戶應(yīng)用程序與文件系統(tǒng)實(shí)現(xiàn)之間的抽象層能為各種文件系統(tǒng)提供一個(gè)通用的、統(tǒng)一的接口Linux與其他類Unix系統(tǒng)一樣,采用虛擬文件系統(tǒng)VFS來(lái)達(dá)到支持多種文件系統(tǒng)格式的目標(biāo)xlanchen@2007.6.25EmbeddedOperatingSystems18VFS在一個(gè)簡(jiǎn)單文件復(fù)制操作中的作用假設(shè)用戶輸入以下shell命令$cp/floppy/TEST/tmp/test其中,/floppy是MS-DOS的磁盤(pán)的一個(gè)掛載點(diǎn)(安裝點(diǎn))/tmp是Ext2文件系統(tǒng)中的一個(gè)目錄對(duì)于cp命令而言,它不需要知道/floppy/TEST和/tmp/test分別是什么文件系統(tǒng)類型在cp命令中,它通過(guò)VFS提供的系統(tǒng)調(diào)用接口進(jìn)行文件操作xlanchen@2007.6.25EmbeddedOperatingSystems19xlanchen@2007.6.25EmbeddedOperatingSystems20VFS支持的文件系統(tǒng)類型VFS支持的文件系統(tǒng)可以劃分為三種主要類型基于磁盤(pán)的文件系統(tǒng):它們管理在本地磁盤(pán)分區(qū)中可用的存儲(chǔ)空間Linux使用的文件系統(tǒng):ext2、ext3、ReiserFSUnix家族的文件系統(tǒng):SYSV文件系統(tǒng),UFS,MINIX文件系統(tǒng)以及VERITASVxFS微軟公司的文件系統(tǒng):MS-DOS、VFAT以及NTFSISO9660CD-ROM文件系統(tǒng)和通用磁盤(pán)格式的DVD文件系統(tǒng)其他有專利權(quán)的文件系統(tǒng),如HPFS、HFS、AFFS、ADFS起源于非Linux系統(tǒng)的其他日志文件系統(tǒng),JFS,XFSxlanchen@2007.6.25EmbeddedOperatingSystems21網(wǎng)絡(luò)文件系統(tǒng):用于訪問(wèn)屬于其他網(wǎng)絡(luò)計(jì)算機(jī)的文件系統(tǒng)所包含的文件NFS、Coda、AFS、SMB、NCP特殊文件系統(tǒng)不同于上述兩大類不管理具體的磁盤(pán)空間/proc各種不同的文件系統(tǒng)通過(guò)mount(掛載、安裝)到根文件系統(tǒng)中在Linux中,根文件系統(tǒng)即根目錄所代表的文件系統(tǒng)通常是ext2文件系統(tǒng)xlanchen@2007.6.25EmbeddedOperatingSystems22VFS中通用文件模型概念VFS的基本思想:引入一個(gè)通用文件模型,這個(gè)模型能夠表示所有支持的文件系統(tǒng)對(duì)于一個(gè)具體實(shí)現(xiàn)的文件系統(tǒng),在處理時(shí),需要將其進(jìn)行概念上的轉(zhuǎn)換例如,在通用文件模型中,目錄被看成是普通文件在實(shí)現(xiàn)上,
read()sys_readfile數(shù)據(jù)結(jié)構(gòu)f_opMS_DOS文件操作指針(其中的read操作)類似面向?qū)ο蟮母拍顇lanchen@2007.6.25EmbeddedOperatingSystems23通用文件模型有下列對(duì)象類型組成超級(jí)塊對(duì)象(superblockobject)存放文件系統(tǒng)相關(guān)信息:例如文件系統(tǒng)控制塊索引節(jié)點(diǎn)對(duì)象(inodeobject)存放具體文件的一般信息:文件控制塊/inode文件對(duì)象(fileobject)存放已打開(kāi)的文件和進(jìn)程之間交互的信息目錄項(xiàng)對(duì)象(dentryobject)存放目錄項(xiàng)與文件的鏈接信息xlanchen@2007.6.25EmbeddedOperatingSystems24三個(gè)不同的進(jìn)程打開(kāi)同一個(gè)文件
兩個(gè)不同的硬鏈接同一個(gè)硬鏈接xlanchen@2007.6.25EmbeddedOperatingSystems25VFS所處理的系統(tǒng)調(diào)用mount、umount:掛載/卸載文件系統(tǒng)sysfs
:獲取文件系統(tǒng)信息statfs、fstatfs、ustat
:獲取文件系統(tǒng)統(tǒng)計(jì)信息chroot
:更改根目錄chdir、fchdir、getcwd
:操縱當(dāng)前工作目錄mkdir、rmdir
:創(chuàng)建/刪除目錄getdents、readdir
、link、unlink、rename:對(duì)目錄項(xiàng)進(jìn)行操作readlink
、symlink
:對(duì)軟鏈接進(jìn)行操作chown
、fchown
、lchown
:更改文件所有者chmod
、fchmod
、utime
:更改文件屬性open、close、create…xlanchen@2007.6.25EmbeddedOperatingSystems26上述大部分操作之需要與通用文件模型中的一些對(duì)象打交道,而不需要真正操作具體的文件系統(tǒng)和文件,因此可以把VFS看成是一個(gè)“通用”的文件系統(tǒng),在必要時(shí)依賴某種具體的文件系統(tǒng)xlanchen@2007.6.25EmbeddedOperatingSystems27VFS的數(shù)據(jù)結(jié)構(gòu)每個(gè)VFS對(duì)象都對(duì)應(yīng)一定的數(shù)據(jù)結(jié)構(gòu),在這個(gè)數(shù)據(jù)結(jié)構(gòu)中包含對(duì)象的屬性及其方法一個(gè)具體的文件系統(tǒng):超級(jí)塊對(duì)象:super_block一個(gè)具體的文件:Inode對(duì)象:inode一個(gè)打開(kāi)文件:文件對(duì)象:file目錄項(xiàng)對(duì)象:dentryxlanchen@2007.6.25EmbeddedOperatingSystems28與進(jìn)程相關(guān)的文件文件系統(tǒng)相關(guān)信息fs_struct打開(kāi)文件相關(guān)信息files_structxlanchen@2007.6.25EmbeddedOperatingSystems29文件系統(tǒng)類型特殊文件系統(tǒng)用來(lái)為系統(tǒng)程序員、系統(tǒng)管理員等提供一種容易的方式來(lái)操作內(nèi)核的數(shù)據(jù)結(jié)構(gòu)并實(shí)現(xiàn)操作系統(tǒng)的特殊特征常用的特殊文件系統(tǒng)xlanchen@2007.6.25EmbeddedOperatingSystems30xlanchen@2007.6.25EmbeddedOperatingSystems31文件系統(tǒng)類型的注冊(cè)文件系統(tǒng)類型:file_system_type在系統(tǒng)初始化期間,register_filesystem()用來(lái)注冊(cè)編譯時(shí)指定的每個(gè)文件系統(tǒng)相應(yīng)的文件系統(tǒng)對(duì)象被插入到file_systems鏈表中unregister_filesystem()xlanchen@2007.6.25EmbeddedOperatingSystems32文件系統(tǒng)的掛載每個(gè)文件系統(tǒng)都有自己的根目錄如果一個(gè)文件系統(tǒng)的根目錄是系統(tǒng)目錄樹(shù)的根目錄,那個(gè)這個(gè)文件系統(tǒng)就是根文件系統(tǒng)其他文件系統(tǒng)可以掛載到系統(tǒng)的目錄樹(shù)上這樣的目錄稱為掛載點(diǎn)(mount點(diǎn),安裝點(diǎn))文件系統(tǒng)之間的掛載關(guān)系對(duì)應(yīng)文件系統(tǒng)之間的父子關(guān)系xlanchen@2007.6.25EmbeddedOperatingSystems33例如,放在軟盤(pán)/dev/fd0上的ext2文件系統(tǒng),可通過(guò)下列命令安裝在/flp上
mount-text2/dev/fd0/flp
一般情況下,只允許掛載一次
在umount之前,其他對(duì)/dev/fd0的掛載命令會(huì)失敗在2.4中,可以掛載多次不管被掛載多少次,只有一個(gè)真實(shí)的文件系統(tǒng),因此只有一個(gè)超級(jí)塊對(duì)象xlanchen@2007.6.25EmbeddedOperatingSystems34已掛載文件系統(tǒng)描述符vfsmount掛載根文件系統(tǒng)第一階段:安裝一個(gè)特殊的文件系統(tǒng),該文件系統(tǒng)僅提供一個(gè)作為初始安裝點(diǎn)的空目錄:init_mount_tree第二階段:mount_root掛載一個(gè)文件系統(tǒng)sys_mount卸載一個(gè)文件系統(tǒng)sys_umountxlanchen@2007.6.25EmbeddedOperatingSystems35Project6分析Linux的VFS相關(guān)的數(shù)據(jù)結(jié)構(gòu)、文件系統(tǒng)的掛載操作,了解VFS中的各種操作(例如read)是如何與一個(gè)具體的文件系統(tǒng)相關(guān)的。xlanchen@2007.6.25EmbeddedOperatingSystems36路徑名查找VFS是如何從文件路徑名找到相應(yīng)的索引節(jié)點(diǎn)的?分析路徑名,將它拆分成一個(gè)文件名序列除了最后一個(gè)文件名之外,其他所有文件名必定都是目錄名搜索的起點(diǎn):絕對(duì)路徑:currentfsroot
初始化
更改相對(duì)路徑:currentfspwd
更改xlanchen@2007.6.25EmbeddedOperatingSystems37首先找到起點(diǎn)目錄的索引節(jié)點(diǎn)在這個(gè)索引節(jié)點(diǎn)的目錄文件中,找到第一個(gè)目錄名(文件名)所對(duì)應(yīng)的索引節(jié)點(diǎn)在第一個(gè)目錄名的索引節(jié)點(diǎn)的目錄文件中找到第二個(gè)目錄名(文件名)所對(duì)應(yīng)的索引節(jié)點(diǎn)…反復(fù),直到文件名序列的最后一項(xiàng)xlanchen@2007.6.25EmbeddedOperatingSystems38在上述查找過(guò)程中要處理的其他問(wèn)題:對(duì)每個(gè)目錄的訪問(wèn)權(quán)限必須進(jìn)行檢查若是符號(hào)鏈接,需要進(jìn)行擴(kuò)展要考慮符號(hào)鏈接的循環(huán)引用(進(jìn)行處理)目錄名可能是一個(gè)文件系統(tǒng)的安裝點(diǎn),必須擴(kuò)展到一個(gè)新的文件系統(tǒng)中路徑名查找數(shù)據(jù)結(jié)構(gòu):structnameidata函數(shù):path_init,path_walk,path_releasexlanchen@2007.6.25EmbeddedOperatingSystems39查找操作的標(biāo)志xlanchen@2007.6.25EmbeddedOperatingSystems40標(biāo)準(zhǔn)查找操作要處理的問(wèn)題跳過(guò)第一個(gè)路徑名分量前的任何/考慮符號(hào)鏈接的查找檢查權(quán)限考慮“.”考慮“..”考慮普通目錄,要在目錄項(xiàng)高速緩存中查找…xlanchen@2007.6.25EmbeddedOperatingSystems41父路徑名的查找在很多情況下,查找操作的真正目的不是路徑名的最后一個(gè)分量,而是最后分量的前一個(gè)分量例如創(chuàng)建一個(gè)文件時(shí)此時(shí),路徑解析的結(jié)果中存放最后一個(gè)分量所在目錄對(duì)應(yīng)的對(duì)象xlanchen@2007.6.25EmbeddedOperatingSystems42符號(hào)鏈接的查找關(guān)于符號(hào)鏈接的解析由內(nèi)核來(lái)完成如何識(shí)別這是一個(gè)符號(hào)鏈接?如何處理符號(hào)鏈接的循環(huán)情況?xlanchen@2007.6.25EmbeddedOperatingSystems43VFS系統(tǒng)調(diào)用的實(shí)現(xiàn)仍然考慮$cp/floppy/TEST/tmp/test假定cp執(zhí)行下列代碼片段(實(shí)際要更復(fù)雜)inf=open("/floppy/TEST",O_RDONLY,0);
outf=open("/tmp/test",O_WRONLY|O_CREAT|O_TRUNC,0600);
do{
len=read(inf,buf,4096);
write(outf,buf,len);
}while(len);
close(outf);
close(inf);xlanchen@2007.6.25EmbeddedOperatingSystems44open()系統(tǒng)調(diào)用1、讀取文件名到內(nèi)核中2、分配一個(gè)新的文件描述符fd3、調(diào)用filp_open打開(kāi)文件,返回文件對(duì)象指針4、建立fd與文件對(duì)象指針的聯(lián)系xlanchen@2007.6.25EmbeddedOperatingSystems451、設(shè)置訪問(wèn)模式標(biāo)志2、調(diào)用open_namei3、調(diào)用dentry_openxlanchen@2007.6.25EmbeddedOperatingSystems46read和write系統(tǒng)調(diào)用1、獲得文件對(duì)象指針2、判斷是否有允許所請(qǐng)求的訪問(wèn)3、是否有強(qiáng)制鎖4、調(diào)用具體讀操作5、釋放文件對(duì)象指針Read和write幾乎相同,區(qū)別在于是讀還是寫(xiě)xlanchen@2007.6.25EmbeddedOperatingSystems47close系統(tǒng)調(diào)用
1、檢查fd的正確性和有效性2、釋放文件描述符3、調(diào)用filp_closexlanchen@2007.6.25EmbeddedOperatingSystems481、調(diào)用文件操作的flush方法2、釋放文件上的任何強(qiáng)制鎖3、調(diào)用fput釋放文件對(duì)象xlanchen@2007.6.25EmbeddedOperatingSystems49文件加鎖當(dāng)多個(gè)進(jìn)程訪問(wèn)同一個(gè)文件時(shí),會(huì)出現(xiàn)同步問(wèn)題寫(xiě)同一個(gè)文件的同一個(gè)位置對(duì)同一個(gè)文件的同一個(gè)位置,1讀1寫(xiě)或者更復(fù)雜的情況Unix系統(tǒng)提供對(duì)文件的加鎖機(jī)制,可以避免上述沖突POSIX標(biāo)準(zhǔn)規(guī)定了基于fcntl()系統(tǒng)調(diào)用的文件加鎖機(jī)制xlanchen@2007.6.25EmbeddedOperatingSystems50強(qiáng)制鎖vs
勸告鎖勸告鎖(advisorylock):需要進(jìn)程主動(dòng)參與Fcntl、flock、lockf強(qiáng)制鎖(mandatorylock):內(nèi)核強(qiáng)制檢查讀鎖vs
寫(xiě)鎖讀鎖:多個(gè)進(jìn)程可以讀共享寫(xiě)鎖:只能一個(gè)進(jìn)程寫(xiě),并且與讀鎖互斥xlanchen@2007.6.25EmbeddedOperatingSystems51Linux文件加鎖Linux支持所有的文件加鎖方式強(qiáng)制鎖、勸告鎖fcntl、flock、lockf(庫(kù)接口)利用mount系統(tǒng)調(diào)用的MS_MANDLOCK標(biāo)志,fcntl可以在每個(gè)文件系統(tǒng)的基礎(chǔ)上打開(kāi)或者關(guān)閉強(qiáng)制鎖(缺?。╆P(guān)閉情況下,fcntl產(chǎn)生勸告鎖否則根據(jù)文件的組信息若組設(shè)置位為1并且組執(zhí)行位為0,則產(chǎn)生強(qiáng)制鎖否則勸告鎖管理I/O設(shè)備xlanchen@2007.10.22xlanchen@2007.6.25EmbeddedOperatingSystems53I/O體系結(jié)構(gòu)總線:PC的CPU、RAM、I/O設(shè)備之間需要某些數(shù)據(jù)通路來(lái)保證信息的流動(dòng)總類:ISA、EISA、VESA、PCI以及MCA等等三種基本類型數(shù)據(jù)總線(pentium,64位)地址總線(pentium,32位)控制總線當(dāng)總線用于CPU與I/O設(shè)備之間的連接時(shí),成為I/O總線xlanchen@2007.6.25EmbeddedOperatingSystems54在x86處理器中,只使用了32位地址總線中的16位對(duì)I/O設(shè)備進(jìn)行尋址尋址范圍?使用64位數(shù)據(jù)總線中的8、16、32位傳送數(shù)據(jù)I/O設(shè)備與CPU之間的連接層次為:CPUI/O端口I/O接口
設(shè)備控制器xlanchen@2007.6.25EmbeddedOperatingSystems55PC的I/O體系結(jié)構(gòu)xlanchen@2007.6.25EmbeddedOperatingSystems56I/O端口(I/Oport)每個(gè)I/O端口8位,由于只使用16位地址總線訪問(wèn),因此I/O地址空間一共提供65536個(gè)I/O端口在端口地址對(duì)齊的情況下,連續(xù)的I/O端口可以看成16位/32位端口特定的指令用來(lái)訪問(wèn)I/O端口:in,ins,out,outsI/O端口的另外一種訪問(wèn)方法直接映射到物理地址空間可以使用存儲(chǔ)器操作指令,如mov,and,or等等xlanchen@2007.6.25EmbeddedOperatingSystems57I/O端口中的寄存器命令狀態(tài)輸入數(shù)據(jù)輸出數(shù)據(jù)xlanchen@2007.6.25EmbeddedOperatingSystems58Linux中訪問(wèn)I/O端口的操作inb、inw、inlinb_p、inw_p、inl_poutb、outw、outloutb_p、outw_p、outl_pinsb、insw、insloutsb、outsw、outslxlanchen@2007.6.25EmbeddedOperatingSystems59I/O端口的分配不同的設(shè)備使用各自不同的端口內(nèi)核使用資源信息來(lái)記錄端口分配信息一個(gè)資源表示I/O端口地址的一個(gè)范圍所有同種資源使用樹(shù)形結(jié)構(gòu)記錄,ioport_resource。一個(gè)較大范圍可以進(jìn)一步劃分為子范圍,使用兄弟鏈表表示xlanchen@2007.6.25EmbeddedOperatingSystems60相關(guān)的操作
xlanchen@2007.6.25EmbeddedOperatingSystems61I/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接口xlanchen@2007.6.25EmbeddedOperatingSystems62專用I/O接口專用于一個(gè)特定的硬件設(shè)備鍵盤(pán)接口圖形接口磁盤(pán)接口總線鼠標(biāo)接口網(wǎng)絡(luò)接口xlanchen@2007.6.25EmbeddedOperatingSystems63通用I/O接口現(xiàn)代PC都包含連接很多外部設(shè)備的幾個(gè)通用I/O接口并口:傳輸單位1個(gè)字節(jié)串口:逐位傳送USB口PCMCIA接口SCSI接口xlanchen@2007.6.25EmbeddedOperatingSystems64設(shè)備控制器復(fù)雜的設(shè)備需要一個(gè)設(shè)備控制器(devicecontroller)來(lái)驅(qū)動(dòng)作用對(duì)I/O接口接收到的高級(jí)命令進(jìn)行解釋,并控制設(shè)備執(zhí)行特定的操作對(duì)從設(shè)備接收到的電信號(hào)進(jìn)行解釋和轉(zhuǎn)換,并修改狀態(tài)寄存器典型的設(shè)備控制器,例如磁盤(pán)控制器xlanchen@2007.6.25EmbeddedOperatingSystems65I/O共享存儲(chǔ)器很多硬件設(shè)備都有自己的存儲(chǔ)器,通常稱之為I/O共享存儲(chǔ)器(I/OSharedMemory),例如顯存映射I/O共享存儲(chǔ)器的地址根據(jù)設(shè)備和總線類型的不同,可以在三個(gè)不同的物理地址范圍之間進(jìn)行映射對(duì)于連接到ISA總線上的大多數(shù)設(shè)備0xa0000~0xfffff對(duì)于使用VESA局部總線的一些老設(shè)備(圖形卡)0xe00000~0xffffff(現(xiàn)在基本不生產(chǎn))xlanchen@2007.6.25EmbeddedOperatingSystems66對(duì)于連接到PCI總線的設(shè)備映射到RAM物理地址的頂端關(guān)于圖形加速端口AGP(AcceleratedGraphicsPort)標(biāo)準(zhǔn)是高性能圖形卡的PCI增強(qiáng)版不僅有I/O共享存儲(chǔ)器,還能通過(guò)圖形地址再映射表GART(GraphicsAddressRemappingTable)直接對(duì)主板的RAM部分進(jìn)行尋址xlanchen@2007.6.25EmbeddedOperatingSystems67I/O共享存儲(chǔ)器的訪問(wèn)對(duì)于物理地址1M之內(nèi)的I/O共享存儲(chǔ)器訪問(wèn)直接訪問(wèn)3G以上的對(duì)應(yīng)線性區(qū)間addr+3G對(duì)于高端I/O共享存儲(chǔ)器訪問(wèn)沒(méi)有直接映射在3G以上的線性區(qū)間需要為其創(chuàng)建一塊非連續(xù)線性區(qū),并將其映射到高端I/O共享存儲(chǔ)器的物理地址上ioremap/iounmapio_mem=ioremap(某個(gè)物理起始地址,長(zhǎng)度)訪問(wèn)io_mem+相對(duì)于起始地址的偏移處xlanchen@2007.6.25EmbeddedOperatingSystems68DMA(直接存儲(chǔ)器訪問(wèn),DirectMemoryAccess)所有的PC都包含一個(gè)DMAC(DMA控制器)一種輔助處理器用來(lái)控制在RAM和I/O設(shè)備之間傳送數(shù)據(jù)設(shè)置并激活DMACDMAC自行傳送數(shù)據(jù)數(shù)據(jù)傳送結(jié)束后,DMAC發(fā)出一個(gè)中斷請(qǐng)求當(dāng)CPU和DMAC并發(fā)訪問(wèn)同一個(gè)存儲(chǔ)單元時(shí),通過(guò)存儲(chǔ)器仲裁器解決沖突使用者:慢速設(shè)備例如,磁盤(pán)驅(qū)動(dòng)器xlanchen@2007.6.25EmbeddedOperatingSystems69設(shè)備文件Unix類操作系統(tǒng)都是基于文件概念的文件是以字符序列而構(gòu)成的信息載體,因此一個(gè)I/O設(shè)備也可以當(dāng)作文件來(lái)處理與普通文件交互的系統(tǒng)調(diào)用也可以直接用于I/O設(shè)備例如對(duì)/dev/lp0設(shè)備文件的write()可以將數(shù)據(jù)發(fā)往打印機(jī)xlanchen@2007.6.25EmbeddedOperatingSystems70設(shè)備文件的分類根據(jù)設(shè)備驅(qū)動(dòng)程序的基本特性,設(shè)備文件可以分為:字符設(shè)備塊設(shè)備塊設(shè)備數(shù)據(jù)可以被隨機(jī)訪問(wèn)在用戶看來(lái),訪問(wèn)任何位置的數(shù)據(jù)時(shí)間大致相同典型例子:硬盤(pán)、軟盤(pán)、CD-ROM、DVD播放器等xlanchen@2007.6.25EmbeddedOperatingSystems71字符設(shè)備要么不可以隨機(jī)訪問(wèn),例如聲卡如果可以被隨機(jī)訪問(wèn)(往往通過(guò)順序訪問(wèn)方式實(shí)現(xiàn)),但隨著數(shù)據(jù)的位置的不同,其訪問(wèn)時(shí)間會(huì)相差很大,例如磁帶網(wǎng)絡(luò)網(wǎng)卡不與文件相關(guān)聯(lián),使用專門(mén)的處理方式xlanchen@2007.6.25EmbeddedOperatingSystems72老式的設(shè)備文件在Linux2.4中存在兩種設(shè)備文件老式的設(shè)備文件Devfs設(shè)備文件老式的設(shè)備文件這是存放在文件系統(tǒng)中的實(shí)際文件索引節(jié)點(diǎn)不對(duì)磁盤(pán)上的數(shù)據(jù)塊編址,而是包含硬件設(shè)備的一個(gè)標(biāo)識(shí)每個(gè)設(shè)備文件包括:名字、類型(字符/塊)設(shè)備號(hào)(主設(shè)備號(hào):次設(shè)備號(hào))同一設(shè)備驅(qū)動(dòng)程序不同設(shè)備xlanchen@2007.6.25EmbeddedOperatingSystems73mknod()系統(tǒng)調(diào)用用來(lái)創(chuàng)建老式的設(shè)備文件設(shè)備文件名操作權(quán)限和設(shè)備類型其中設(shè)備類型指定:S_IFCHR或S_IFBLK設(shè)備號(hào)16位,主設(shè)備號(hào):次設(shè)備號(hào)xlanchen@2007.6.25EmbeddedOperatingSystems74設(shè)備文件通常包含在/dev目錄中一些設(shè)備文件的例子xlanchen@2007.6.25EmbeddedOperatingSystems75注意:字符設(shè)備與塊設(shè)備具有獨(dú)立的編號(hào),例如,塊設(shè)備(3,0)不同于字符設(shè)備(3,0)設(shè)備文件通??梢员硎疽粋€(gè)硬件設(shè)備,例如磁盤(pán)/dev/hda或硬件設(shè)備的某一物理或邏輯分區(qū),例如磁盤(pán)分區(qū)/dev/hda2或一個(gè)虛擬的邏輯設(shè)備(不會(huì)與任何硬件設(shè)備相關(guān)聯(lián)),例如/dev/null代表一個(gè)“黑洞”xlanchen@2007.6.25EmbeddedOperatingSystems76對(duì)內(nèi)核而言,一個(gè)設(shè)備文件的名字是無(wú)關(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à)xlanchen@2007.6.25EmbeddedOperatingSystems77Devfs設(shè)備文件使用主次設(shè)備號(hào)標(biāo)識(shí)設(shè)備存在局限性在/dev中的大多數(shù)設(shè)備是不存在的8位長(zhǎng)的主次設(shè)備號(hào)不夠用上述原因以及其他的一些因素綜合起來(lái),促使了devfs設(shè)備文件的產(chǎn)生Devfs虛擬文件系統(tǒng)允許設(shè)備驅(qū)動(dòng)程序通過(guò)名字而不是主次設(shè)備號(hào)注冊(cè)設(shè)備,例如所有的磁盤(pán)可以放在/dev/disks目錄下/dev/hda/dev/disks/disc0/dev/hdb/dev/disks/disc1xlanchen@2007.6.25EmbeddedOperatingSystems78使用devfs文件系統(tǒng)的I/O驅(qū)動(dòng)程序通過(guò)調(diào)用devfs_register()注冊(cè)設(shè)備一個(gè)注冊(cè)了的設(shè)備文件自動(dòng)出現(xiàn)在devfs的虛擬目錄下xlanchen@2007.6.25EmbeddedOperatingSystems79設(shè)備文件的VFS處理進(jìn)程訪問(wèn)普通文件時(shí),通過(guò)文件系統(tǒng)訪問(wèn)磁盤(pán)分區(qū)中的數(shù)據(jù)塊當(dāng)進(jìn)程訪問(wèn)設(shè)備文件時(shí),卻可以驅(qū)動(dòng)硬件設(shè)備例如,進(jìn)程訪問(wèn)計(jì)算機(jī)上的溫度計(jì)對(duì)應(yīng)的設(shè)備文件獲得溫度HOW?VFSxlanchen@2007.6.25EmbeddedOperatingSystems80VFSVFS在設(shè)備文件打開(kāi)時(shí)使用與設(shè)備相關(guān)的函數(shù)調(diào)用替換其缺省的文件操作這些設(shè)備相關(guān)函數(shù)調(diào)用對(duì)硬件設(shè)備進(jìn)行操作xlanchen@2007.6.25EmbeddedOperatingSystems81設(shè)備驅(qū)動(dòng)程序這是一個(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操作xlanchen@2007.6.25EmbeddedOperatingSystems82注冊(cè)設(shè)備驅(qū)動(dòng)程序注冊(cè)一個(gè)設(shè)備驅(qū)動(dòng)程序意味著把它與對(duì)應(yīng)的設(shè)備文件連接起來(lái)使得對(duì)設(shè)備文件發(fā)出的系統(tǒng)調(diào)用可以由內(nèi)核轉(zhuǎn)化為相應(yīng)的設(shè)備驅(qū)動(dòng)程序?qū)?yīng)的函數(shù)訪問(wèn)一個(gè)沒(méi)有注冊(cè)設(shè)備驅(qū)動(dòng)程序的設(shè)備文件將會(huì)返回錯(cuò)誤碼-ENODEVxlanchen@2007.6.25EmbeddedOperatingSystems83注冊(cè)時(shí)機(jī)如果設(shè)備驅(qū)動(dòng)程序被靜態(tài)編譯進(jìn)內(nèi)核,則注冊(cè)發(fā)生在內(nèi)核初始化階段如果作為一個(gè)內(nèi)核模塊來(lái)編譯,則在裝入模塊的時(shí)候注冊(cè)(并在卸載模塊時(shí)注銷)xlanchen@2007.6.25EmbeddedOperatingSystems84設(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ū)的頁(yè)框
3,包括DMA通道本身xlanchen@2007.6.25EmbeddedOperatingSystems85監(jiān)控I/O操作I/O操作的持續(xù)時(shí)間通常不可預(yù)知,可能與各種因素相關(guān),例如機(jī)械裝置的狀態(tài),如對(duì)于磁盤(pán)來(lái)講,磁頭的當(dāng)前位置或?qū)嶋H的隨機(jī)事件,例如數(shù)據(jù)包何時(shí)到達(dá)網(wǎng)卡以及人為因素,例如人對(duì)鍵盤(pán)、鼠標(biāo)的使用,以及發(fā)現(xiàn)打印機(jī)卡紙時(shí)的操作為此設(shè)備驅(qū)動(dòng)程序必須通過(guò)某種監(jiān)控手段監(jiān)控I/O操作終止或超時(shí)xlanchen@2007.6.25EmbeddedOperatingSystems86兩種可用的技術(shù)輪詢模式(pollingmode)
CPU重復(fù)檢查(輪詢)設(shè)備的狀態(tài)寄存器,直到寄存器的值表明I/O操作已經(jīng)完成為止中斷模式(interruptmode)
如果I/O控制器能夠通過(guò)IRQ線發(fā)出I/O操作結(jié)束的信號(hào),就可以使用中斷模式xlanchen@2007.6.25EmbeddedOperatingSystems87輪詢模式的簡(jiǎn)單例子Why”--count”也可以使用jiffies進(jìn)行超時(shí)判斷若時(shí)間比較長(zhǎng),比如ms級(jí),可以在每次輪詢操作之后調(diào)用schedule主動(dòng)放棄CPU,直到下次被調(diào)度再次輪詢可以用來(lái)粗略的判斷超時(shí)xlanchen@2007.6.25EmbeddedOperatingSystems88中斷模式的簡(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é)果返回xlanchen@2007.6.25EmbeddedOperatingSystems89這個(gè)驅(qū)動(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ù)送到用戶空間中xlanchen@2007.6.25EmbeddedOperatingSystems90從設(shè)備上讀入數(shù)據(jù)喚醒read的剩余部分xlanchen@2007.6.25EmbeddedOperatingSystems91再看foo_read的輸入?yún)?shù)Structfile*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:沒(méi)有發(fā)生/處理中斷1:處理了中斷一個(gè)等待隊(duì)列,用來(lái)給foo_read睡眠一個(gè)數(shù)據(jù)區(qū),長(zhǎng)度為1,用來(lái)存放讀到的數(shù)據(jù)xlanchen@2007.6.25EmbeddedOperatingSystems92char*buf,用戶提供的存放數(shù)據(jù)的空間Count和ppos都沒(méi)有用到再看看foo_interrupt()中,這是通過(guò)foo一個(gè)全局變量獲得設(shè)備的私有數(shù)據(jù)結(jié)構(gòu)的,這個(gè)數(shù)據(jù)結(jié)構(gòu)與foo_read()中通過(guò)filp中獲得的私有數(shù)據(jù)一致foo_interrupt的輸入?yún)?shù)沒(méi)有得到使用,這是一種很普遍的情況xlanchen@2007.6.25EmbeddedOperatingSystems93塊設(shè)備驅(qū)動(dòng)程序典型的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026河南省直機(jī)關(guān)遴選公務(wù)員159人備考題庫(kù)含答案詳解
- 2026湖北隨州市曾都區(qū)公益性崗位招聘34人備考題庫(kù)附答案詳解
- 軟件開(kāi)發(fā)云原生開(kāi)發(fā)實(shí)踐手冊(cè)
- 2026福建廈門(mén)市集美區(qū)寧寶幼兒園招聘非在編(頂崗)教師4人備考題庫(kù)及答案詳解(易錯(cuò)題)
- 2026福建漳州市詔安縣教育局教師調(diào)配122人備考題庫(kù)及完整答案詳解
- 2026西藏山南市加查縣文旅局公益性崗位1人備考題庫(kù)及答案詳解1套
- 固安工業(yè)區(qū)核心區(qū)概念性規(guī)劃
- 隕石介紹教學(xué)課件
- 職業(yè)健康數(shù)據(jù)挖掘與精準(zhǔn)預(yù)防
- 職業(yè)健康與心理干預(yù)的一體化模式
- 學(xué)校教師情緒管理能力提升
- 2026年中國(guó)郵政儲(chǔ)蓄銀行招聘試題含答案
- 2025年度電氣工程師述職報(bào)告
- 檔案館機(jī)房設(shè)施設(shè)備管理制度
- 2025年中國(guó)抑郁障礙防治指南
- 2024年輕工行業(yè)經(jīng)濟(jì)運(yùn)行報(bào)告
- 電解銅銷售合同范本
- FGR的基因檢測(cè)策略與臨床解讀
- 建筑施工工地安全隱患排查清單
- 電力工程安全培訓(xùn)課件
- 中糧貿(mào)易錄用通知書(shū)
評(píng)論
0/150
提交評(píng)論