SylixOS 下的IO系統調用

  1. SylixOS標準I/O基本介紹
    1. 簡介

I/O 系統又稱做輸入輸出系統,SylixOS 兼容POSIX標準輸入輸出系統,SylixOS的I/O概念繼承了UNIX操做系統的I/O概念,認爲一切皆爲文件。與UNIX操做系統相同, SylixOS中的文件也分爲不一樣的類型。node

    1. 兩種I/O類型

I/O系統分爲 ORIG 型驅動結構和 NEW_1 型驅動結構,如圖 1.1和圖 1.2。ios

圖 1.1 ORIG 型驅動結構數組

圖 1.2 NEW 型驅動結構數據結構

  1. 重要的數據結構

文件描述符表:函數

typedef struct {ui

    PLW_FD_ENTRY   FDDESC_pfdentry;                /*  文件結構               */atom

    BOOL             FDDESC_bCloExec;               /*  FD_CLOEXEC          */spa

    ULONG           FDDESC_ulRef;                  /* 對應文件描述符的引用計數*/操作系統

} LW_FD_DESC;指針

文件結構結構體:

typedef struct {

    PLW_DEV_HDR  FDENTRY_pdevhdrHdr;              /*  設備頭                 */

    PCHAR         FDENTRY_pcName;                 /*  文件名                 */

    PCHAR         FDENTRY_pcRealName;             /* 去除符號連接的真實文件名 */

    LW_LIST_LINE  FDENTRY_lineManage;              /*  文件控制信息遍歷表    */

#define FDENTRY_pfdnode        FDENTRY_lValue

    LONG          FDENTRY_lValue;                 /*  驅動程序內部數據         */

                                        /*  若是爲 NEW_1 驅動fd_node*/

    INT            FDENTRY_iType;                   /*  文件類型 (根據驅動判斷)  */

    INT            FDENTRY_iFlag;                   /*  文件屬性                */

    INT            FDENTRY_iAbnormity;              /*  文件異常                */

    ULONG        FDENTRY_ulCounter;               /*  總引用計數器             */

    off_t            FDENTRY_oftPtr;                  /*  文件當前指針            */

                                                /*  只有 NEW_1 或更高級驅動使用 */

    BOOL          FDENTRY_bRemoveReq;            /*  刪除請求                */

} LW_FD_ENTRY;

 

文件節點:

typedef struct {

    LW_LIST_LINE     FDNODE_lineManage;              /*  同一設備 fd_node 鏈表*/

    LW_OBJECT_HANDLE    FDNODE_ulSem;             /*  內部操做鎖          */

    dev_t                    FDNODE_dev;               /*  設備                */

    ino64_t                  FDNODE_inode64;            /* inode (64bit 爲了兼容性) */

    mode_t                  FDNODE_mode;              /*  文件 mode            */

    uid_t                    FDNODE_uid;                /*  文件所屬用戶信息     */

    gid_t                    FDNODE_gid;

    off_t                    FDNODE_oftSize;             /*  當前文件大小         */

    struct  __fd_lockf        *FDNODE_pfdlockHead;        /*  第一個鎖             */

LW_LIST_LINE_HEADER  FDNODE_plineBlockQ;

/*  當前有阻塞的記錄鎖隊列      */

    BOOL             FDNODE_bRemove;             /*是否在文件未關閉時有 unlink */

                        

    ULONG           FDNODE_ulLock;               /*鎖定, 不容許寫, 不容許刪除  */

        ULONG           FDNODE_ulRef;               /*  fd_entry 引用此 fd_node 數量*/

PVOID            FDNODE_pvFile;              /*  驅動使用此變量標示文件    */

 PVOID            FDNODE_pvFsExtern;          /*  文件系統擴展使用          */

} LW_FD_NODE;

 

rootfs 節點:

typedef struct lw_rootfs_node {

    LW_LIST_LINE      RFSN_lineBrother;       /*  兄弟節點        */

    struct lw_rootfs_node  *RFSN_prfsnFather;      /*  父系節點         */

    PLW_LIST_LINE    RFSN_plineSon;          /* 兒子節點         */

    INT                RFSN_iOpenNum;        /*  打開次數        */        

    size_t              RFSN_stAllocSize;    /*  此節點佔用內存大小  */        

    mode_t             RFSN_mode;            /*  模式             */        

    time_t              RFSN_time;             /*  建立時間         */      

    INT                RFSN_iNodeType;       /*  節點類型         */      

    uid_t               RFSN_uid;

    gid_t               RFSN_gid;

    LW_ROOTFS_NODE_VALUE         RFSN_rfsnv;                            /*  節點的內容                  */

    PCHAR            RFSN_pcLink;     /*  連接目標 (不是連接文件爲 0) */

} LW_ROOTFS_NODE;

 

設備頭:

typedef struct {

    LW_LIST_LINE  DEVHDR_lineManage;                 /*  設備頭管理鏈表       */

    UINT16         DEVHDR_usDrvNum;                 /*  設備驅動程序索引號    */

    PCHAR         DEVHDR_pcName;                   /*  設備名稱              */

    UCHAR         DEVHDR_ucType;                   /*  設備 dirent d_type       */

    atomic_t         DEVHDR_atomicOpenNum;           /*  打開的次數             */

    PVOID          DEVHDR_pvReserve;                /*  保留                   */

} LW_DEV_HDR;

  1. 基本流程

系統設備註冊流程如圖 3.1:

  1. struct file_operations  fileop,設備文件操做控制塊,先對 fileop成員函數賦值,調用iosDrvInstallEx2(&fileop,設備類型),將返回「驅動程序索引號」。
  2. API_IosDrvInstallEx2(struct file_operations  *pfileop, INT  iType),搜索全局 _S_deventryTbl(默認64)表,查找未使用的驅動程序控制塊,返回該數組下標,關聯設備文件操做控制塊函數。
  3. 設備建立,API_IosDevAddEx(PLW_DEV_HDR  pdevhdrHdr, CPCHAR  pcDevName, INT  iDrvNum, UCHAR ucType),將API_IosDrvInstallEx2所產生的驅動索引號與具體的設備頭關聯,建立新的文件系統節點rootFsMakeDev,最後將該設備添加進設備管理鏈表_S_plineDevHdrHeader進行管理;

圖 3.1 系統設備建立過程

文件I/O系統 open函數流程如圖 3.2:

  1. Open函數實際上調用_IoOpen,_IoOpen 先檢查文件名的合法性;
  2. 調用ioFullFileNameGet()函數,經過 cpcName 查找到設備註冊到文件系統中的節點,返回該節點對應的驅動設備頭;
  3. 而後經過獲取的設備頭和設備名調用iosFdNew()建立新的文件結構並鏈入到全局文件結構頭表中_S_plineFileEntryHeader;
  4. 從全局文件描述符表數組中_G_fddescTbl查找到未使用的最小文件描述符表,返回該數組下表做爲文件描述符,將該文件描述表關聯上新建立的文件結構,將新建立的文件結構關聯上設備頭;
  5. 調用iosOpen(),從獲取到的設備頭中獲取對應設備的設備驅動程序索引號,並經過該索引號從全局驅動表中查找到對應的設備open函數,使用該函數,若是是NEW_1型驅動將返回對應的文件節點;
  6. 將調用驅動open函數返回的驅動內部數據關聯上文件結構,使用函數iosFdSet();

圖 3.2 標準open調用過程

相關文章
相關標籤/搜索