vxWorks文件系統(tǒng)詳細(xì)介紹.doc
《vxWorks文件系統(tǒng)詳細(xì)介紹.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《vxWorks文件系統(tǒng)詳細(xì)介紹.doc(8頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
VxWorks為塊設(shè)備(磁盤)的實(shí)時(shí)使用提供了兩種本地文件系統(tǒng):一種與MS-DOS文件系統(tǒng)相兼容,另一種與RT-11文件系統(tǒng)相兼容。這些文件系統(tǒng)的支持庫分別為dosFsLib和rt11FsLib。VxWorks還提供了一種簡(jiǎn)單的raw文件系統(tǒng),這個(gè)文件系統(tǒng)把整個(gè)磁盤作為一個(gè)單獨(dú)的大文件。這個(gè)文件系統(tǒng)的支持庫是rawFsLib。 VxWorks還為不使用標(biāo)準(zhǔn)文件或目錄結(jié)構(gòu)的磁帶設(shè)備提供了一個(gè)文件系統(tǒng)。磁帶卷被看作一個(gè)raw設(shè)備,整個(gè)卷就是一個(gè)大文件。這個(gè)文件系統(tǒng)的支持庫是tapeFsLib。另外,VxWorks提供了一個(gè)文件系統(tǒng)支持庫cdromFsLib,它允許應(yīng)用程序從依照ISO9660標(biāo)準(zhǔn)文件系統(tǒng)格式化的CD-ROMs中讀取數(shù)據(jù)。 在VxWorks中,文件系統(tǒng)不受塊設(shè)備種類型或它的驅(qū)動(dòng)程序的約束。VxWorks塊設(shè)備都使用一個(gè)標(biāo)準(zhǔn)接口,以便文件系統(tǒng)可以與設(shè)備驅(qū)動(dòng)程序自由的混合。做為選擇,你可以寫自己的能被驅(qū)動(dòng)程序以相同方式使用的文件系統(tǒng),只要在文件系統(tǒng)、驅(qū)動(dòng)程序和I/O系統(tǒng)間遵循同樣的標(biāo)準(zhǔn)接口。VxWorks的I/O體系結(jié)構(gòu)使得在一個(gè)VxWorks系統(tǒng)中可以有多樣的文件系統(tǒng),甚至其類型也可以不同。塊設(shè)備界面在3.9.4塊設(shè)備中討論。 1 與MS-DOS兼容的文件系統(tǒng):dosFs 使用dosFs文件系統(tǒng)格式化的磁盤與MS-DOS(直至6.2版本)磁盤是相兼容的。由兩個(gè)文件系統(tǒng)初始化的硬盤之間在格式上有細(xì)微區(qū)別。然而,數(shù)據(jù)自身是兼容的,而且dosFs可被配置成使用MS-DOS格式化的磁盤。 DosFs文件系統(tǒng)向不同要求的實(shí)時(shí)應(yīng)用程序提供了良好的適應(yīng)性。主要特點(diǎn)包括: l 文件和目錄分等級(jí)排序,允許有效地組織,在一卷上可以創(chuàng)建任意數(shù)量的文件。 l 每個(gè)文件可以是連續(xù)存儲(chǔ)或非連續(xù)存儲(chǔ)的。非連續(xù)存儲(chǔ)的文件可使硬盤空間利用率更高,連續(xù)存儲(chǔ)的文件可以增強(qiáng)系統(tǒng)性能。 l 具有與廣泛可用的存儲(chǔ)器和可恢復(fù)介質(zhì)的兼容性。應(yīng)用VxWorks(不使用dosFs文件擴(kuò)展名)、MS-DOS PCs和其它系統(tǒng)創(chuàng)建的磁盤可以自由的交換。如果分區(qū)表被說明,那么硬盤也是兼容的。 l 具有從有dosFs文件系統(tǒng)的本地SCSI設(shè)備引導(dǎo)VxWorks的能力。 l 可以使用比通常MS-DOS允許的8個(gè)字符的文件名加3個(gè)字符的擴(kuò)展名更長(zhǎng)的文件名。 l NFS(網(wǎng)絡(luò)文件系統(tǒng))的支持。 1.1磁盤組織 MSDOS/ dosFs文件系統(tǒng)提供了一種以靈活方式組織磁盤數(shù)據(jù)的方法。它維護(hù)指定目錄、每個(gè)包含文件或其它的目錄的等級(jí)設(shè)置。文件可以被設(shè)置其搜索路徑;文件擴(kuò)展時(shí),新的磁盤空間被自動(dòng)分配。分配給一個(gè)文件的磁盤空間不必一定是連續(xù)的,這樣可以使磁盤空間浪費(fèi)最小。然而,為了提高它的實(shí)時(shí)性,dosFs文件系統(tǒng)允許連續(xù)空間被預(yù)先個(gè)別地分配給文件,從而使查找操作最塊,行為更加確定。MS-DOS/dosFs文件系統(tǒng)的通常組織結(jié)構(gòu)如圖1,其中的多個(gè)單元在下面的部分論述。 圖1 MS-DOS磁盤組織 ------------------------------- 引導(dǎo)扇區(qū) 扇區(qū)0 ----------------------------- 文件分配表(FAT) ----------------------------- 根目錄 ------------------------ 文件和子目錄 ---------------------------- 簇 在MS-DOS/dosFs文件系統(tǒng)中,分配給文件的磁盤空間由一個(gè)或多個(gè)磁盤簇組成。一個(gè)簇為一組連續(xù)的磁盤扇區(qū) 。軟盤通常由兩個(gè)扇區(qū)組成一簇;固定硬盤由更多的扇區(qū)組成一簇。文件系統(tǒng)可以一次分配的最小的磁盤空間為一簇。雖然每簇有巨大數(shù)量的扇區(qū)允許在固定大小的文件分配表( FAT;見 文件分配表)中描述一個(gè)巨大的磁盤,但是這可能會(huì)導(dǎo)致磁盤空間的浪費(fèi)。 引導(dǎo)扇區(qū) MS-DOS/dosFs硬盤或磁盤的第一個(gè)扇區(qū)稱為引導(dǎo)扇區(qū)。其中包含有多種配置數(shù)據(jù)。其中一些數(shù)據(jù)域描述硬盤的物理性質(zhì)(例如總扇區(qū)數(shù)),另外一些域描述文件系統(tǒng)變量(例如根目錄的大?。?。 引導(dǎo)扇區(qū)信息在初始化時(shí)寫入磁盤。dosFs文件系統(tǒng)可以使用在另一個(gè)系統(tǒng)上初始化過的磁盤(例如,在MS-DOS PC上使用FORMAT),或者VxWorks可以使用ioctl()調(diào)用中的FIODISKINIT函數(shù)初始化磁盤。 隨著MS-DOS標(biāo)準(zhǔn)的發(fā)展,多樣的域被加入到引導(dǎo)扇區(qū)的定義中。VxWorks 下的磁盤初始化使用MS-DOS 5.0版本定義的引導(dǎo)扇區(qū)域。 MS-DOS 初始化硬盤時(shí),在引導(dǎo)扇區(qū)中加入一個(gè)分區(qū)表。而VxWorks不創(chuàng)建這樣一個(gè)表。所以兩個(gè)系統(tǒng)初始化的硬盤是不同的。如果設(shè)備的塊補(bǔ)償參數(shù)創(chuàng)建程序?qū)⒊龇謪^(qū)表范圍的數(shù)據(jù)指向數(shù)據(jù)區(qū)的第一個(gè)字節(jié),那么VxWorks可以讀取被 MS-DOS 格式化的磁盤文件。 文件分配表 每個(gè)MS-DOS/dosFs卷包含一個(gè)文件分配表(FAT)。對(duì)每一個(gè)分配給文件或目錄的磁盤上的簇,F(xiàn)AT中都有一個(gè)條目。當(dāng)簇沒有使用過時(shí)(可分配),它的條目值為零。如果簇分配給一個(gè)文件,它的條目值是文件下一部分的簇號(hào)。如果簇位于文件的最后,它的條目值是-1。所以,文件或目錄的表述由一個(gè)FAT條目鏈表組成。如2例所示,一個(gè)文件由簇2、300和500組成。簇3是沒有使用過。 注意:dosFs不映射壞的磁盤扇區(qū)到FAT中 圖2:FAT條目 此主題相關(guān)圖片如下: FAT的每個(gè)條目占12或16位。最多包含4085簇的磁盤卷用12位條目;多于4085簇的磁盤用16位條目。條目(特別是12位條目)最初利用英特爾8088體系配置的優(yōu)點(diǎn),編碼為特殊形式。然而,因?yàn)樗械腇AT操作都通過dosFs文件系統(tǒng)執(zhí)行;所以編碼和譯碼與 VxWorks應(yīng)用程序無關(guān)。 一個(gè)卷通常包括多個(gè)FAT拷貝。這種冗余允許數(shù)據(jù)在第一份FAT中發(fā)生介質(zhì)錯(cuò)誤事件時(shí)得到恢復(fù)。 警告:如果是指定配置,dosFs 文件系統(tǒng)維護(hù)多個(gè)FAT拷貝;然而,在錯(cuò)誤事件中,拷貝不是自動(dòng)使用的。 FAT的大小和FAT拷貝的數(shù)量是由引導(dǎo)扇區(qū)中的域決定的。對(duì)于使用dosFs文件系統(tǒng)初始化的磁盤,這些參數(shù)是在dosFsDevInit( )調(diào)用(通過設(shè)置卷配置結(jié)構(gòu)DOS_VOL_CONFIG中域)期間被指定的。 根目錄 每個(gè)MS-DOS/dosFs卷包含一個(gè)根目錄。根目錄總是占有緊接著FAT拷貝的一組連續(xù)的磁盤扇區(qū)。根目錄占領(lǐng)的磁盤區(qū)域不在FAT中被條目描述。 根目錄的大小是固定的,它的大小被引導(dǎo)扇區(qū)中的一個(gè)域指定,作為允許的目錄項(xiàng)的最大數(shù)值。對(duì)于使用dosFs文件系統(tǒng)初始化的磁盤,這個(gè)大小是在dosFsDevInit( )調(diào)用(通過設(shè)置卷配置結(jié)構(gòu)DOS_VOL_CONFIG中域)期間被指定的。 因?yàn)楦夸浻幸粋€(gè)固定的大小,所以目錄為滿時(shí)再向其中加入項(xiàng)將返回一個(gè)錯(cuò)誤。 子目錄 除了根目錄外,MS-DOS/dosFs卷有時(shí)包含一個(gè)子目錄層。和根目錄一樣,子目錄也包含文件和其它子目錄項(xiàng); 不過,在有些方面它們不同與根目錄,而是類似于文件。 l 第一、象文件一樣,每個(gè)子目錄都被另一個(gè)目錄中的項(xiàng)描述。這樣的一個(gè)目錄項(xiàng)通過在文件屬性字節(jié)中一個(gè)位設(shè)置來說明它描述了一個(gè)子目錄。同時(shí),子目錄與根目錄不同,它有用戶指定名。 l 第二、分配給子目錄的磁盤空間由FAT條目連接而成的一組磁盤組成。這意味著子目錄可以隨著條目的加入而增大,并且子目錄不一定要由連續(xù)的簇組成。根目錄與子目錄不同,能由任意數(shù)量的扇區(qū)組成,并且不必等于簇的整數(shù)倍數(shù)。 l 第三,子目錄通常包含兩個(gè)專用的項(xiàng)。“.”項(xiàng)指向子目錄本身,“..”項(xiàng)指向子目錄的父目錄。而根目錄不包含這些專用項(xiàng)。 文件 在MO-DOS/dosFs文件系統(tǒng)中分配給文件的磁盤空間是由FAT中的條目鏈在一起的一組簇。一個(gè)文件不一定由連續(xù)的簇組成;可以以任意順序分配磁盤任意位置的不同的簇。 每個(gè)文件在其目錄中有一個(gè)描述項(xiàng)。這個(gè)項(xiàng)包含文件名、大小、最后一次修改的時(shí)間和日期,還有文件的幾個(gè)重要屬性(只讀文件,系統(tǒng)文件,隱藏文件,存檔文件)。這個(gè)條目也包含文件的起始簇?cái)?shù);剩下的簇用FAT定位。 卷標(biāo) 一個(gè)MS-DOS/dosFs磁盤可以有一個(gè)相關(guān)的卷標(biāo)。卷標(biāo)在根目錄中是一個(gè)特殊項(xiàng)。它不包含文件名和子目錄,而是包含一個(gè)識(shí)別卷的字符串。這個(gè)字符串可以包含最多11個(gè)字符。卷標(biāo)項(xiàng)是通過在目錄項(xiàng)中的一個(gè)特殊的文件屬性字節(jié)的值來識(shí)別的。 注意雖然卷標(biāo)條目沒有用ls()報(bào)告出來。不過它占了根目錄固定數(shù)目的條目中的一個(gè)。 卷標(biāo)可以通過使用帶有FIOLABELSET函數(shù)參數(shù)的ioctl()調(diào)用加入到dosFs卷。如果卷標(biāo)不存在,就在卷的根目錄加一個(gè)卷標(biāo)項(xiàng),否則,改變卷標(biāo)字符串的值。這個(gè)卷標(biāo)條目占據(jù)一個(gè)固定的根目錄條目數(shù);當(dāng)根目錄滿時(shí)增加一個(gè)條目將導(dǎo)致一個(gè)錯(cuò)誤。 當(dāng)前的卷標(biāo)字符串可以通過調(diào)用帶有FIOLABELGET函數(shù)參數(shù)的ioctl()來獲得。如果沒有卷標(biāo),這個(gè)調(diào)用將返回一個(gè)錯(cuò)誤,并設(shè)置errno為S_dosFsLib_NO_LABEL。 在VxWork或MS-DOS5.0(或更高版本)下初始化的磁盤,其引導(dǎo)扇區(qū)也包含卷標(biāo)字符串。 1.2 初始化dosFs文件系統(tǒng) 注意在任何其它操作能被執(zhí)行之前,dosFs文件系統(tǒng)庫(dosFsLib)必須通過dosFsInit()調(diào)用進(jìn)行初始化。這個(gè)程序帶有一個(gè)參數(shù)――可以在同一時(shí)間打開的dosFs文件描述符的最大數(shù)。文件描述符的數(shù)目是在初始化時(shí)被分配,而且應(yīng)用程序打開一個(gè)文件、目錄或文件系統(tǒng)設(shè)備時(shí),就使用了一個(gè)文件描述符。 dosFsInit()程序在I/O系統(tǒng)驅(qū)動(dòng)器表中也為文件系統(tǒng)創(chuàng)建了一個(gè)條目(用isoDrvInstall())。這個(gè)條目為dosFs文件操作指定條目指針,并且可以用于dosFs文件系統(tǒng)中所有的設(shè)備。分配給dosFs文件系統(tǒng)的驅(qū)動(dòng)器數(shù)記錄在全局變量dosFsDrvNum中。 DosFsInit()通常在VxWorks系統(tǒng)啟動(dòng)之后被usrRoot()任務(wù)調(diào)用。使用這種初始化,在項(xiàng)目工具VxWorks view中選擇INCLUDE_DOSFS,在Params屬性標(biāo)記中設(shè)置NUM_DOSFS_FILES為想打開文件的最大數(shù)。 1.3 使用dosFs初始化設(shè)備 dosFs文件系統(tǒng)初始化后,下一步是創(chuàng)建一個(gè)或更多的設(shè)備。設(shè)備通過設(shè)備驅(qū)動(dòng)器的設(shè)備創(chuàng)建程序(xxDevCreate())來創(chuàng)建。驅(qū)動(dòng)程序向塊設(shè)備描述符結(jié)構(gòu)(BLK_DEV)返回一個(gè)指針。BLK_DEV結(jié)構(gòu)描述了設(shè)備的物理形式,同時(shí)也指定設(shè)備驅(qū)動(dòng)程序提供給文件系統(tǒng)的程序。更多塊設(shè)備的信息參見3.9.4塊設(shè)備。 設(shè)備剛創(chuàng)建之后,塊設(shè)備沒有與其相關(guān)聯(lián)的名字和文件系統(tǒng)。為了初始化一個(gè)塊設(shè)備用于dosFs文件系統(tǒng),已經(jīng)創(chuàng)建好的塊設(shè)備必須與dosFs相關(guān)聯(lián),并指派一個(gè)名字。這由dosFsDevInit()完成。它的參數(shù)有:用來標(biāo)識(shí)設(shè)備的名字、塊設(shè)備描述符結(jié)構(gòu)和卷配置結(jié)構(gòu)DOS_VOL_CONFIG(見4.2.4卷結(jié)構(gòu))。例子: DOS_VOL_DESC *pVolDesc; DOS_VOL_CONFIG configStruct; pVolDesc = dosFsDevInit ("DEV1:", pBlkDev, &configStruct); dosFsDevInit()調(diào)用執(zhí)行下列任務(wù): l 為設(shè)備命名,把設(shè)備加入I/O系統(tǒng)設(shè)備表(用iosDevAdd())。 l 為設(shè)備分配并初始化文件系統(tǒng)卷描述符 l 返回指向卷描述符的一個(gè)指針。這個(gè)指針用來在一些文件系統(tǒng)調(diào)用時(shí)識(shí)別磁卷 用dosFs初始化設(shè)備并不格式化磁盤,也不用MS_DOS結(jié)構(gòu)(根目錄,F(xiàn)AT,等等)初始化磁盤??梢栽谟袛?shù)據(jù)存在于MS_DOS文件系統(tǒng)中的磁盤上使用dosFsDevInit()調(diào)用;可以使用ioctl()函數(shù)中FIODISKFORMAT和FIODISKINIT分別實(shí)現(xiàn)磁盤格式化和DOS磁盤初始化。 DosFsMkfs()調(diào)用提供了一種簡(jiǎn)易的dosFs設(shè)備初始化的方法。如下 l 提供了一組缺省的配置值。 l 調(diào)用dosFsDevInit()。 l 使用帶有FIODISKINIT的ioctl()函數(shù)初始化磁盤。 默認(rèn)的dosFsMkfs()不能使任何dosFs-specific卷選項(xiàng) (DOS_OPT_CHANGENOWARN,DOS_OPT-AUTOSYNC,DOS_OPT-LONGNAMES,DOS_OPT_LOWERCASE,或DOS_OPT_EXPORT)可用。在調(diào)用dosFsMkfs()初始化磁盤之前使用dosFsMkfsOptionsSet(),可以使這些選項(xiàng)中的所有組合有效。有關(guān)默認(rèn)配置值的更多信息,見dosFsMkfs()手冊(cè)。 1.4 卷配置 卷的配置結(jié)構(gòu)(DOS_VOL_CONFIG)在調(diào)用dosFsDevInit()時(shí)使用。這個(gè)結(jié)構(gòu)包含多種描述磁盤上數(shù)據(jù)分布的dosFs文件系統(tǒng)變量。結(jié)構(gòu)中的大多數(shù)域與引導(dǎo)扇區(qū)中的相符。表1列出在DOS_VOL_CONFIG結(jié)構(gòu)中的域。 表1:DOS_VOL_CONFIG域。 域 描述 dosvc_mediaByte 媒體描述符字節(jié) dosvc_secPerClust 每簇的扇區(qū)數(shù) dosvc_nResrvd 第一個(gè)FAT拷貝之前的保留扇區(qū)數(shù),最小值為1(引導(dǎo)扇區(qū)) dosvc_nFats FAT拷貝數(shù) dosvc_secPerFat 每個(gè)FAT拷貝的扇區(qū)數(shù) dosvc_maxRootEnts 根目錄中條目的最大值 dosvc_nHidden 隱藏扇區(qū)數(shù),通常為0 dosvc_options VxWorks特殊文件系統(tǒng)選項(xiàng) dosvc_reserved 風(fēng)河公司為將來使用保留 調(diào)用dosFsConfigInit()是初始化DOS_VOL_CONFIG的簡(jiǎn)便方法。它把配置變量作為參數(shù)并裝入結(jié)構(gòu)。這對(duì)從Tornado shell中交互地初始化設(shè)備很有用(見Tornado 用戶手冊(cè):shell)。DOS_VOL_CONFIG結(jié)構(gòu)必須在dosFsConfigInit( )調(diào)用前被分配。 DOS_VOL_CONFIG 域 在表1中除了最后兩個(gè)DOS_VOL_CONFIG域,都描述了標(biāo)準(zhǔn)MS_DOS的特征。 域dosvc_options對(duì)于dosFs文件系統(tǒng)很特殊。這個(gè)域可能的選項(xiàng)見表2 表2:dosFs卷選項(xiàng) 選項(xiàng) 16進(jìn)制值 描述 DOS_OPT_CHANGENOWARN 0x1 磁盤可能在沒有警告的情況下被改動(dòng). DOS_OPT_AUTOSYNC 0x2 I/O期間使磁盤同步 DOS_OPT_LONGNAMES 0x4 使用不受8.3規(guī)格的限制的大小寫敏感文件名 DOS_OPT_EXPORT 0x8 允許使用NFS輸出 DOS_OPT_LOWERCASE 0x40 在磁盤上使用小寫文件名 前兩個(gè)選項(xiàng)說明同步磁盤緩存塊與物理設(shè)備的動(dòng)作。剩下的選項(xiàng)用于擴(kuò)展dosFs的性能。 DOS_OPT_CHANGENOWARN 如果磁盤沒有被卸載就可被替換,或在狀態(tài)就緒檢查中發(fā)生變化,則設(shè)置這個(gè)選項(xiàng)。在這種情形中,有規(guī)則的檢查磁盤來確定否發(fā)生改變。這將引起系統(tǒng)重大的開支;那么,我們推薦使用一種總是在移除前同步和卸載磁盤的機(jī)制,或至少聲明狀態(tài)就緒改變的機(jī)制。如果這樣的機(jī)制適當(dāng),或磁盤是不可移動(dòng)的,則不設(shè)置這個(gè)屬性。自動(dòng)同步模式在DOS_OPT_CHANGENOWARN被設(shè)置時(shí)自動(dòng)允許(見下面有關(guān)DOS_OPT_AUTOSYNC的描述)。 DOS_OPT_AUTOSYNC 設(shè)置這個(gè)屬性可確保磁盤緩存器中的目錄和FAT數(shù)據(jù)被修改后盡快寫入物理設(shè)備,而不僅僅是在文件關(guān)閉時(shí)被寫入物理設(shè)備。數(shù)據(jù)盡可能存儲(chǔ)到物理介質(zhì)上,從而避免在系統(tǒng)緊急事件中丟失數(shù)據(jù)。因?yàn)槭褂米酝侥J綍r(shí)將降低性能,所以 。 然而,DOS_OPT_AUTOSYNC設(shè)置不能使dosFs在每個(gè)write()后自動(dòng)向磁盤中寫數(shù)據(jù)。這將意味著極大地降低了性能。如果你的應(yīng)用程序要求dosFs在每個(gè)write()后自動(dòng)向磁盤中寫數(shù)據(jù),每次調(diào)用write()后使用帶有FIOFLUSH的ioctl()函數(shù) 注不論什么時(shí)候設(shè)置DOS_OPT_CHANGENOWARN,自動(dòng)同步模式都可以自動(dòng)允許。 DOS_OPT_LONGNAMES 設(shè)置這個(gè)屬性使系統(tǒng)允許使用大小寫敏感文件名,文件名長(zhǎng)度不受MS-DOS8.3版本的限制。 DOS_OPT_EXPORT 設(shè)置這個(gè)選項(xiàng)來初始化想使用NFS輸出的文件系統(tǒng)。dosFs初始化生成附加的支持NFS協(xié)議所需的內(nèi)存數(shù)據(jù)結(jié)構(gòu)。這個(gè)選項(xiàng)對(duì)初始化文件系統(tǒng)(可以被輸出的)是必不可少的,但它不真正輸出文件系統(tǒng)。 DOS_OPT_LOWERCASE 設(shè)置這個(gè)選項(xiàng)來迫使dosFs創(chuàng)建的文件名使用小寫字母字符。 (除了DOS_OPT_LONGNAMES選項(xiàng)是激活的,通常文件名用大寫字母字符)如果dosFs卷是通過基于PC的NFS的客戶機(jī)裝載的,則需要設(shè)置這個(gè)選項(xiàng)。如果DOS_OPT_LONGNAMES選項(xiàng)也被指定,則這個(gè)選項(xiàng)無效。 計(jì)算配置值 在DOS_VOL_CONFIG結(jié)構(gòu)中,dosvc_secPerClust和dosvc_secPerFat的值必須基于被使用的特殊的設(shè)備進(jìn)行計(jì)算。 dosvc_secPerClust 這個(gè)域用來說明組成一個(gè)單獨(dú)的簇的連續(xù)扇區(qū)數(shù)。因?yàn)橐淮厥敲看慰梢员环峙涞淖钚〈疟P空間,簇的大小決定了磁盤分配控制的細(xì)微程度。每簇中扇區(qū)數(shù)越多,每次分配的扇區(qū)數(shù)越多,從而降低了磁盤空間使用的整個(gè)效率。因此,通常每簇使用盡可能少的扇區(qū),不過每簇少于兩個(gè)扇區(qū)通常是不必要的。 FAT條目最大為16位;那么,可以被描述的簇的最大值為65536(64KB,或0x1000),這就是一個(gè)設(shè)備的簇的最大值。為了確定一簇中適當(dāng)?shù)纳葏^(qū)數(shù),以0x1000(64k)劃分磁盤上的所有扇區(qū)(BLK_DEV結(jié)構(gòu)中的bd_nBlocks域),進(jìn)位舍入到下一個(gè)整數(shù),最終結(jié)果就是每簇中的扇區(qū)數(shù);把這個(gè)值賦予DOS_VOL_CONFIG結(jié)構(gòu)中的dosvc_secPerClust域。 dosvc_secPerFat 這個(gè)域指定磁盤上每個(gè)FAT拷貝必需的扇區(qū)數(shù)。要計(jì)算出這個(gè)值,首先確定磁盤的總簇?cái)?shù)??偞?cái)?shù)等于總扇區(qū)數(shù)(BLK_DEV結(jié)構(gòu)中的bd_nBlocks)除以每簇的扇區(qū)數(shù)。如前面提到的,磁盤的簇的最大數(shù)為64KB。 簇?cái)?shù)隨每個(gè)FAT條目的位數(shù)增加:如果總簇?cái)?shù)小于等于4085,F(xiàn)AT條目為12位;如果簇?cái)?shù)大于4085,F(xiàn)AT條目為16位。增加的結(jié)果是每個(gè)FAT拷貝所需的總字節(jié)數(shù)。這個(gè)字節(jié)數(shù)除以每個(gè)扇區(qū)的大?。˙LK_DEV結(jié)構(gòu)中的bd_bytesPerBlk域),決定了每個(gè)FAT拷貝的扇區(qū)數(shù)(按扇區(qū)的大小劃分);如果有一些殘余,結(jié)果再加一。把最終的值賦予dosvc_secPerFat域。 假定512字節(jié)扇區(qū),每個(gè)拷貝最大可能的FAT占用256個(gè)扇區(qū),計(jì)算如下 標(biāo)準(zhǔn)磁盤配置 對(duì)于軟盤,許多標(biāo)準(zhǔn)磁盤配置用于MS-DOS系統(tǒng)。通常,配置通過媒體描述符字節(jié)的值唯一識(shí)別(至少針對(duì)一種給定大小的軟盤),雖然一些制造商對(duì)不同的格式使用完全相同的值。一些廣泛使用的配置參見表3。 固定磁盤不使用標(biāo)準(zhǔn)磁盤配置,因?yàn)樗鼈兒苌俑綄儆谕獠康南到y(tǒng),。通常固定磁盤使用0xF8的介質(zhì)格式字節(jié)。 表3:MS_DOS 軟盤配置 容量 160KB 180KB 320KB 360KB 1.2MB 720KB 1.44MB 尺寸 5.25" 5.25" 5.25" 5.25" 5.25" 3.5" 3.5" 面 1 1 2 2 2 2 2 磁道 40 40 40 40 80 80 80 扇區(qū)/磁道 8 9 8 9 15 9 18 字節(jié)/扇區(qū) 512 512 512 512 512 512 512 secPerClust 1 1 2 2 1 2 1 nResrvd 1 1 1 1 1 1 1 NFats 2 2 2 2 2 2 2 如前所述,在dosfs文件系統(tǒng)設(shè)備應(yīng)用dosfsdevinit()首次初始化時(shí),多種磁盤配置參數(shù)被指定。這些參數(shù)保存在卷描述符dos_vol_desc中。而帶有不同參數(shù)值的磁盤可能被放置在初始化過的設(shè)備驅(qū)動(dòng)器中。如果用另一個(gè)磁盤取代磁盤(帶有最后輸入到卷描述符的配置參數(shù)),那么新磁盤的配置參數(shù)必須在使用之前獲得。 當(dāng)磁盤被裝載時(shí),引導(dǎo)扇區(qū)信息從磁盤上讀取出來。此數(shù)據(jù)用來更新在卷描述符中的配置數(shù)據(jù)。注意這個(gè)操作發(fā)生在磁盤存取的開始。而且在卷被卸載(使用dosfsvolunmount())或一個(gè)準(zhǔn)備好的替換操作被執(zhí)行之后,又再次執(zhí)行這個(gè)操作。 配置數(shù)據(jù)的自動(dòng)重新初始化有重要的含義。卷描述符數(shù)據(jù)在初始化磁盤(使用fiodiskinit)時(shí)使用;這樣,磁盤使用最近裝載的磁盤的配置初始化,而不考慮在dosfdevinit()期間的初始規(guī)格,因此我們推薦在磁盤裝載之前,在dosfsdevinit()之后緊接著使用fiodiskinit。(設(shè)備以raw模式打開,fiodiskinit ioctl()函數(shù)執(zhí)行后,關(guān)閉設(shè)備。) 已初始化過磁盤的使用 如果你使用一塊已經(jīng)初始化過的有ms-dos引導(dǎo)扇區(qū)、fat、根目錄的磁盤(例如,使用統(tǒng)一的ms-dos格式),則不需要在dosfsdevinit()中提供卷配置數(shù)據(jù)。 可以忽略ms-dos配置數(shù)據(jù)(通過指定一個(gè)null指針代替在dosfsdevinit( )期間dos_vol_config結(jié)構(gòu)的地址),不過僅僅在你確信卷的首次使用伴隨完全格式化和初始化過的磁盤時(shí)才使用這種方法。 當(dāng)裝載一個(gè)已經(jīng)初始化過的磁盤時(shí),所有標(biāo)準(zhǔn)的ms-dos配置值都從磁盤引導(dǎo)扇區(qū)獲取。而指向dosfs的選項(xiàng)必須被指明。 。 dos_opt_longnames(不受8.3版本限制的大小寫敏感文件名),使用這個(gè)選項(xiàng)初始化過的磁盤可以通過引導(dǎo)扇區(qū)中一個(gè)特殊的卷id字符串自動(dòng)識(shí)別。 dos_opt_changenowarn, dos_opt_autosync, dos_opt_lowercase, 和 dos_opt_export選項(xiàng)只記錄在內(nèi)存中,不放在磁盤上。因此當(dāng)用null代替dos_vol_config結(jié)構(gòu)指針初始化磁盤時(shí),不能刪除這些選項(xiàng)。另外可以使用dosfsdevinitoptionsset()程序設(shè)置這些選項(xiàng)為默認(rèn)值;除非支持明了的dos_vol_config信息,不然默認(rèn)值將應(yīng)用于后面所有使用dosfsdevinit()初始化的dosfs文件系統(tǒng)。 卷配置信息訪問 可以通過在tornado shell中使用dosfsconfigshow()2和dosfsconfigget()獲得磁盤信息。這里參考tornado(shell)。 使用dosfsconfigshow()顯示象最大連續(xù)區(qū)域和設(shè)備名這樣的配置信息。例如: -> dosfsconfigshow "/ram1/" value = 0 = 0x0 輸出到標(biāo)準(zhǔn)輸出設(shè)備,如下 device name: /ram1/ total number of sectors: 400 bytes per sector: 512 media byte: 0xf0 # of sectors per cluster: 2 # of reserved sectors: 1 # of fat tables: 2 # of sectors per fat: 1 max # of root dir entries: 112 # of hidden sectors: 0 removable medium: false disk change w/out warning: not enabled auto-sync mode: not enabled long file names: not enabled exportable file system: not enabled volume mode: o_rdwr (read/write) available space: 199680 bytes max avail. contig space: 199680 bytes dosfsconfigget程序把磁盤信息存儲(chǔ)到dos_vol_config結(jié)構(gòu)中。這對(duì)于初始化一個(gè)新磁盤(與已有磁盤相同配置)很有用,另外對(duì)于用dosfsmkfs()在磁盤上初始化dosfs文件系統(tǒng),并需要獲取被計(jì)算的目前配置值也很有用。 裝載卷 通常磁盤卷在對(duì)磁盤上文件或目錄的第一個(gè)open()或creat()操作時(shí)自動(dòng)裝載。(某些ioctl()調(diào)用也可以引起磁盤裝載)。 如果在dosfsdevinit()調(diào)用期間,一個(gè)null指針被指定代替dos_vol_config結(jié)構(gòu)的地址,那么磁盤被立即裝載以獲得配置值。 磁盤裝載時(shí),從磁盤上讀取引導(dǎo)扇區(qū)、fat和目錄數(shù)據(jù)。卷描述符dos_vol_desc被更新以反映新裝載磁盤的配置。 自動(dòng)裝載發(fā)生在dosfsvolumount()或替換就緒操作之后的第一個(gè)文件存取時(shí)。如果磁盤在帶有dos_opt_changenowarn選項(xiàng)設(shè)置的dosfsdevinit()調(diào)用期間被定義,磁盤會(huì)被周期性地自動(dòng)裝載。當(dāng)磁盤以raw模式打開時(shí)自動(dòng)裝載不會(huì)發(fā)生;見打開整個(gè)設(shè)備(raw模式)。 警告:因?yàn)樵O(shè)備名是被使用簡(jiǎn)單子鏈匹配的i/o系統(tǒng)識(shí)別的,所以文件系統(tǒng)不使用單獨(dú)的斜杠(/)作為文件名。如果使用斜杠可能發(fā)生意外的結(jié)果。 可以使用usrfdconfig()裝載卷,但是這個(gè)程序不返回dos_vol_desc結(jié)構(gòu)。用usrfdconfig()裝載的卷不能使用許多dosfs命令,包括dosfsvolunmount()。不過dofs的ioctl()命令(包括fiounmount)通過fd存取卷信息,所以可以和usrfdconfig()一起使用。 文件i/o dosfs文件系統(tǒng)設(shè)備上的文件創(chuàng)建、刪除、讀寫都使用標(biāo)準(zhǔn)vxworks i/o程序: creat( )、 remove( )、 write( )和read( )。 整個(gè)設(shè)備的打開(raw模式) 可以打開整個(gè)的dosfs卷。這是在open()和creat()調(diào)用期間通過只指定設(shè)備名來實(shí)現(xiàn)。當(dāng)一個(gè)合法文件被打開時(shí)返回一個(gè)文件描述符;然而,在文件操作符上的操作影響整個(gè)設(shè)備。以這種方式打開整個(gè)卷叫作raw模式。 打開整個(gè)設(shè)備的通常原因是為ioctl()函數(shù)獲得一個(gè)不屬于某個(gè)文件的文件描述符。如fionfree函數(shù),它返回在卷上的有效字節(jié)數(shù)。然而,對(duì)于許多此類函數(shù),文件描述符可以是任何打開的此卷的,甚至一個(gè)特定文件的文件描述符。 當(dāng)一個(gè)磁盤用ms-dos數(shù)據(jù)結(jié)構(gòu)初始化(引導(dǎo)扇區(qū)、空的根目錄、fat)時(shí),以raw模式打開此設(shè)備。ioctl()函數(shù)fiodiskinit執(zhí)行初始化。 可以以raw模式讀寫磁盤上的數(shù)據(jù)。在這種模式下,整個(gè)的磁盤數(shù)據(jù)區(qū)被看作一個(gè)單獨(dú)的大文件。沒有目錄條目用來描述用raw模式寫的任何數(shù)據(jù)。 有關(guān)對(duì)整個(gè)設(shè)備(包括使用ms-dos的數(shù)據(jù)結(jié)構(gòu)的區(qū)域)低級(jí)i/o,,見4.4 raw文件系統(tǒng):rawfs和有關(guān)“vxworks 參考手冊(cè)>庫”下的rawfslib的在線參考。 子目錄創(chuàng)建 當(dāng)子目錄達(dá)到最大條目數(shù)時(shí),子目錄可以在根目錄以外的任何目錄下創(chuàng)建。子目錄有兩種創(chuàng)建方式: 1. 使用帶有fiomkdir函數(shù)的ioctl():目錄名傳遞給ioctl()。ioctl()調(diào)用使用的文件描述符可以通過以下方式獲得:打開整個(gè)卷(raw模式)、一個(gè)正規(guī)文件或卷上的另一個(gè)目錄。 2. 使用open():創(chuàng)建一個(gè)目錄,o_creat選項(xiàng)必須設(shè)置在標(biāo)記參量中打開,fstat_dir選項(xiàng)必須設(shè)置在模式參量中。open()調(diào)用返回一個(gè)文件描述符(描述新目錄)。這個(gè)文件描述符用于只讀,當(dāng)不再需要時(shí)關(guān)閉這個(gè)描述符。 使用以上兩種方法的任意一種方法創(chuàng)建目錄,新目錄名必須被指明。這個(gè)名字可以是一個(gè)全稱路徑名,或是一個(gè)相對(duì)于當(dāng)前工作目錄的路徑名。 子目錄刪除 被刪除的目錄必須是空的(除了“.”和“..”條目)。刪除目錄有兩種方法: 1. 使用帶有fiormdir函數(shù)的ioctl()調(diào)用,指定目錄名。另外,文件描述符可以指向卷上的任何文件、目錄、或卷自己。 2. 使用remove()函數(shù),指定目錄名。 目錄條目 每個(gè)dosfs目錄包含一組條目描述它的文件和子目錄。每個(gè)條目包含有關(guān)文件或子目錄的信息: 文件名 一個(gè)8字節(jié)字符串(如果需要,空格填補(bǔ))指定文件名。(命名可以長(zhǎng)至40個(gè)字符;詳情見4.2.18長(zhǎng)文件名支持) 文件擴(kuò)展名 一個(gè)3字節(jié)的字符串(空格填補(bǔ))指定文件名或子目錄名的一個(gè)延長(zhǎng)部分。(如果選擇了不受8.3版本限制的高級(jí)文件名,擴(kuò)展概念是不適用的。) 文件屬性 一個(gè)字節(jié)域指定文件的特征; 時(shí)間 文件編碼創(chuàng)建修改的時(shí)間 日期 文件編碼的創(chuàng)建修改的日期 簇號(hào) 文件內(nèi)開始簇的數(shù)目。通過搜索fat找后來的簇 文件大小 文件的大小,對(duì)描述子目錄的條目來說這個(gè)域通常為零。 讀目錄條目 在dosfs卷上的目錄可以使用opendir(),readdir(),rewinddir(),和closedir()程序來搜索。這些調(diào)用可以用來確定文件名和子目錄。 使用fstat()或stat()函數(shù)可以獲得有關(guān)指定文件更詳細(xì)的信息。連同標(biāo)準(zhǔn)文件信息,被這些程序使用的結(jié)構(gòu)還從目錄條目返回文件屬性字節(jié)。 文件屬性 在dosfs目錄條目中的文件屬性字節(jié)由一組標(biāo)記位組成,每位標(biāo)志一個(gè)特殊的文件特征。文件屬性字節(jié)描述的特征見下表。 表:文件屬性字節(jié)中的標(biāo)記 vxworks 標(biāo)記名 十六進(jìn)制值 描述 dos_attr_rdonly 0x01 只讀 dos_attr_hidden 0x02 隱藏文件 dos_attr_system 0x04 系統(tǒng)文件 dos_attr_vol_label 0x08 卷標(biāo) dos_attr_directory 0x10 子目錄 dos_attr_archive 0x20 存檔文件 當(dāng)一個(gè)文件被打開為o_wronly或o_rdwr時(shí),dos_attr_rdonly被選中。如果標(biāo)記設(shè)置了,open()返回error,并且設(shè)置errnos為_dosfslib_read_only。 警告:ms-dos隱藏文件和系統(tǒng)文件標(biāo)記(dos_attr_hidden和dos_attr_system)被dosfslib忽略。雖然他們保持完整,但他們不產(chǎn)生特殊的處理(例如,帶有這些標(biāo)記的條目當(dāng)搜索目錄時(shí)被公布)。 卷標(biāo)標(biāo)記dos_attr_vol_label用來說明一個(gè)包含磁盤的dosfs卷標(biāo)的目錄條目。標(biāo)簽不是必須的,如果使用了,每卷只有一個(gè)卷標(biāo)條目,在根目錄中。當(dāng)讀一個(gè)目錄的內(nèi)容時(shí),卷標(biāo)條目不被報(bào)告(用readdir())。只有使用ioctl()函數(shù)fiolabelget時(shí),卷標(biāo)條目才被確定。使用ioctl()函數(shù)fiolabelset,卷標(biāo)可以被設(shè)置成任何11個(gè)字符或更少字符的字符串。在這些ioctl()調(diào)用期間任何打開到此卷的文件描述符都可以使用。 目錄標(biāo)記dos_attr_directory用來指出這個(gè)條目不是一個(gè)正規(guī)的文件而是一個(gè)子目錄。 存檔標(biāo)記dos_attr_archive在文件被創(chuàng)建或修改時(shí)被設(shè)置。這個(gè)標(biāo)記被其他搜索卷的程序(尋找修改過的文件并選擇存檔)使用。這樣的程序必須清除存檔標(biāo)記,因?yàn)関xworks不做這個(gè)工作 。 屬性字節(jié)中的所有標(biāo)記(除了目錄和卷標(biāo)標(biāo)記)可以使用ioctl()函數(shù)filoattribset設(shè)置或清除。這個(gè)函數(shù)調(diào)用在指定文件打開后改變其屬性。在filattribset調(diào)用中指定的屬性字節(jié)值被直接復(fù)制;為了保護(hù)存在的標(biāo)記設(shè)置,使用stat()或fstat()確定當(dāng)前的屬性,然后使用and和or操作改變他們。 例:設(shè)置dosfs文件屬性 這個(gè)例子使一個(gè)dosfs文件只讀,并保持其他屬性不變 #include "vxworks.h" #include "iolib.h" #include "dosfslib.h" #include "sys/stat.h" #include "fcntl.h" status changeattributes (void) { int fd; struct stat statstruct; /* open file */ if ((fd = open ("file", o_rdonly, 0)) == error) return (error); /* get directory entry data */ if (fstat (fd, &statstruct) == error) return (error); /* set read-only flag on file */ if (ioctl (fd, fioattribset, (statstruct.st_attrib | dos_attr_rdonly)) == error) return (error); /* close file */ close (fd); } 文件日期和時(shí)間 目錄條目包含一個(gè)文件和目錄的時(shí)間和日期。這個(gè)時(shí)間在文件創(chuàng)建時(shí)被設(shè)置,并在文件被修改后關(guān)閉時(shí)被更新。描述子目錄的條目不被更新——它們總是包含目錄的創(chuàng)建日期和時(shí)間。 dosfslib庫在內(nèi)在結(jié)構(gòu)中維持日期和時(shí)間。然而通常沒有一個(gè)裝置來自動(dòng)更新時(shí)間和日期,這提供了兩種不同的設(shè)置日期和時(shí)間的方法。 第一種方法應(yīng)用兩個(gè)程序dosfsdateset()和dosfstimeset()。使用如下: dosfsdateset(1990,12,25)/*設(shè)置日期為1990年12月25日*/ dosfstimeset(14,30,22)/*設(shè)置時(shí)間為14:30:22*/ 必須按時(shí)調(diào)用這些程序來更新日期和時(shí)間的值。 第二種方法要求一個(gè)用戶支持的鉤子程序。如果使用dosfsdatetimeinstall()安裝了時(shí)間和日期的鉤子程序,只要dosfslib要求獲取當(dāng)前日期和時(shí)間,程序就被調(diào)用。這樣可以利用可被讀取硬件日歷時(shí)鐘來獲取當(dāng)前時(shí)間。也可以用于其它的維持當(dāng)前時(shí)間日期的應(yīng)用軟件。 定義日期/時(shí)間鉤子程序如下(datetimehook是一個(gè)例子名,真正的程序名可以是任何名) void datetimehook ( dos_date_time * pdatetime /* ptr to dosfs date & time struct */ ) 在鉤子程序的入口,包含最近的時(shí)間和日期的dos_date_time結(jié)構(gòu)設(shè)置在dosfslib中。接下來,鉤子程序用當(dāng)前正確的時(shí)間和日期填充結(jié)構(gòu)。結(jié)構(gòu)中沒有發(fā)生改變的區(qū)域保持先前的值。 ms-dos規(guī)格在文件時(shí)間標(biāo)記上僅提供了2秒間隔的時(shí)間戳。如果在dosfstimeset()或日期/時(shí)間鉤子程序里指定的秒數(shù)是帶零頭的,那么它四舍五入到下一個(gè)偶數(shù)。 dosfslib使用的日期和時(shí)間被初始為1998年1月1日,00:00:- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- vxWorks 文件系統(tǒng) 詳細(xì) 介紹
鏈接地址:http://m.hcyjhs8.com/p-6620149.html