码迷,mamicode.com
首页 > 其他好文 > 详细

SylixOS 下的IO系统调用

时间:2018-09-26 23:56:38      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:eve   重要   handle   operation   操作   make   两种   技术分享   允许   

  • SylixOS标准I/O基本介绍
    1.1 简介
    I/O 系统又称作输入输出系统,SylixOS 兼容POSIX标准输入输出系统,SylixOS的I/O概念继承了UNIX操作系统的I/O概念,认为一切皆为文件。与UNIX操作系统相同, SylixOS中的文件也分为不同的类型。
    1.2 两种I/O类型
    I/O系统分为 ORIG 型驱动结构和 NEW_1 型驱动结构,如图 1.1和图 1.2。

    技术分享图片
    图 1.1 ORIG 型驱动结构
    技术分享图片
    图 1.2 NEW 型驱动结构

  • 重要的数据结构
    文件描述符表:
    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; / 设备头管理链表 /
    UIN×××6 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调用过程

    SylixOS 下的IO系统调用

    标签:eve   重要   handle   operation   操作   make   两种   技术分享   允许   

    原文地址:http://blog.51cto.com/13927802/2286141

    (0)
    (0)
       
    举报
    评论 一句话评论(0
    登录后才能评论!
    © 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
    迷上了代码!