塊設備是I/O設備中的一類,是將信息存儲在固定大小的塊中,每一個塊有本身的地址,數據塊大小一般在512字節到32768字節之間。塊設備的基本特徵是每一個塊都能獨立於其餘塊而讀寫。磁盤是最多見的塊設備。函數
SylixOS實現了兼容POSIX標準的輸入輸出系統,SylixOS的I/O概念繼承了UNIX操做系統的概念,認爲一切皆爲文件。本章介紹SylixOS在I/O層之下提供的塊設備模型,用戶驅動可使用此標準化的設備模型來編寫,這樣能夠對上層提供統一的、標準的設備API,方便應用程序移植。塊設備驅動相關信息位於"libsylixos/SylixOS/system/device/block"下。工具
SylixOS內部提供了多種標準的文件系統,方便用戶使用,它實際上就是一組虛擬的設備驅動,提供兩組API接口,對上符合I/O系統虛擬文件系統(VFS)標準,對下要求設備符合塊設備標準。帶有磁盤緩衝器和分區處理工具的SylixOS塊設備結構如圖 21所示。 ui
圖 21 SylixOS塊設備結構this
SylixOS存在兩種塊設備驅動模型,即LW_BLK_DEV模型和LW_BLK_RAW模型,對應着兩種文件系統的裝載方式,即LW_BLK_DEV模式和BLOCK設備文件模式,用戶能夠根據自身系統的特色靈活選擇。spa
LW_BLK_DEV模式是操做系統的默認掛載模式,如圖 22所示。操作系統
圖 22 LW_BLK_DEV模式繼承
LW_BLK_DEV總體與I/O系統無關,僅是一個文件系統設備操做的實體,對於用戶應用程序不可見, 相似於不少嵌入式第三方文件系統軟件提供的方式。此方式更加適合於嵌入式系統,推薦使用此方式。接口
其塊設備驅動建立函數原型如程序清單 21所示。rem
程序清單 21 LW_BLK_DEV模式塊設備驅動建立原型
INT __blockIoDevCreate (PLW_BLK_DEV pblkdNew)
函數__blockIoDevCreate在驅動層建立了一個塊設備驅動,使用結構體LW_BLK_DEV向內核提供操做函數集和基本信息,其詳細描述如程序清單 22所示。
程序清單 22 LW_BLK_DEV結構體
typedef struct { PCHAR BLKD_pcName; /* 能夠爲 NULL 或者 "\0" */ /* nfs romfs 文件系統使用 */ FUNCPTR BLKD_pfuncBlkRd; /* function to read blocks */ FUNCPTR BLKD_pfuncBlkWrt; /* function to write blocks */ FUNCPTR BLKD_pfuncBlkIoctl; /* function to ioctl device */ FUNCPTR BLKD_pfuncBlkReset; /* function to reset device */ FUNCPTR BLKD_pfuncBlkStatusChk; /* function to check status */ ULONG BLKD_ulNSector; /* number of sectors */ ULONG BLKD_ulBytesPerSector; /* bytes per sector */ ULONG BLKD_ulBytesPerBlock; /* bytes per block */ BOOL BLKD_bRemovable; /* removable medium flag */ BOOL BLKD_bDiskChange; /* media change flag */ INT BLKD_iRetry; /* retry count for I/O errors */ INT BLKD_iFlag; /* O_RDONLY or O_RDWR */ /* * 如下參數操做系統使用, 必須初始化爲 0. */ INT BLKD_iLogic; /* if this is a logic disk */ UINT BLKD_uiLinkCounter; /* must be 0 */ PVOID BLKD_pvLink; /* must be NULL */ UINT BLKD_uiPowerCounter; /* must be 0 */ UINT BLKD_uiInitCounter; /* must be 0 */ } LW_BLK_DEV; typedef LW_BLK_DEV BLK_DEV; typedef LW_BLK_DEV *PLW_BLK_DEV; typedef LW_BLK_DEV *BLK_DEV_ID;
BLKD_iRetry 至少爲 1;
BLKD_ulNSector 爲 0 時,系統將經過 BLKD_pfuncBlkIoctl 函數獲取;
BLKD_ulBytesPerBlock 爲 0 時,系統將經過 BLKD_pfuncBlkIoctl 函數獲取;
BLKD_ulBytesPerSector 最小爲 512 必須爲 2 的 n 次方 (FAT 扇區最大支持 4096 字節);
BLKD_pfuncBlkReset fatFsDevCreate函數將會掛載設備, 同時爲設備通電, 然 後當即調用此函數復位設備。當一個塊設備存在多個分區時, 每次掛載不一樣分區時都會調用此函數;
BLKD_bRemovable 是不是可移動設備;
BLKD_bDiskChange 磁盤介質是否發生改變(初始化時必須爲 FALSE, 當 磁盤發生改變時, 將沒法再次操做必須從新創建卷);
BLKD_iFlag O_RDONLY 表示磁盤寫保護;
BLKD_iLogic 是否爲邏輯磁盤, 用戶驅動程序只要將其設置爲 0 便可;
BLKD_iLinkCounter 物理設備驅動相關字段, 初始化時必須爲 0;
BLKD_pvLink 物理設備驅動相關字段, 初始化時必須爲 NULL;
BLKD_uiPowerCounter 電源控制計數器, 初始化時必須爲 0;
BLKD_uiInitCounter 磁盤初始化計數器, 初始化時必須爲 0;
LW_BLK_DEV模式下除了提供塊設備驅動建立函數,SylixOS還提供了一系列相關操做函數,如初始化、刪除、讀寫、復位、控制塊設備及獲取塊設備狀態等,如程序清單 23所示。
程序清單 23 LW_BLK_DEV模式操做函數
VOID __blockIoDevInit (VOID) VOID __blockIoDevDelete (INT iIndex) PLW_BLK_DEV __blockIoDevGet (INT iIndex) INT __blockIoDevRead (INT iIndex, VOID *pvBuffer, ULONG ulStartSector, ULONG ulSectorCount) INT __blockIoDevWrite (INT iIndex, VOID *pvBuffer, ULONG ulStartSector, ULONG ulSectorCount) INT __blockIoDevIoctl (INT iIndex, INT iCmd, LONG lArg) INT __blockIoDevReset (INT iIndex) INT __blockIoDevStatus (INT iIndex) INT __blockIoDevIsLogic (INT iIndex) INT __blockIoDevFlag (INT iIndex)
BLOCK設備文件模式是SylixOS可選擇的文件系統掛載方式,對應着LW_BLK_RAW模型,如圖 23所示。
圖 23 BLOCK設備文件模式
LW_BLK_RAW 是存在於 I/O 系統中的一個設備, 用戶能夠經過 I/O 系統直接訪問此設備, 對於用戶來講是可見的設備。使用 mount 將此設備掛接文件系統後, 文件系統將經過 I/O 操做此設備,此方法相似於 Linux 等大型操做系統提供的方法。例如插入一個U盤, 若是驅動程序註冊爲 Blk Raw I/O ,則 I/O 系統中會出現一個 /dev/blk/xxx 的設備,以後經過 mount 指令將其掛載入文件系統操做,如mount -t vfat /dev/blk/xxx /mnt/udisk。用戶操做dev/blk/xxx 等於繞過文件系統直接操做物理設備。用戶操做 /mnt/udisk表示使用文件系統操做物理設備。此操做類型須要LW_CFG_MOUNT與LW_CFG_SHELL_EN支持。
建立BLK RAW設備驅動的函數原型如程序清單 24。
程序清單 24建立BLK RAW設備驅動
INT API_BlkRawCreate(CPCHAR pcBlkName, BOOL bRdOnly, BOOL bLogic, PLW_BLK_RAW pblkraw);
pcBlkName 塊設備名稱;
bRdonly 只讀;
bLogic 是否爲邏輯分區;
pblkraw 建立的blk raw控制塊;
函數API_BlkRawCreate經過/dev/blk/xxx塊設備生成一個BLOCK控制塊,該函數只能內核程序調用,使用結構體LW_BLK_RAW向內核提供操做函數集和基本信息,其詳細描述如程序清單 25所示。
程序清單 25 LW_BLK_RAW結構體
typedef struct { LW_BLK_DEV BLKRAW_blkd; INT BLKRAW_iFd; mode_t BLKRAW_mode; } LW_BLK_RAW; typedef LW_BLK_RAW *PLW_BLK_RAW;
BLKRAW_blkd 塊設備;
BLKRAW_iFd 塊設備的文件描述符;
BLKRAW_mode 塊設備打開模式;
推薦使用第一種方法簡單可靠, 直接使用 oemDiskMount/oemDiskMountEx 便可, oemDiskMount 函數會自動建立 blk設備文件在 /dev/blk 目錄內。
無