SylixOS塊設備模型

 

1. 塊設備簡介

塊設備是I/O設備中的一類,是將信息存儲在固定大小的塊中,每一個塊有本身的地址,數據塊大小一般在512字節到32768字節之間。塊設備的基本特徵是每一個塊都能獨立於其餘塊而讀寫。磁盤是最多見的塊設備。函數

2. 技術實現

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

2.1. LW_BLK_DEV模式

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)

2.2. LOCK設備文件模式

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 目錄內。

3. 參考資料

相關文章
相關標籤/搜索