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