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调用过程