vxWorks文件系統(tǒng)詳細(xì)介紹.doc
《vxWorks文件系統(tǒng)詳細(xì)介紹.doc》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《vxWorks文件系統(tǒng)詳細(xì)介紹.doc(8頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
VxWorks為塊設(shè)備(磁盤(pán))的實(shí)時(shí)使用提供了兩種本地文件系統(tǒng):一種與MS-DOS文件系統(tǒng)相兼容,另一種與RT-11文件系統(tǒng)相兼容。這些文件系統(tǒng)的支持庫(kù)分別為dosFsLib和rt11FsLib。VxWorks還提供了一種簡(jiǎn)單的raw文件系統(tǒng),這個(gè)文件系統(tǒng)把整個(gè)磁盤(pán)作為一個(gè)單獨(dú)的大文件。這個(gè)文件系統(tǒng)的支持庫(kù)是rawFsLib。 VxWorks還為不使用標(biāo)準(zhǔn)文件或目錄結(jié)構(gòu)的磁帶設(shè)備提供了一個(gè)文件系統(tǒng)。磁帶卷被看作一個(gè)raw設(shè)備,整個(gè)卷就是一個(gè)大文件。這個(gè)文件系統(tǒng)的支持庫(kù)是tapeFsLib。另外,VxWorks提供了一個(gè)文件系統(tǒng)支持庫(kù)cdromFsLib,它允許應(yīng)用程序從依照ISO9660標(biāo)準(zhǔn)文件系統(tǒng)格式化的CD-ROMs中讀取數(shù)據(jù)。 在VxWorks中,文件系統(tǒng)不受塊設(shè)備種類(lèi)型或它的驅(qū)動(dòng)程序的約束。VxWorks塊設(shè)備都使用一個(gè)標(biāo)準(zhǔn)接口,以便文件系統(tǒng)可以與設(shè)備驅(qū)動(dòng)程序自由的混合。做為選擇,你可以寫(xiě)自己的能被驅(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),甚至其類(lèi)型也可以不同。塊設(shè)備界面在3.9.4塊設(shè)備中討論。 1 與MS-DOS兼容的文件系統(tǒng):dosFs 使用dosFs文件系統(tǒng)格式化的磁盤(pán)與MS-DOS(直至6.2版本)磁盤(pán)是相兼容的。由兩個(gè)文件系統(tǒng)初始化的硬盤(pán)之間在格式上有細(xì)微區(qū)別。然而,數(shù)據(jù)自身是兼容的,而且dosFs可被配置成使用MS-DOS格式化的磁盤(pán)。 DosFs文件系統(tǒng)向不同要求的實(shí)時(shí)應(yīng)用程序提供了良好的適應(yīng)性。主要特點(diǎn)包括: l 文件和目錄分等級(jí)排序,允許有效地組織,在一卷上可以創(chuàng)建任意數(shù)量的文件。 l 每個(gè)文件可以是連續(xù)存儲(chǔ)或非連續(xù)存儲(chǔ)的。非連續(xù)存儲(chǔ)的文件可使硬盤(pán)空間利用率更高,連續(xù)存儲(chǔ)的文件可以增強(qiáng)系統(tǒng)性能。 l 具有與廣泛可用的存儲(chǔ)器和可恢復(fù)介質(zhì)的兼容性。應(yīng)用VxWorks(不使用dosFs文件擴(kuò)展名)、MS-DOS PCs和其它系統(tǒng)創(chuàng)建的磁盤(pán)可以自由的交換。如果分區(qū)表被說(shuō)明,那么硬盤(pán)也是兼容的。 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磁盤(pán)組織 MSDOS/ dosFs文件系統(tǒng)提供了一種以靈活方式組織磁盤(pán)數(shù)據(jù)的方法。它維護(hù)指定目錄、每個(gè)包含文件或其它的目錄的等級(jí)設(shè)置。文件可以被設(shè)置其搜索路徑;文件擴(kuò)展時(shí),新的磁盤(pán)空間被自動(dòng)分配。分配給一個(gè)文件的磁盤(pán)空間不必一定是連續(xù)的,這樣可以使磁盤(pán)空間浪費(fèi)最小。然而,為了提高它的實(shí)時(shí)性,dosFs文件系統(tǒng)允許連續(xù)空間被預(yù)先個(gè)別地分配給文件,從而使查找操作最塊,行為更加確定。MS-DOS/dosFs文件系統(tǒng)的通常組織結(jié)構(gòu)如圖1,其中的多個(gè)單元在下面的部分論述。 圖1 MS-DOS磁盤(pán)組織 ------------------------------- 引導(dǎo)扇區(qū) 扇區(qū)0 ----------------------------- 文件分配表(FAT) ----------------------------- 根目錄 ------------------------ 文件和子目錄 ---------------------------- 簇 在MS-DOS/dosFs文件系統(tǒng)中,分配給文件的磁盤(pán)空間由一個(gè)或多個(gè)磁盤(pán)簇組成。一個(gè)簇為一組連續(xù)的磁盤(pán)扇區(qū) 。軟盤(pán)通常由兩個(gè)扇區(qū)組成一簇;固定硬盤(pán)由更多的扇區(qū)組成一簇。文件系統(tǒng)可以一次分配的最小的磁盤(pán)空間為一簇。雖然每簇有巨大數(shù)量的扇區(qū)允許在固定大小的文件分配表( FAT;見(jiàn) 文件分配表)中描述一個(gè)巨大的磁盤(pán),但是這可能會(huì)導(dǎo)致磁盤(pán)空間的浪費(fèi)。 引導(dǎo)扇區(qū) MS-DOS/dosFs硬盤(pán)或磁盤(pán)的第一個(gè)扇區(qū)稱(chēng)為引導(dǎo)扇區(qū)。其中包含有多種配置數(shù)據(jù)。其中一些數(shù)據(jù)域描述硬盤(pán)的物理性質(zhì)(例如總扇區(qū)數(shù)),另外一些域描述文件系統(tǒng)變量(例如根目錄的大小)。 引導(dǎo)扇區(qū)信息在初始化時(shí)寫(xiě)入磁盤(pán)。dosFs文件系統(tǒng)可以使用在另一個(gè)系統(tǒng)上初始化過(guò)的磁盤(pán)(例如,在MS-DOS PC上使用FORMAT),或者VxWorks可以使用ioctl()調(diào)用中的FIODISKINIT函數(shù)初始化磁盤(pán)。 隨著MS-DOS標(biāo)準(zhǔn)的發(fā)展,多樣的域被加入到引導(dǎo)扇區(qū)的定義中。VxWorks 下的磁盤(pán)初始化使用MS-DOS 5.0版本定義的引導(dǎo)扇區(qū)域。 MS-DOS 初始化硬盤(pán)時(shí),在引導(dǎo)扇區(qū)中加入一個(gè)分區(qū)表。而VxWorks不創(chuàng)建這樣一個(gè)表。所以?xún)蓚€(gè)系統(tǒng)初始化的硬盤(pán)是不同的。如果設(shè)備的塊補(bǔ)償參數(shù)創(chuàng)建程序?qū)⒊龇謪^(qū)表范圍的數(shù)據(jù)指向數(shù)據(jù)區(qū)的第一個(gè)字節(jié),那么VxWorks可以讀取被 MS-DOS 格式化的磁盤(pán)文件。 文件分配表 每個(gè)MS-DOS/dosFs卷包含一個(gè)文件分配表(FAT)。對(duì)每一個(gè)分配給文件或目錄的磁盤(pán)上的簇,F(xiàn)AT中都有一個(gè)條目。當(dāng)簇沒(méi)有使用過(guò)時(shí)(可分配),它的條目值為零。如果簇分配給一個(gè)文件,它的條目值是文件下一部分的簇號(hào)。如果簇位于文件的最后,它的條目值是-1。所以,文件或目錄的表述由一個(gè)FAT條目鏈表組成。如2例所示,一個(gè)文件由簇2、300和500組成。簇3是沒(méi)有使用過(guò)。 注意:dosFs不映射壞的磁盤(pán)扇區(qū)到FAT中 圖2:FAT條目 此主題相關(guān)圖片如下: FAT的每個(gè)條目占12或16位。最多包含4085簇的磁盤(pán)卷用12位條目;多于4085簇的磁盤(pán)用16位條目。條目(特別是12位條目)最初利用英特爾8088體系配置的優(yōu)點(diǎn),編碼為特殊形式。然而,因?yàn)樗械腇AT操作都通過(guò)dosFs文件系統(tǒng)執(zhí)行;所以編碼和譯碼與 VxWorks應(yīng)用程序無(wú)關(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)初始化的磁盤(pán),這些參數(shù)是在dosFsDevInit( )調(diào)用(通過(guò)設(shè)置卷配置結(jié)構(gòu)DOS_VOL_CONFIG中域)期間被指定的。 根目錄 每個(gè)MS-DOS/dosFs卷包含一個(gè)根目錄。根目錄總是占有緊接著FAT拷貝的一組連續(xù)的磁盤(pán)扇區(qū)。根目錄占領(lǐng)的磁盤(pán)區(qū)域不在FAT中被條目描述。 根目錄的大小是固定的,它的大小被引導(dǎo)扇區(qū)中的一個(gè)域指定,作為允許的目錄項(xiàng)的最大數(shù)值。對(duì)于使用dosFs文件系統(tǒng)初始化的磁盤(pán),這個(gè)大小是在dosFsDevInit( )調(diào)用(通過(guò)設(shè)置卷配置結(jié)構(gòu)DOS_VOL_CONFIG中域)期間被指定的。 因?yàn)楦夸浻幸粋€(gè)固定的大小,所以目錄為滿(mǎn)時(shí)再向其中加入項(xiàng)將返回一個(gè)錯(cuò)誤。 子目錄 除了根目錄外,MS-DOS/dosFs卷有時(shí)包含一個(gè)子目錄層。和根目錄一樣,子目錄也包含文件和其它子目錄項(xiàng); 不過(guò),在有些方面它們不同與根目錄,而是類(lèi)似于文件。 l 第一、象文件一樣,每個(gè)子目錄都被另一個(gè)目錄中的項(xiàng)描述。這樣的一個(gè)目錄項(xiàng)通過(guò)在文件屬性字節(jié)中一個(gè)位設(shè)置來(lái)說(shuō)明它描述了一個(gè)子目錄。同時(shí),子目錄與根目錄不同,它有用戶(hù)指定名。 l 第二、分配給子目錄的磁盤(pán)空間由FAT條目連接而成的一組磁盤(pán)組成。這意味著子目錄可以隨著條目的加入而增大,并且子目錄不一定要由連續(xù)的簇組成。根目錄與子目錄不同,能由任意數(shù)量的扇區(qū)組成,并且不必等于簇的整數(shù)倍數(shù)。 l 第三,子目錄通常包含兩個(gè)專(zhuān)用的項(xiàng)?!?”項(xiàng)指向子目錄本身,“..”項(xiàng)指向子目錄的父目錄。而根目錄不包含這些專(zhuān)用項(xiàng)。 文件 在MO-DOS/dosFs文件系統(tǒng)中分配給文件的磁盤(pán)空間是由FAT中的條目鏈在一起的一組簇。一個(gè)文件不一定由連續(xù)的簇組成;可以以任意順序分配磁盤(pán)任意位置的不同的簇。 每個(gè)文件在其目錄中有一個(gè)描述項(xiàng)。這個(gè)項(xiàng)包含文件名、大小、最后一次修改的時(shí)間和日期,還有文件的幾個(gè)重要屬性(只讀文件,系統(tǒng)文件,隱藏文件,存檔文件)。這個(gè)條目也包含文件的起始簇?cái)?shù);剩下的簇用FAT定位。 卷標(biāo) 一個(gè)MS-DOS/dosFs磁盤(pán)可以有一個(gè)相關(guān)的卷標(biāo)。卷標(biāo)在根目錄中是一個(gè)特殊項(xiàng)。它不包含文件名和子目錄,而是包含一個(gè)識(shí)別卷的字符串。這個(gè)字符串可以包含最多11個(gè)字符。卷標(biāo)項(xiàng)是通過(guò)在目錄項(xiàng)中的一個(gè)特殊的文件屬性字節(jié)的值來(lái)識(shí)別的。 注意雖然卷標(biāo)條目沒(méi)有用ls()報(bào)告出來(lái)。不過(guò)它占了根目錄固定數(shù)目的條目中的一個(gè)。 卷標(biāo)可以通過(guò)使用帶有FIOLABELSET函數(shù)參數(shù)的ioctl()調(diào)用加入到dosFs卷。如果卷標(biāo)不存在,就在卷的根目錄加一個(gè)卷標(biāo)項(xiàng),否則,改變卷標(biāo)字符串的值。這個(gè)卷標(biāo)條目占據(jù)一個(gè)固定的根目錄條目數(shù);當(dāng)根目錄滿(mǎn)時(shí)增加一個(gè)條目將導(dǎo)致一個(gè)錯(cuò)誤。 當(dāng)前的卷標(biāo)字符串可以通過(guò)調(diào)用帶有FIOLABELGET函數(shù)參數(shù)的ioctl()來(lái)獲得。如果沒(méi)有卷標(biāo),這個(gè)調(diào)用將返回一個(gè)錯(cuò)誤,并設(shè)置errno為S_dosFsLib_NO_LABEL。 在VxWork或MS-DOS5.0(或更高版本)下初始化的磁盤(pán),其引導(dǎo)扇區(qū)也包含卷標(biāo)字符串。 1.2 初始化dosFs文件系統(tǒng) 注意在任何其它操作能被執(zhí)行之前,dosFs文件系統(tǒng)庫(kù)(dosFsLib)必須通過(guò)dosFsInit()調(diào)用進(jìn)行初始化。這個(gè)程序帶有一個(gè)參數(shù)――可以在同一時(shí)間打開(kāi)的dosFs文件描述符的最大數(shù)。文件描述符的數(shù)目是在初始化時(shí)被分配,而且應(yīng)用程序打開(kāi)一個(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為想打開(kāi)文件的最大數(shù)。 1.3 使用dosFs初始化設(shè)備 dosFs文件系統(tǒng)初始化后,下一步是創(chuàng)建一個(gè)或更多的設(shè)備。設(shè)備通過(guò)設(shè)備驅(qū)動(dòng)器的設(shè)備創(chuàng)建程序(xxDevCreate())來(lái)創(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è)備的信息參見(jiàn)3.9.4塊設(shè)備。 設(shè)備剛創(chuàng)建之后,塊設(shè)備沒(méi)有與其相關(guān)聯(lián)的名字和文件系統(tǒng)。為了初始化一個(gè)塊設(shè)備用于dosFs文件系統(tǒng),已經(jīng)創(chuàng)建好的塊設(shè)備必須與dosFs相關(guān)聯(lián),并指派一個(gè)名字。這由dosFsDevInit()完成。它的參數(shù)有:用來(lái)標(biāo)識(shí)設(shè)備的名字、塊設(shè)備描述符結(jié)構(gòu)和卷配置結(jié)構(gòu)DOS_VOL_CONFIG(見(jiàn)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è)指針用來(lái)在一些文件系統(tǒng)調(diào)用時(shí)識(shí)別磁卷 用dosFs初始化設(shè)備并不格式化磁盤(pán),也不用MS_DOS結(jié)構(gòu)(根目錄,F(xiàn)AT,等等)初始化磁盤(pán)??梢栽谟袛?shù)據(jù)存在于MS_DOS文件系統(tǒng)中的磁盤(pán)上使用dosFsDevInit()調(diào)用;可以使用ioctl()函數(shù)中FIODISKFORMAT和FIODISKINIT分別實(shí)現(xiàn)磁盤(pán)格式化和DOS磁盤(pán)初始化。 DosFsMkfs()調(diào)用提供了一種簡(jiǎn)易的dosFs設(shè)備初始化的方法。如下 l 提供了一組缺省的配置值。 l 調(diào)用dosFsDevInit()。 l 使用帶有FIODISKINIT的ioctl()函數(shù)初始化磁盤(pán)。 默認(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()初始化磁盤(pán)之前使用dosFsMkfsOptionsSet(),可以使這些選項(xiàng)中的所有組合有效。有關(guān)默認(rèn)配置值的更多信息,見(jiàn)dosFsMkfs()手冊(cè)。 1.4 卷配置 卷的配置結(jié)構(gòu)(DOS_VOL_CONFIG)在調(diào)用dosFsDevInit()時(shí)使用。這個(gè)結(jié)構(gòu)包含多種描述磁盤(pán)上數(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)河公司為將來(lái)使用保留 調(diào)用dosFsConfigInit()是初始化DOS_VOL_CONFIG的簡(jiǎn)便方法。它把配置變量作為參數(shù)并裝入結(jié)構(gòu)。這對(duì)從Tornado shell中交互地初始化設(shè)備很有用(見(jiàn)Tornado 用戶(hù)手冊(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)見(jiàn)表2 表2:dosFs卷選項(xiàng) 選項(xiàng) 16進(jìn)制值 描述 DOS_OPT_CHANGENOWARN 0x1 磁盤(pán)可能在沒(méi)有警告的情況下被改動(dòng). DOS_OPT_AUTOSYNC 0x2 I/O期間使磁盤(pán)同步 DOS_OPT_LONGNAMES 0x4 使用不受8.3規(guī)格的限制的大小寫(xiě)敏感文件名 DOS_OPT_EXPORT 0x8 允許使用NFS輸出 DOS_OPT_LOWERCASE 0x40 在磁盤(pán)上使用小寫(xiě)文件名 前兩個(gè)選項(xiàng)說(shuō)明同步磁盤(pán)緩存塊與物理設(shè)備的動(dòng)作。剩下的選項(xiàng)用于擴(kuò)展dosFs的性能。 DOS_OPT_CHANGENOWARN 如果磁盤(pán)沒(méi)有被卸載就可被替換,或在狀態(tài)就緒檢查中發(fā)生變化,則設(shè)置這個(gè)選項(xiàng)。在這種情形中,有規(guī)則的檢查磁盤(pán)來(lái)確定否發(fā)生改變。這將引起系統(tǒng)重大的開(kāi)支;那么,我們推薦使用一種總是在移除前同步和卸載磁盤(pán)的機(jī)制,或至少聲明狀態(tài)就緒改變的機(jī)制。如果這樣的機(jī)制適當(dāng),或磁盤(pán)是不可移動(dòng)的,則不設(shè)置這個(gè)屬性。自動(dòng)同步模式在DOS_OPT_CHANGENOWARN被設(shè)置時(shí)自動(dòng)允許(見(jiàn)下面有關(guān)DOS_OPT_AUTOSYNC的描述)。 DOS_OPT_AUTOSYNC 設(shè)置這個(gè)屬性可確保磁盤(pán)緩存器中的目錄和FAT數(shù)據(jù)被修改后盡快寫(xiě)入物理設(shè)備,而不僅僅是在文件關(guān)閉時(shí)被寫(xiě)入物理設(shè)備。數(shù)據(jù)盡可能存儲(chǔ)到物理介質(zhì)上,從而避免在系統(tǒng)緊急事件中丟失數(shù)據(jù)。因?yàn)槭褂米酝侥J綍r(shí)將降低性能,所以 。 然而,DOS_OPT_AUTOSYNC設(shè)置不能使dosFs在每個(gè)write()后自動(dòng)向磁盤(pán)中寫(xiě)數(shù)據(jù)。這將意味著極大地降低了性能。如果你的應(yīng)用程序要求dosFs在每個(gè)write()后自動(dòng)向磁盤(pán)中寫(xiě)數(shù)據(jù),每次調(diào)用write()后使用帶有FIOFLUSH的ioctl()函數(shù) 注不論什么時(shí)候設(shè)置DOS_OPT_CHANGENOWARN,自動(dòng)同步模式都可以自動(dòng)允許。 DOS_OPT_LONGNAMES 設(shè)置這個(gè)屬性使系統(tǒng)允許使用大小寫(xiě)敏感文件名,文件名長(zhǎng)度不受MS-DOS8.3版本的限制。 DOS_OPT_EXPORT 設(shè)置這個(gè)選項(xiàng)來(lái)初始化想使用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)來(lái)迫使dosFs創(chuàng)建的文件名使用小寫(xiě)字母字符。 (除了DOS_OPT_LONGNAMES選項(xiàng)是激活的,通常文件名用大寫(xiě)字母字符)如果dosFs卷是通過(guò)基于PC的NFS的客戶(hù)機(jī)裝載的,則需要設(shè)置這個(gè)選項(xiàng)。如果DOS_OPT_LONGNAMES選項(xiàng)也被指定,則這個(gè)選項(xiàng)無(wú)效。 計(jì)算配置值 在DOS_VOL_CONFIG結(jié)構(gòu)中,dosvc_secPerClust和dosvc_secPerFat的值必須基于被使用的特殊的設(shè)備進(jìn)行計(jì)算。 dosvc_secPerClust 這個(gè)域用來(lái)說(shuō)明組成一個(gè)單獨(dú)的簇的連續(xù)扇區(qū)數(shù)。因?yàn)橐淮厥敲看慰梢员环峙涞淖钚〈疟P(pán)空間,簇的大小決定了磁盤(pán)分配控制的細(xì)微程度。每簇中扇區(qū)數(shù)越多,每次分配的扇區(qū)數(shù)越多,從而降低了磁盤(pán)空間使用的整個(gè)效率。因此,通常每簇使用盡可能少的扇區(qū),不過(guò)每簇少于兩個(gè)扇區(qū)通常是不必要的。 FAT條目最大為16位;那么,可以被描述的簇的最大值為65536(64KB,或0x1000),這就是一個(gè)設(shè)備的簇的最大值。為了確定一簇中適當(dāng)?shù)纳葏^(qū)數(shù),以0x1000(64k)劃分磁盤(pán)上的所有扇區(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è)域指定磁盤(pán)上每個(gè)FAT拷貝必需的扇區(qū)數(shù)。要計(jì)算出這個(gè)值,首先確定磁盤(pán)的總簇?cái)?shù)??偞?cái)?shù)等于總扇區(qū)數(shù)(BLK_DEV結(jié)構(gòu)中的bd_nBlocks)除以每簇的扇區(qū)數(shù)。如前面提到的,磁盤(pán)的簇的最大數(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)磁盤(pán)配置 對(duì)于軟盤(pán),許多標(biāo)準(zhǔn)磁盤(pán)配置用于MS-DOS系統(tǒng)。通常,配置通過(guò)媒體描述符字節(jié)的值唯一識(shí)別(至少針對(duì)一種給定大小的軟盤(pán)),雖然一些制造商對(duì)不同的格式使用完全相同的值。一些廣泛使用的配置參見(jiàn)表3。 固定磁盤(pán)不使用標(biāo)準(zhǔn)磁盤(pán)配置,因?yàn)樗鼈兒苌俑綄儆谕獠康南到y(tǒng),。通常固定磁盤(pán)使用0xF8的介質(zhì)格式字節(jié)。 表3:MS_DOS 軟盤(pán)配置 容量 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í),多種磁盤(pán)配置參數(shù)被指定。這些參數(shù)保存在卷描述符dos_vol_desc中。而帶有不同參數(shù)值的磁盤(pán)可能被放置在初始化過(guò)的設(shè)備驅(qū)動(dòng)器中。如果用另一個(gè)磁盤(pán)取代磁盤(pán)(帶有最后輸入到卷描述符的配置參數(shù)),那么新磁盤(pán)的配置參數(shù)必須在使用之前獲得。 當(dāng)磁盤(pán)被裝載時(shí),引導(dǎo)扇區(qū)信息從磁盤(pán)上讀取出來(lái)。此數(shù)據(jù)用來(lái)更新在卷描述符中的配置數(shù)據(jù)。注意這個(gè)操作發(fā)生在磁盤(pán)存取的開(kāi)始。而且在卷被卸載(使用dosfsvolunmount())或一個(gè)準(zhǔn)備好的替換操作被執(zhí)行之后,又再次執(zhí)行這個(gè)操作。 配置數(shù)據(jù)的自動(dòng)重新初始化有重要的含義。卷描述符數(shù)據(jù)在初始化磁盤(pán)(使用fiodiskinit)時(shí)使用;這樣,磁盤(pán)使用最近裝載的磁盤(pán)的配置初始化,而不考慮在dosfdevinit()期間的初始規(guī)格,因此我們推薦在磁盤(pán)裝載之前,在dosfsdevinit()之后緊接著使用fiodiskinit。(設(shè)備以raw模式打開(kāi),fiodiskinit ioctl()函數(shù)執(zhí)行后,關(guān)閉設(shè)備。) 已初始化過(guò)磁盤(pán)的使用 如果你使用一塊已經(jīng)初始化過(guò)的有ms-dos引導(dǎo)扇區(qū)、fat、根目錄的磁盤(pán)(例如,使用統(tǒng)一的ms-dos格式),則不需要在dosfsdevinit()中提供卷配置數(shù)據(jù)。 可以忽略ms-dos配置數(shù)據(jù)(通過(guò)指定一個(gè)null指針代替在dosfsdevinit( )期間dos_vol_config結(jié)構(gòu)的地址),不過(guò)僅僅在你確信卷的首次使用伴隨完全格式化和初始化過(guò)的磁盤(pán)時(shí)才使用這種方法。 當(dāng)裝載一個(gè)已經(jīng)初始化過(guò)的磁盤(pán)時(shí),所有標(biāo)準(zhǔn)的ms-dos配置值都從磁盤(pán)引導(dǎo)扇區(qū)獲取。而指向dosfs的選項(xiàng)必須被指明。 。 dos_opt_longnames(不受8.3版本限制的大小寫(xiě)敏感文件名),使用這個(gè)選項(xiàng)初始化過(guò)的磁盤(pán)可以通過(guò)引導(dǎo)扇區(qū)中一個(gè)特殊的卷id字符串自動(dòng)識(shí)別。 dos_opt_changenowarn, dos_opt_autosync, dos_opt_lowercase, 和 dos_opt_export選項(xiàng)只記錄在內(nèi)存中,不放在磁盤(pán)上。因此當(dāng)用null代替dos_vol_config結(jié)構(gòu)指針初始化磁盤(pán)時(shí),不能刪除這些選項(xiàng)。另外可以使用dosfsdevinitoptionsset()程序設(shè)置這些選項(xiàng)為默認(rèn)值;除非支持明了的dos_vol_config信息,不然默認(rèn)值將應(yīng)用于后面所有使用dosfsdevinit()初始化的dosfs文件系統(tǒng)。 卷配置信息訪(fǎng)問(wèn) 可以通過(guò)在tornado shell中使用dosfsconfigshow()2和dosfsconfigget()獲得磁盤(pán)信息。這里參考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程序把磁盤(pán)信息存儲(chǔ)到dos_vol_config結(jié)構(gòu)中。這對(duì)于初始化一個(gè)新磁盤(pán)(與已有磁盤(pán)相同配置)很有用,另外對(duì)于用dosfsmkfs()在磁盤(pán)上初始化dosfs文件系統(tǒng),并需要獲取被計(jì)算的目前配置值也很有用。 裝載卷 通常磁盤(pán)卷在對(duì)磁盤(pán)上文件或目錄的第一個(gè)open()或creat()操作時(shí)自動(dòng)裝載。(某些ioctl()調(diào)用也可以引起磁盤(pán)裝載)。 如果在dosfsdevinit()調(diào)用期間,一個(gè)null指針被指定代替dos_vol_config結(jié)構(gòu)的地址,那么磁盤(pán)被立即裝載以獲得配置值。 磁盤(pán)裝載時(shí),從磁盤(pán)上讀取引導(dǎo)扇區(qū)、fat和目錄數(shù)據(jù)。卷描述符dos_vol_desc被更新以反映新裝載磁盤(pán)的配置。 自動(dòng)裝載發(fā)生在dosfsvolumount()或替換就緒操作之后的第一個(gè)文件存取時(shí)。如果磁盤(pán)在帶有dos_opt_changenowarn選項(xiàng)設(shè)置的dosfsdevinit()調(diào)用期間被定義,磁盤(pán)會(huì)被周期性地自動(dòng)裝載。當(dāng)磁盤(pán)以raw模式打開(kāi)時(shí)自動(dòng)裝載不會(huì)發(fā)生;見(jiàn)打開(kāi)整個(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()。不過(guò)dofs的ioctl()命令(包括fiounmount)通過(guò)fd存取卷信息,所以可以和usrfdconfig()一起使用。 文件i/o dosfs文件系統(tǒng)設(shè)備上的文件創(chuàng)建、刪除、讀寫(xiě)都使用標(biāo)準(zhǔn)vxworks i/o程序: creat( )、 remove( )、 write( )和read( )。 整個(gè)設(shè)備的打開(kāi)(raw模式) 可以打開(kāi)整個(gè)的dosfs卷。這是在open()和creat()調(diào)用期間通過(guò)只指定設(shè)備名來(lái)實(shí)現(xiàn)。當(dāng)一個(gè)合法文件被打開(kāi)時(shí)返回一個(gè)文件描述符;然而,在文件操作符上的操作影響整個(gè)設(shè)備。以這種方式打開(kāi)整個(gè)卷叫作raw模式。 打開(kāi)整個(gè)設(shè)備的通常原因是為ioctl()函數(shù)獲得一個(gè)不屬于某個(gè)文件的文件描述符。如fionfree函數(shù),它返回在卷上的有效字節(jié)數(shù)。然而,對(duì)于許多此類(lèi)函數(shù),文件描述符可以是任何打開(kāi)的此卷的,甚至一個(gè)特定文件的文件描述符。 當(dāng)一個(gè)磁盤(pán)用ms-dos數(shù)據(jù)結(jié)構(gòu)初始化(引導(dǎo)扇區(qū)、空的根目錄、fat)時(shí),以raw模式打開(kāi)此設(shè)備。ioctl()函數(shù)fiodiskinit執(zhí)行初始化。 可以以raw模式讀寫(xiě)磁盤(pán)上的數(shù)據(jù)。在這種模式下,整個(gè)的磁盤(pán)數(shù)據(jù)區(qū)被看作一個(gè)單獨(dú)的大文件。沒(méi)有目錄條目用來(lái)描述用raw模式寫(xiě)的任何數(shù)據(jù)。 有關(guān)對(duì)整個(gè)設(shè)備(包括使用ms-dos的數(shù)據(jù)結(jié)構(gòu)的區(qū)域)低級(jí)i/o,,見(jiàn)4.4 raw文件系統(tǒng):rawfs和有關(guān)“vxworks 參考手冊(cè)>庫(kù)”下的rawfslib的在線(xiàn)參考。 子目錄創(chuàng)建 當(dāng)子目錄達(dá)到最大條目數(shù)時(shí),子目錄可以在根目錄以外的任何目錄下創(chuàng)建。子目錄有兩種創(chuàng)建方式: 1. 使用帶有fiomkdir函數(shù)的ioctl():目錄名傳遞給ioctl()。ioctl()調(diào)用使用的文件描述符可以通過(guò)以下方式獲得:打開(kāi)整個(gè)卷(raw模式)、一個(gè)正規(guī)文件或卷上的另一個(gè)目錄。 2. 使用open():創(chuàng)建一個(gè)目錄,o_creat選項(xiàng)必須設(shè)置在標(biāo)記參量中打開(kāi),fstat_dir選項(xiàng)必須設(shè)置在模式參量中。open()調(diào)用返回一個(gè)文件描述符(描述新目錄)。這個(gè)文件描述符用于只讀,當(dāng)不再需要時(shí)關(guān)閉這個(gè)描述符。 使用以上兩種方法的任意一種方法創(chuàng)建目錄,新目錄名必須被指明。這個(gè)名字可以是一個(gè)全稱(chēng)路徑名,或是一個(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è)字符;詳情見(jiàn)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)開(kāi)始簇的數(shù)目。通過(guò)搜索fat找后來(lái)的簇 文件大小 文件的大小,對(duì)描述子目錄的條目來(lái)說(shuō)這個(gè)域通常為零。 讀目錄條目 在dosfs卷上的目錄可以使用opendir(),readdir(),rewinddir(),和closedir()程序來(lái)搜索。這些調(diào)用可以用來(lái)確定文件名和子目錄。 使用fstat()或stat()函數(shù)可以獲得有關(guān)指定文件更詳細(xì)的信息。連同標(biāo)準(zhǔn)文件信息,被這些程序使用的結(jié)構(gòu)還從目錄條目返回文件屬性字節(jié)。 文件屬性 在dosfs目錄條目中的文件屬性字節(jié)由一組標(biāo)記位組成,每位標(biāo)志一個(gè)特殊的文件特征。文件屬性字節(jié)描述的特征見(jiàn)下表。 表:文件屬性字節(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è)文件被打開(kāi)為o_wronly或o_rdwr時(shí),dos_attr_rdonly被選中。如果標(biāo)記設(shè)置了,open()返回error,并且設(shè)置errnos為_(kāi)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用來(lái)說(shuō)明一個(gè)包含磁盤(pán)的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)用期間任何打開(kāi)到此卷的文件描述符都可以使用。 目錄標(biāo)記dos_attr_directory用來(lái)指出這個(gè)條目不是一個(gè)正規(guī)的文件而是一個(gè)子目錄。 存檔標(biāo)記dos_attr_archive在文件被創(chuàng)建或修改時(shí)被設(shè)置。這個(gè)標(biāo)記被其他搜索卷的程序(尋找修改過(guò)的文件并選擇存檔)使用。這樣的程序必須清除存檔標(biāo)記,因?yàn)関xworks不做這個(gè)工作 。 屬性字節(jié)中的所有標(biāo)記(除了目錄和卷標(biāo)標(biāo)記)可以使用ioctl()函數(shù)filoattribset設(shè)置或清除。這個(gè)函數(shù)調(diào)用在指定文件打開(kāi)后改變其屬性。在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庫(kù)在內(nèi)在結(jié)構(gòu)中維持日期和時(shí)間。然而通常沒(méi)有一個(gè)裝置來(lái)自動(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)用這些程序來(lái)更新日期和時(shí)間的值。 第二種方法要求一個(gè)用戶(hù)支持的鉤子程序。如果使用dosfsdatetimeinstall()安裝了時(shí)間和日期的鉤子程序,只要dosfslib要求獲取當(dāng)前日期和時(shí)間,程序就被調(diào)用。這樣可以利用可被讀取硬件日歷時(shí)鐘來(lái)獲取當(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中。接下來(lái),鉤子程序用當(dāng)前正確的時(shí)間和日期填充結(jié)構(gòu)。結(jié)構(gòu)中沒(méi)有發(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)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 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文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- vxWorks 文件系統(tǒng) 詳細(xì) 介紹
鏈接地址:http://m.zhongcaozhi.com.cn/p-6620149.html