sylixos与harmonyOS,SylixOS 下的IO系统调用

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。

209f68064d3ffc99c714892b4cd9bdc1.png

图 1.1 ORIG 型驱动结构

0d3b9203b5a6cfe519ef53499e729730.png

图 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;

基本流程

系统设备注册流程如图 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进行管理;

82f0b665886d3042674cb08358bad733.png

图 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();

b4be2a40c78737b995032afbfbf831d7.png

图 3.2 标准open调用过程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值