閱讀866 返回首頁    go 阿裏雲 go 技術社區[雲棲]


vxWorks下dosFs文件係統的創建

  文件係統,是指操作係統根據目錄和文件的組織形式在磁盤設備上應用的一種設備驅動,不同的文件係統對目錄和文件有不同的限製(如目錄名限製,文件大小限製等)。

VxWorks支持多種文件係統,比較重要的有:

1、dosFs:適用於塊存取設備(比如硬盤、軟盤),和MS-DOS文件係統兼容;

2、rawFs:提供了一種簡單的原始文件係統。該文件係統將整個硬盤當作一個單獨的大文件;

3、cdromFs:允許係統從按照ISO9660標準文件係統格式化的CD-ROM上讀取設備;

    通常文件係統驅動位於磁盤(塊存取)設備驅動和IO係統之間,這一點在VxWorks中也不例外,但它在此基礎上擴充了功能,即在文件係統下方增加了一個CBIO(Core Blocked IO)接口,在CBIO下方才是塊存取設備驅動,其示意圖如下:
 


圖1 VxWorks I/O係統層次圖

而CBIO接口部分又細分為4個邏輯子層,每個邏輯層都有與創建文件係統相關的函數,將CBIO接口部分細分後,包含各子層相關操作函數的VxWorks文件係統示意圖如下:

圖2 CBIO層內部結構層次圖

圖中線框中的四層就是CBIO接口層裏的子層,對內核配置了dosFs支持的VxWorks來說,對磁盤的管理是從BLK_DEV API設備驅動子層上開始的,不同子層上的函數創建出的CBIO句柄分屬不同的層,下層的CBIO句柄即為上層CBIO句柄的附屬CBIO句柄,也就是說它們雖然都是CBIO_DEV_ID類型,但根據產生它們的函數所在的層把它們按等級劃分,一個CBIO緩衝區可以在每個子層上都有一個CBIO句柄,也可以在部分子層上有CBIO句柄。CBIO緩衝區在基本CBIO to BLK_DEV設備子層上就沒有句柄。圖右側函數間的箭頭指示了各子層間句柄的關係。此外,從圖中可以看出,頭文件也是根據層的劃分來組織的,這樣使得函數調用層次清晰。

 

在磁盤上建立dosFs文件係統

以運行在摩托羅拉公司的PPC860 CPU上的VxWorks為例,在配置VxWorks內核時添加IDE/ATA磁盤設備驅動,在係統啟動後,係統就和磁盤相連,係統啟動後會發現磁盤(執行指令:devs,列出的設備中有一個/ata0a),此時該設備尚無法訪問(就像剛出廠的硬盤用啟動盤引導後能發現卻不能使用一樣,在dos下需要用fdisk工區來創建分區,格式化後才能使用),而在VxWorks下,係統也提供了類似的操作(如圖2)。

在創建文件係統之前,應通過在內核中包含dosFs組件來初始化dosFs文件係統,即讓係統加載文件係統驅動,允許係統在塊設備上創建文件係統設備。

至此,係統啟動後,用戶直接麵向的已經是BLK_DEVAPI設備驅動子層了,所有的操作都是從該層上方開始的。為了在磁盤上上創建分區、格式化並使用它,應進行以下操作:

2.1創建塊存取設備:

對於磁盤設備,使用ataDevCreate()函數在BLK_DEV API設備驅動子層上創建一個指向塊存取設備的指針pAta:

BLK_DEV * ataDevCreate(int ctrl,intdrive,int nBlocks,int blkOffset)

 

參數1表示磁盤設備控製器號,0表示primary,

參數2表示磁盤設備驅動器號,0表示master,

參數3表示驅動器設備上的塊數量,0表示使用整個磁盤,

 

參數4表示從驅動器開始處偏移的塊數量,0表示從頭開始。

函數為指定的ATA/IDE磁盤或ATAPI CDROM創建一個設備,返回一個指向塊設備結構(BLK_DEV)的指針,圖2中在此處用pAta=ataDevCreate(0,0,0,0)創建一個指向塊設備的指針pAta,該設備對應磁盤primary master,並且使用整個磁盤的從頭開始的所有塊。(不要混淆設備和磁盤,可以把磁盤的一部分創建為一個設備,即一個設備對應於一個磁盤和該磁盤裏的塊,而磁盤由控製器號和驅動器號唯一指定)

2.2 創建磁盤高速緩衝區:

該步驟是可選的。通過調用dcacheDevCreate()函數為一個塊設備創建磁盤高速緩衝區並在CBIO to CBIO設備(dcacheCbio)子層上生成CBIO句柄。用法如下:

     CBIO_DEV_ID dcacheDevCreate(CBIO_DEV_ID subDev,char *pRamAddr,int memSize,char*pDesc)

 

參數1表示一個CBIO句柄,該句柄作為返回的CBIO to CBIO設備(dcacheCbio)子層的CBIO句柄的附屬CBIO句柄,該附屬句柄由函數CBIO_DEV_ID cbioWrapBlkDev(BLK_DEV *)在基本CBIO to BLK_DEV設備(cbioLib)子層上生成。也可以使用塊設備,當使用塊設備時,實際上是將塊設備轉換成在基本CBIO to BLK_DEV設備(cbioLib)子層上的CBIO句柄後作為參數的;

 

參數2表示該CBIO高速緩衝區在內存中的位置;

 

參數3表示為該CBIO高速緩衝區使用多少內存;

參數4表示設備描述字符串。

函數創建一個CBIO層磁盤高速緩衝區實例,並在CBIO to CBIO設備(dcacheCbio)子層生成CBIO句柄,當參數2為NULL時,參數3使用所有內存緩衝磁盤數據,當參數2為0時,參數3使用一個默認內存大小緩衝磁盤數據。參數4為設備描述字符串,會在dcacheShow執行時作為結果的一部分輸出。當需要多個高速緩衝區時很需要(支持16個高速緩衝區)。

當內存容量小於指定緩衝區大小時創建失敗。

圖2中此處用cbio=dcacheDevCreate(pAta,0,0,“cache1”)為塊設備pAta創建默認大小的高速緩衝區cbio,同時cbio也是該緩衝區在CBIOto CBIO設備(dcacheCbio)子層上的CBIO句柄。這裏用塊設備作為參數1比較直觀。並描述為“cache1”。也可以先使用bcbio=cbioWrapBlkDev(pAta),再使用cbio=dcacheDevCreate(bcbio,0,0,“cache1”),此時bcbio為cbio的附屬句柄。

2.3 創建和安裝磁盤分區:

通過調用usrFdiskPartCreate()在磁盤上創建分區表,然後通過調用dpartDevCreate()初始化一個分區的磁盤,並在CBIO to CBIO設備(dpartCbio)子層上創建CBIO句柄。如下:

STATUSusrFdiskPartCreate(CBIO_DEV_ID cDev,int nPart,int size1,int size2,int size3)

參數1表示一個CBIO句柄,分區表將在這個代表整個磁盤的句柄對應的塊設備上創建,注意這裏不是subDev,而是cDev,表示不要用附屬CBIO句柄bcbio,而應使用cbio;

參數2表示要創建的分區數,默認為1,最大為4;

參數3表示第2個分區所占用的空間百分比;

參數4表示第3個分區所占用的空間百分比;

參數5表示第4個分區所占用的空間百分比;

該程序用來創建基本分區表,即對磁盤分區,隻能用來創建一個主分區表,即MBR,不能用於創建啟動或擴展分區。返回一個指示操作成功與否的狀態值。這時磁盤隻有分區表,還沒有安裝分區,可以用usrFdiskPartShow()顯示創建的分區。

 

圖2中此處用usrFdiskPartCreate(cbio,2,50,0,0)在cbio對應的塊設備上創建兩個分區,各占磁盤一半空間。

創建磁盤分區的操作函數dpartDevCreate()用法如下:

CBIO_DEV_ID dpartDevCreate(CBIO_DEV_IDsubDev,int nPart,FUNCPTR pPartDecodeFunc)

 

參數1表示一個附屬CBIO句柄,即存在於下麵子層上的cbio;

 

參數2表示分區數量,

參數3表示能解釋分區表的函數。

為了處理一個已分區的磁盤,即在磁盤上安裝分區,需要使用該函數,推薦為了操作的高效,為整個磁盤創建一個高速緩衝區並在各分區間共享該高速緩衝區。nPart參數表示特定磁盤驅動器上最大的分區數,可支持最多24個。

分區表解釋程序:應該實現的功能是將已分區設備的分區信息解釋成特定格式的結果,並將結果寫入一個特定類型的表中。

圖2中此處通過調用cbio1=dpartDevCreate(cbio,2,usrFdiskPartRead)通過讓usrFdiskPartRead程序解釋cbio對應塊設備的分區表來初始化分區的磁盤。usrFdiskPartRead程序是係統提供的解釋分區表信息的程序,可直接調用。至此分區操作完成,在創建文件係統和格式化分區後即可使用分區了。注意程序返回的cbio1雖然和cbio類型相同,注意生成的句柄cbio1位於CBIO to CBIO設備(dpartCbio)子層上。

2.4 創建dosFs文件係統:

文件係統在VxWorks中也被看作一個設備,通過調用函數dosFsDevCreate()來在指定分區上創建dosFs文件係統。dosFsDevCreate()函數用法為:

STATUS dosFsDevCreate(char*pDevName,CBIO_DEV_ID cbio,u_int maxFiles,u_int autoChkLevel)

 

參數1表示創建文件係統後,對應分區的卷名,格式為“/卷名”;

 

參數2表示特定分區的CBIO句柄,對本例,即用dpartPartGet(cbio1,0)或dpartPartGet(cbio1,1)返回的句柄,dpartPartGet要求使用位於CBIO to CBIO設備(dpartCbio)子層上的CBIO句柄,並把它定義為dosFs卷;

參數3表示在設備上能同時打開的文件數;

參數4表示是否在掛載卷時自動進行卷的完整性檢測。

該函數在一個特定CBIO句柄對應的分區上創建dosFs文件係統,定義每個磁盤卷的信息並將它們添加到I/O係統中。圖中此處用dosFsDevCreate(“/DOSA”,dpartPartGet(cbio1,

0),16,0)在第一個分區(dpartParGet中的參數0)安裝文件係統,卷名為/DOSA,並在掛載時自動進行完整性檢測。

2.5 格式化磁盤卷

    使用dosFsVolFormat()函數將磁盤卷按dos格式格式化。該步驟隻能在磁盤卷第一次初始化時執行一次。如果DOS格式的磁盤卷已經被格式化,可以跳過此步。

    dosFsVolFormat()的函數用法為:

STATUS dosFsVolFormat(void *device,intopt,FUNCPTR pPromptFunc)

 

     參數1表示要執行格式化操作的卷名;

     參數2表示格式化的選項,是比特映射,即選項的組合,0表示使用默認選項。參考幫助;

     參數3表示一個函數,該函數可以提示用戶在格式化前改變卷的參數,0表示無函數;

函數返回格式化成功與否的狀態值。圖2中此處用dosFsVolFormat(“/DOSA”,0,0)將卷/DOSA格式化。

格式化後就可以使用了,可以用ll“/DOSA”掛載卷,此時可執行完整性檢測,用dosFsShow “/DOSA”顯示卷信息。

執行->devs會發現有/DOSA卷,執行->cd “/DOSA”將當前工作目錄切換到該卷上,執行mkdir 目錄名,在該卷上創建一個相應的目錄。執行rm 目錄名,即可刪除相應目錄。

有些函數裏的CBIO句柄參數可以用BLK_DEV變量代替,此時係統會自動進行轉換工作。

       至此,磁盤設備上的文件係統創建完畢,用戶可以直接訪問磁盤並進行相關操作。

最後更新:2017-04-03 05:39:42

  上一篇:go 8月12日阿裏雲服務升級公告
  下一篇:go js遍曆 子節點 子元素