I/O 系统又称作输入输出系统, SylixOS兼容POSIX标准输入输出系统,SylixOS的I/O概念继承了UNIX操作系统的I/O概念,认为一切皆为文件。与UNIX操作系统相同, SylixOS中的文件也分为不同的类型。
SylixOS的I/O系统结构,分为ORIG驱动结构和NEW_1驱动结构。NEW_1驱动结构就是在ORIG驱动结构基础上增加了设备节点结构,其负责文件访问权限、文件记录锁等功能。图1.1为两种驱动结构的对比图。
图1.1 ORIG驱动结构和NEW_1驱动结构对比图
程序清单2.1 文件节点
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; typedef LW_FD_NODE *PLW_FD_NODE; |
程序清单2.2 文件结构结构体
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 LW_FD_ENTRY *PLW_FD_ENTRY; |
程序清单2.3 文件描述符
typedef struct { PLW_FD_ENTRY FDDESC_pfdentry; /* 文件结构 */ BOOL FDDESC_bCloExec; /* FD_CLOEXEC */ ULONG FDDESC_ulRef; /* 对应文件描述符的引用计数 */ } LW_FD_DESC; typedef LW_FD_DESC *PLW_FD_DESC; |
- _IoOpen函数流程:
图3.1 _IoOpen函数
- 获取完整文件名流程:
图3.2 获取完整文件名流程
- 申请文件描述符的大概流程:
图3.3 申请文件描述符流程