SylixOS 虚拟设备文件浅析

目录

1.虚拟设备文件概述    1

2.虚拟设备文件eventfd    1

2.1    虚拟设备文件eventfd概述    1

2.2    打开虚拟设备文件eventfd    1

2.3    读取事件文件    3

2.4    写事件文件    3

3.参考文献    4

  1. 虚拟设备文件概述

    Linux内核自2.6.22版本开始逐步增加了三个虚拟设备文件:eventfd、timerfd、signalfd。这三个文件让应用程序可以通过标准I/O操作的方式代替传统调用API的方式来使用事件(信号量)、定时器和信号资源,这带来的最大好处是应用程序可以通过使用select(或poll、epoll)同时监听多个此类文件(或此类文件与其他文件),将对多个事件的异步并行处理方便地转化为同步串行处理,这在许多应用中非常有用。SylixOS完全兼容这三个虚拟设备文件,并且增加了一个hstimerfd,用于高精度定时器。

  2. 虚拟设备文件eventfd

  3. 虚拟设备文件eventfd概述

    SylixOS中的虚拟设备文件eventfd主要用于线程间的事件通信,其本质上是内核为应用程序提供的信号量。它与POSIX信号量相比的优势是,eventfd在内核中是以文件形式存在的,可用于select/epoll/poll循环中,因此可以实现异步的信号量,避免了消费者在资源不可用时的阻塞。

    event表示它可用来作事件通知(异步),fd表示它是一个"文件"。

  4. 打开虚拟设备文件eventfd

    如果用户想要使用eventfd的相关API函数,需要满足如下条件:

    1.当前允许使用系统的设备管理功能(LW_CFG_DEVICE_EN的参数值大于零);

    2.已在系统中加入eventfd功能模块(LW_CFG_EVENTFD_EN的参数值大于零);

    3.调用函数API_EventfdDrvInstall安装eventfd设备驱动程序,具体实现如程序清单 21所示;

    程序清单 21安装设备驱动


    LW_API

    INTAPI_EventfdDrvInstall (VOID)

    {

    if (_G_iEvtfdDrvNum <= 0) {

    _G_iEvtfdDrvNum =iosDrvInstall(LW_NULL,

    LW_NULL,

    _evtfdOpen,

    _evtfdClose,

    _evtfdRead,

    _evtfdWrite,

    _evtfdIoctl);

    DRIVER_LICENSE(_G_iEvtfdDrvNum,"GPL->Ver 2.0");

    DRIVER_AUTHOR(_G_iEvtfdDrvNum,"Han.hui");

    DRIVER_DESCRIPTION(_G_iEvtfdDrvNum,"eventfd driver.");

    }

    if (_G_hEvtfdSelMutex ==LW_OBJECT_HANDLE_INVALID) {

    _G_hEvtfdSelMutex =API_SemaphoreMCreate("evtfdsel_lock",LW_PRIO_DEF_CEILING,

    LW_OPTION_WAIT_PRIORITY |LW_OPTION_DELETE_SAFE |

    LW_OPTION_INHERIT_PRIORITY |LW_OPTION_OBJECT_GLOBAL,

    LW_NULL);

    }

    return ((_G_iEvtfdDrvNum == (PX_ERROR)) ? (PX_ERROR) : (ERROR_NONE));

    }

    4.调用函数API_EventfdDevCreate安装eventfd设备,具体实现如程序清单 22所示。

    程序清单 22安装设备


    LW_API

    INTAPI_EventfdDevCreate (VOID)

    {

    if (_G_iEvtfdDrvNum <= 0) {

    _DebugHandle(__ERRORMESSAGE_LEVEL,"no driver.\r\n");

    _ErrorHandle(ERROR_IO_NO_DRIVER);

    return (PX_ERROR);

    }

    if (iosDevAddEx(&_G_evtfddev.ED_devhdrHdr,LW_EVTFD_DEV_PATH,

    _G_iEvtfdDrvNum,DT_CHR) != ERROR_NONE) {

    return (PX_ERROR);

    }

    return (ERROR_NONE);

    }

    打开虚拟设备文件eventfd,在该函数中initval参数表示事件的初始状态,为0则表示当前没有任何事件产生,参数flags为该事件文件的操作选项。

    flags标志位有如下三种:

    1.EFD_SEMAPHORE的含义为将事件按照计数信号量来操作;

    2.EFD_NONBLOCK 类似于使用O_NONBLOCK标志来设置文件描述符;

    3.EFD_CLOEXEC 类似open以O_CLOEXEC标志打开,O_CLOEXEC应该表示执行exec()时,之前通过open()打开的文件描述符会自动关闭测试,在open()之后,调用exec(),在新的进程中检测描述符是否已经关闭,具体实现如程序清单 23所示。

    程序清单 23打开eventfd文件


    LW_API

    inteventfd (unsignedintinitval,intflags)

    {

    INTiFd;

    PLW_EVTFD_FILEpevtfdfil;

    flags &= (EFD_SEMAPHORE |EFD_CLOEXEC | EFD_NONBLOCK);

    iFd =open(LW_EVTFD_DEV_PATH,O_RDWR | flags);

    if (iFd >= 0) {

    pevtfdfil = (PLW_EVTFD_FILE)API_IosFdValue(iFd);

    pevtfdfil->EF_u64Counter = (UINT64)initval;

    if (pevtfdfil->EF_u64Counter) {

    API_SemaphoreBPost(pevtfdfil->EF_ulReadLock);

    }

    }

    return (iFd);

    }

  5. 读取事件文件

    用户在使用虚拟设备文件eventfd时,如果需要读取事件文件或者等待事件的发送则需要用到函数eventfd_read,当没有事件需要调用并且没有使用参数EFD_SEMAPHORE时,该函数将会阻塞。具体实现如程序清单 24所示。

    程序清单 24读取事件文件


    LW_API

    inteventfd_read (intfd,eventfd_t *value)

    {

    return (read(fd,value, sizeof(eventfd_t)) !=sizeof(eventfd_t) ?PX_ERROR : ERROR_NONE);

    }

    需要用户注意的地方是如果使用的eventfd函数的参数flags包含了EFD_SEMAPHORE时,其含义为将事件按照计数信号量来操作。即如果当前已经产生了多个事件,每一次读取只会包含一个事件,该文件内部的事件计数器只减一,value里面的内容为1。当没有使用EFD_SEMAPHORE时,一次读取所有的事件,value里面的内容即为读取的事件数量,内部的事件计数器归零。两种方式可满足应用程序在不同场景的需求。

  6. 写事件文件

    当用户在使用虚拟设备文件eventfd时,如果需要写事件文件或者发送事件则需要用到函数eventfd_write,当内部事件计数器达到最大值时,将不能继续发送事件,此时将返回错误。具体实现如程序清单 25所示。

    程序清单 25写事件文件


    LW_API

    inteventfd_write (intfd,eventfd_tvalue)

    {

    return (write(fd, &value,sizeof(eventfd_t)) !=sizeof(eventfd_t) ?PX_ERROR : ERROR_NONE);

    }

    需要用户注意的是,eventfd_write函数总是会等待上一次写入的事件被读取完后才能完成本次事件的写入,所以事件文件的读和写是一个相互同步的过程,一次事件的数值可理解为事件发生后所能处理的资源数量,EFD_SEMAPHORE则允许事件接受方决定是一次处理多个资源还是单个资源。

  7. 参考文献

    1.《SylixOS应用开发手册》

    2. SylixOS源码

时间: 2024-11-13 10:09:17

SylixOS 虚拟设备文件浅析的相关文章

android学习笔记--android启动过程之init.rc文件浅析

1.  init.rc文件结构文件位置:init.c  : /system/core/initinit.rc  : /system/core/rootdir 首先init.rc文件是以模块为单位的,每个模块里的内容都是一起执行的,模块分为3种类型:on.service.import.我们可以看下init.rc文件是怎么写的:1.import import /init.usb.rc import /init.${ro.hardware}.rc import /init.trace.rc 上面的内容

SylixOS的RMS浅析

目 录 1. 知识简介    1 1.1 嵌入式实时操作系统    1 1.2 优先级调度算法    1 2. 技术实现    2 2.1 函数原型分析    2 2.2 使用流程    2 2.3 源码分析    3 2.4 示例演示    4 3. 参考资料    5 知识简介 嵌入式实时操作系统 SylixOS操作系统是实时多任务嵌入式操作系统,所谓实时,是指系统的正确性不仅仅依赖于计算机的逻辑结果而且依赖于结果产生的时间.结果产生的时间就是通常所说的截止期限,描述系统实时性的指标主要有:

SylixOS钩子函数浅析

1 使用背景对定时器做相关配置,使得每隔时间T,触发定时器中断,可以在定时器中断处理函数处理算法,这样就可以周期性的执行特定的任务.但如果不想在定时器中断处理函数中添加算法,比如说用户只想在应用程序里面执行他们的任务,那么钩子函数就是一个不错的选择.2 钩子函数的原理本章以定时器中断为例说明SylixOS钩子的使用方法.2.1 API_InterVectorIsr函数函数原型如程序清单 2.1程序清单 2.1#include <SylixOS>irqreturn_t API_InterVect

ASCII与Unicode编码消息写文件浅析

[文章摘要] ASCII与Unicode是两种常见的字符编码.它们的表示方法不一样,因而在程序中就要区别处理. 本文基于作者的实际开发经验,对ASCII与Unicode两种字符编码消息的写文件过程进行了详细的分析,为相关软件开发工作的开展提供了有益的参考. [关键词] ASCII  Unicode  C语言  编码  开发 一.ASCII与Unicode编码简介 1. ASCII编码简介 ASCII是一套基于拉丁字母的电脑编码系统.它使用指定的7位或8位二进制数的组合来表示128或256 种可能

Android init.rc文件浅析

本文主要来自$ANDROID_SOURCE/system/init/readme.txt的翻译. 1 简述 Android init.rc文件由系统第一个启动的init程序解析.此文件由语句组成,主要包括了四种类型的语句:Action,Commands,Services,Options.在init.rc文件里一条语句一般是占领一行.单词之间是通过空格符来相隔的.假设须要在单词内使用空格,那么得使用转义字符"\",假设在一行的末尾有一个反斜杠,那么是换行折叠符号,应该和下一行合并成一起来

SylixOS文件状态获取

文件状态介绍 SylixOS中文件的状态信息包含在stat结构体中,其中包含了文件大小,设备标识符,用户标识符,用户组标识符,文件模式,扩展属性,文件读取或修改的时间戳,链接数量,指向存储该内容的磁盘区块的指针,文件分类等等. SylixOS中维护的stat结构体如图 1.1所示. 图 1.1 stat结构体成员 文件状态获取函数 文件状态获取函数介绍 SylixOS中获取文件状态可以使用stat.lstat和fstat等函数.如图 2.1所示. 图 2.1获取文件状态函数原型 函数fstat原

Windows文件系统结构

├—WINDOWS │ ├—system32(存放Windows的系统文件和硬件驱动程序) │ │ ├—config(用户配置信息和密码信息) │ │ │ └—systemprofile(系统配置信息,用于恢复系统) │ │ ├—drivers(用来存放硬件驱动文件,不建议删除) │ │ ├—spool(用来存放系统打印文件.包括打印的色彩.打印预存等) │ │ ├—wbem(存放WMI测试程序,用于查看和更改公共信息模型类.实例和方法等.请勿删除) │ │ ├—IME(用来存放系统输入法文件,

文件后缀代表的意思

文件后缀格式类型大全 sys 系统文件, dmp Oracle二进制格式备份文件 bat DOS批处理文件,可执行文件 TMP Windows临时文件 JS JavaScript源文件 NLS 用于本地化的国家语言支持文件(例如,Uniscape) LOG 日志文件 PRS Harvard Graphics for Windows演示文件 MSA 魔术阴影档案 MSG Microsoft邮件消息 MSI Windows 安装器包 MSN Microsoft网络文档:Descent Mission

【WinPE】如何修改已有的WinPE.iso文件

本篇内容借鉴自:http://bbs.wuyou.net 这篇文章可以告诉你如何在原有PE基础上增删一些绿色软件,如果你需要更有含金量的操作,请移步至无忧论坛. 准备工具: 1.Win PE.iso 2.UltraISO 3.WimTool 第一步: 用UltraISO或WimTool或7-zip解压WinPE.iso中的“.wim”文件.里面有Program Files文件夹,把你事先准备的绿色软件放进去. 第二步: 在第一步解压出的windows文件夹中有类似pecmd.ini的文件,里面包