SylixOS 下的IO系统调用

  1. SylixOS标准I/O基本介绍
    1. 简介

I/O 系统又称作输入输出系统,SylixOS 兼容POSIX标准输入输出系统,SylixOS的I/O概念继承了UNIX操作系统的I/O概念,认为一切皆为文件。与UNIX操作系统相同, SylixOS中的文件也分为不同的类型。

    1. 两种I/O类型

I/O系统分为 ORIG 型驱动结构和 NEW_1 型驱动结构,如图 1.1和图 1.2。

1.1 ORIG 型驱动结构

图 1.2 NEW 型驱动结构

  1. 重要的数据结构

文件描述符表:

typedef struct {

    PLW_FD_ENTRY   FDDESC_pfdentry;                /*  文件结构               */

    BOOL             FDDESC_bCloExec;               /*  FD_CLOEXEC          */

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值