I/O 系統又稱做輸入輸出系統,SylixOS 兼容POSIX標準輸入輸出系統,SylixOS的I/O概念繼承了UNIX操做系統的I/O概念,認爲一切皆爲文件。與UNIX操做系統相同, SylixOS中的文件也分爲不一樣的類型。node
I/O系統分爲 ORIG 型驅動結構和 NEW_1 型驅動結構,如圖 1.1和圖 1.2。ios
圖 1.1 ORIG 型驅動結構數組
圖 1.2 NEW 型驅動結構數據結構
文件描述符表:函數
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; |
系統設備註冊流程如圖 3.1:
圖 3.1 系統設備建立過程
文件I/O系統 open函數流程如圖 3.2:
圖 3.2 標準open調用過程