SylixOS 信号系统(3)

SylixOS 经得起检验的国产操作系统 (五) 本篇开始介绍“信号系统”、“IO系统”以及“标准设备”。详细信息请访问SylixOS官网:http://www.sylixos.com。 阅读详情

信号内部机制

SylixOS的信号机制分为3类发送信号方法:kill类型、队列类型和事件类型,这3中类型分别由_doKill()、_doSigQueue()、_doSigEvent()函数实现,上层所有的发送信号函数都直接或者间接地通过调用这几个函数来实现,而这3个函数中,_doKill()设置信号源为SI_KILL、_doSigQueue()设置信号源为SI_QUEUE、_doSigEvent()设置信号源分为:SI_TIMER、SI_ASYNCIO等。如下表列出了SylixOS支持的所有信号产生源。

信号产生源说明
SI_KILL/SI_USER使用kill函数发送的信号
SI_QUEUE使用sigqueue函数发送的信号
SI_TIMERPOSIX定时器发送的信号
SI_ASYNCIO异步I/O系统完成发送的信号
SI_MESGQ接收到一条消息产生的信号
SI_KERNELSylixOS内核内部使用

无论什么类型的信号都将通过调用_doSignl()函数向指定的线程发送信号,下面我们结合代码分析一下此函数的实现原理:
如果要发送的信号通知类型是SIGEV_NONE类型,则代表不发送信号,_doSignal()直接返回并认为是忽略此信号,如下:

if (psigpend->SIGPEND_iNotify == SIGEV_NONE) {     /*  不发送信号                  */
    return  (SEND_IGN);
}

如果此线程正在等某个信号(如:调用sigwaitinfo等,以后我们将介绍),而此时发送的信号正是此线程等待的,此应唤醒目标线程,如下:

psigctx = _signalGetCtx(ptcb);
if (psigctx->SIGCTX_sigwait) {                    /*  目标线程在等待信号          */
     if (psigctx->SIGCTX_sigwait->SIGWT_sigset & __sigmask(iSigNo)) {/*  属于关心的信号              */
            psigctx->SIGCTX_sigwait->SIGWT_siginfo = psigpend->SIGPEND_siginfo;
            __sigMakeReady(ptcb, iSigNo, &iSchedRet, LW_SIGNAL_EINTR);  /*  就绪任务                    */
            psigctx->SIGCTX_sigwait = LW_NULL;    /*  删除等待信息                */
            return  (SEND_INFO);
     }
}

当然,如果在安装此信号的时候(之后我们将介绍如何安装一个信号),指定信号处理函数为SIG_IGN或者SIG_ERR,则不做任何事。
接下来需要注意,因为如果发送的是SIGCHLD信号并且设置了SA_NOCLDSTOP标志,则代表子进程退出时不需要向父进程发送信号,因此,这个时候直接返回就可以了。如下:

if ((psigaction->sa_flags & SA_NOCLDSTOP) &&
    (psigpend->SIGPEND_siginfo.si_signo == SIGCHLD) &&
    (__SI_CODE_STOP(psigpend->SIGPEND_siginfo.si_code))) {  /*  父进程不接收子进程暂停信号  */
    return  (SEND_IGN);
}

如果发送的信号被屏蔽了,则分为3中情况要考虑:
1. 如果是SI_KILL类型,则代表是不需要排队的,直接设置成未决即可;
2. 如果是非SI_KILL类型,则代表是需要排队的,而如果此信号已然被排队,只需将其未决计数加1;
3. 其他情况,则需要创建新的排队节点,并且放到队列中去。
以上3种情况的代码如下:

if (sigsetSigMaskBit & psigctx->SIGCTX_sigsetSigBlockMask) {  /*  被屏蔽了                    */
        if (psiginfo->si_code == SI_KILL) {                   /*  kill 产生了信号, 不能排队   */
            psigctx->SIGCTX_sigsetKill    |= sigsetSigMaskBit;/*  有 kill 的信号被屏蔽了      */
            psigctx->SIGCTX_sigsetPending |= sigsetSigMaskBit;/*  iSigNo 由于屏蔽等待运行     */

        } else if (psigpend->SIGPEND_ringSigQ.RING_plistNext) {/*  除了 kill 产生的信号, 如果  */
            psigpend->SIGPEND_uiTimes++;                   /*  在队列中, 就需要队列缓冲信号*/
                                                           /*  已经存在在队列中            */
        } else {
            if (psigpend->SIGPEND_iNotify == SIGEV_SIGNAL) {/*  需要排队信号                */
                PLW_CLASS_SIGPEND   psigpendNew = _sigPendAlloc();/*  从缓冲区中获取一个空闲的    */
                LW_LIST_RING_HEADER *ppringHeader = 
                                    &psigctx->SIGCTX_pringSigQ[iSigIndex];

                if (psigpendNew == LW_NULL) {
                    _DebugHandle(__ERRORMESSAGE_LEVEL, 
                    "no node can allocate from free sigqueue.\r\n");
                    _ErrorHandle(ERROR_SIGNAL_SIGQUEUE_NODES_NULL);
                    return  (SEND_ERROR);
                }

                *psigpendNew = *psigpend;              /*  拷贝信息                    */
                _List_Ring_Add_Last(&psigpendNew->SIGPEND_ringSigQ, 
                                    ppringHeader);     /*  加入队列链表                */
                psigpendNew->SIGPEND_psigctx   = psigctx;
                psigctx->SIGCTX_sigsetPending |= sigsetSigMaskBit;/*  iSigNo 由于屏蔽等待运行     */
            }
        }
        return  (SEND_BLOCK);                                /*  被 mask 的都不执行          */
    }

当然我们还需考虑,如果在信号处理函数中,又来了同一个信号,应该如何处理?POSIX规定如果在信号安装时指定了SA_NOMASK标志,以上情况可以被中断,处理新的信号。如果没有指定SA_NOMASK标志,则以上情况不会被中断,SylixOS支持这一特性。
这个时候SylixOS就可以将指定的线程放到就绪表,并且创建信号需要的环境了。下一节我们将详细介绍信号上下文环境的创建。

<本节完>

DDS实现层深度解析:实时系统中的RTPS协议、内存与QoS硬核调优 DDS(Data Distribution Service)作为分布式实时系统的通信中间件,其核心价值在于将发布-订阅抽象模型落地为纳秒级确定性的二进制实现。它依托RTPS有线协议,在操作系统、CPU缓存、网络硬件与实时调度约束下完成协议栈映射、零拷贝传输、静态内存池分配及QoS语义到OS原语的精准翻译。技术关键点包括共享内存(SHM)替代UDP内核路径以降低延迟、缓存行对齐规避伪共享、RTPS报文精简优化处理耗时,以及基于CLOCK_TAI的时间戳统一机制。本文聚焦DDS implementations在 阅读详情

相关推荐

nRF24L01模块性能调优笔记:基于STC8H的SPI通信,如何突破700包/秒的传输瓶颈?

本文详细介绍了如何通过SPI通信优化、nRF24L01寄存器配置和STC8H系统级调优,突破700包/秒的传输瓶颈。从硬件设计到软件实现,提供了一套完整的性能调优方案,特别适合需要高性能无线通信的嵌入式开发者。

weixin_42525211的博客 180

SylixOS 信号发送、接收机制

SylixOS 可以通过 kill() 或 sigqueue() 向线程发送信号(向进程发送信号相当于发送给进程的主线程)。kill() 与 sigqueue() 的区别主要在发送信号的类型不一样,kill() 发送非排队信号,sigqueue() 发送排队信号。 kill() 中首先会调用 _doKill() 接口,在 _doKill() 中构建信号信息结构 struct siginfo 和 LW_CLASS_SIGPEND 结构,这里主要是保存信号值、信号产生源、发送信...

stone8761的专栏 437

基于SOEM的伺服电机控制实战:从配置到调试

本文详细介绍了基于SOEM的伺服电机控制实战,从硬件配置到软件调试的全过程。通过分享PDO映射、状态机控制、性能优化等核心技巧,帮助开发者快速掌握EtherCAT通信与伺服电机控制的关键技术,提升工控系统开发效率。

weixin_29165465的博客 519

精通 Linux 内核开发(二)

我们已经穿越了 Linux 内核最关键的一个方面,理解了内存表示和分配的各种微妙之处。通过理解这个子系统,我们也简洁地捕捉到了内核的设计才能和实现效率,更重要的是理解了内核在容纳更精细和更新的启发式和机制以持续增强方面的动态性。除了内存管理的具体细节,我们还评估了内核在最大化资源利用方面的效率,引领了所有经典的代码重用机制和模块化代码结构。尽管内存管理的具体细节可能会根据底层架构而有所不同,但设计和实现风格的一般性大部分仍然保持一致,以实现代码稳定性和对变化的敏感性。

龙哥盟 714

放弃FFT全频计算!在STM32F407上用DFT单点计算提速50%的优化技巧

本文详细介绍了在STM32F407上通过DFT单点计算实现比FFT快50%的优化技巧,特别适用于生物阻抗分析、振动监测等只需关注单一频点的嵌入式场景。通过预计算相位角、查表法和混合精度计算等策略,显著提升计算效率和内存利用率,同时保持高精度。

weixin_28738397的博客 191

CloudCompare点云变换保姆级教程:从平移、旋转到绕任意点旋转,一次搞定

本文提供CloudCompare点云变换的全面教程,涵盖从基础平移、旋转到绕任意点旋转的高级技巧。通过详细的操作步骤和实战案例,帮助用户掌握点云数据处理的核心技能,提升三维模型对齐和变换的效率与精度。

weixin_28717969的博客 290

SylixOS中的中断接口基础实现

SylixOS中断实现相对简单,主要借助arch接口,bsp接口,cpu对象,调度接口等实现。还通过数组和链表管理中断对象。

ScilogyHunter的博客 1110

微信小程序地图开发避坑指南:腾讯地图API从配置到实战(附完整代码)

本文详细解析微信小程序中腾讯地图API的开发实践,从基础配置到高级功能实现,涵盖地图显示、地点搜索、路线规划等核心功能,并提供完整代码示例和常见问题解决方案,帮助开发者高效避坑。特别针对JavaScript SDK和map组件的使用进行了深度优化指导。

weixin_33725722的博客 486

SylixOS系统异常处理工作队列

概念 SylixOS系统异常时(如需要删除异常线程)为了统一且归一化处理,使用了工作队列模式,统一提交至系统异常线程中处理。 系统异常处理工作队列的实现原理,用法和中断延迟队列基本相同,但只被内核用于异常处理。 接口 /********************************************************************************************************* ** 函数名称: _excJobAdd ** 功能描述: 加入待处理异常消息 *

ScilogyHunter的博客 463

FPGA图像处理之直方图均衡实现

直方图均衡的基本原理,就是对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行拉伸,而对像素个数较少的灰度值(即对画面不起主要作用的灰度值)进行合并,从而提高对比度,使图像清晰,达到增强的目的。综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数。

FZWzsl的博客 1428

解密Android相机框架:从HAL到应用层的全链路解析

本文深入解析Android相机框架的全链路架构,从应用层到硬件抽象层(HAL)再到驱动层,详细介绍了CamX-CHI架构的设计哲学与实战应用。通过HAL3接口、V4L2交互机制及Camera2 API的最佳实践,帮助开发者优化相机性能,解决多摄切换、预览卡顿等常见问题,提升成像效率与稳定性。

weixin_29238147的博客 408

SylixOS里的错误号【3】--- 系统错误号

SylixOS里的系统错误号定义位于libsylixos\SylixOS\system\include\s_error.h文件中。 /********************************************************************************************************* ** ** 中国软件开源组织 ** **

ScilogyHunter的博客 570

超详细 | 贝叶斯网络基础——有图有真相

Hello,大家好,我是starz。这是本系列的第二篇《概率基础Ⅱ》,虽说是概率基础,但作为过渡,它开始以图为载体 这节的主要内容有: 贝叶斯网络 三种结构 D-划分 贝叶斯球 马尔科夫毯 应用例子 总结 让我们开始吧 :3 贝叶斯网络 概率图模型可笼统分为两类,一是基于无向图的马尔科夫网络: 二是基于有向图的贝叶斯...

qq_41603411的博客 2万+

SylixOS 下的信号系统

信号是一种软中断,用来通知进程或者线程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程或者线程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是一种异步通信机制,一个进程或者线程不必通过任何操作来等待信号的到达,事实上,进程或者线程也不知道信号到底什么时候到达。进程之间可以互相 kill 函数发送信号。内核也可以因为内部事件而给进程或者线程发送信号,通知进程或者线程发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息。

日常学习记录 921

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

基于SylixOS的中断浅析

目  录 1.中断... 1 1.1           中断的定义... 1 1.2           中断的分类... 1 1.2.1    外部中断... 1 1.2.2    内部中断... 1 2. SylixOS下的中断浅析... 2 2.1           SylixOS信号系统... 2 2.2           SylixOS时间管理... 2

u013702699的博客 501

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SylixOS信号系统(2)

信号机制原理关键数据结构POSIX标准定义了sigset_t类型来定义一个信号集,然而sigset_t类型在不同的系统可能有不同的定义方式,因此去猜测sigset_t类型是不明确的,在SylixOS中,将sigset_t定义成了unsigned long long型,也即是一个64位的数据类型,每一位代表了一个信号,最高位不被使用。 SylixOS信号机制的实现离开不了下面几个关键数据结构;1.

flags_s的博客 668

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SylixOS信号系统(1)

信号简介信号是一种软中断,用来通知进程或者线程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程或者线程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是一种异步通信机制,一个进程或者线程不必通过任何操作来等待信号的到达,事实上,进程或者线程也不知道信号到底什么时候到达。进程之间可以互相kill函数发送信号。内核也可以因为内部事件而给进程或者线程发送信号,通知进程或者线程

flags_s的博客 809

【069】南京市“2020十项重大创新成果”重磅发布!翼辉SylixOS成功入选!

南京市“2020十项重大创新成果”重磅发布!翼辉SylixOS成功入选! 发布于2021年01月07日 2021年01月04日举行的南 京 市创新名城建设推进大会上,重磅发 布2021年市委一号文件《关于新发展阶段全面建设创新名城的若干政策措施》。在新年“第一会”上,南京市公布了创新名城建设十项重大创新成果,翼 辉“国产大型实时操作 系统的研发与应用”成功入选。 翼辉 SylixOS大型实时操作系统拥有完整自主知识产权,在航空航天、轨交、电力、自动化控制等领域,解决了工业操作系统“卡脖子”问题,已成功应

ScilogyHunter的博客 485

硬实时操作系统(Hard Real-Time OS)与软实时操作系统(Soft Real-Time OS)的区别

针对 FreeRTOS(代表软实时系统)和 SylixOS(代表硬实时系统)的具体对比分析,通过实际技术细节说明两者的差异。

bifudoph的博客 905

SylixOS里的事件集接口及用法

情景 我们一般都使用过P2P软件(如BT、电骡等)下载过电影等,P2P软件将需要下载的文件划分为许多个小片断,它从多个文件源下载这些不同的文件片断,当所有的文件片断下载完毕后,P2P软件再将它们组装成一个文件。 P2P软件需要记录这些文件片断的下载情况和实现在线播放的功能,而在线播放功能依赖于当前需要播放的文件片断,如果当前需要播放的文件片断未下载完,那么只能暂停播放了。下载和播放使用不同线程实现。下载线程不能简单地下载一个文件片断就唤醒播放线程进行播放,因为能下载到哪些文件片断是不确定的,当前下载到的文件

ScilogyHunter的博客 727

SylixOS动态内存分配操作

SylixOS 系统内存管理分为两大类: 内存堆管理和虚拟内存管理. 对用户来说内存堆管理的分配最小单位为 1 个字节, 虚拟内存管理分配最小单位为 1 个页面(通常为 4096 字节) 内核部分 操作系统内建的内存堆管理分为两大类: 核心内存堆和系统内存堆, 这两个内存堆对于操作系统来说都是具有持久性的, 换句话说, 只要内核没有重启, 分配出的内存在整个内核都是唯一的, 并且持久有效的. -> 核心内存堆主要为操作系统内核对象提供动态内存, 它的访问函数即如下所示: ker_malloc(),

ScilogyHunter的博客 2184

Reactor

网络通信

taozhua的博客 207

深入理解 Linux 内核---信号

信号的作用 信号是很短的消息,可以被发送到一个进程或一组进程。 发送给进程的唯一信息通常是一个数,来标识信号。 前缀为 SIG 的一组宏标识信号。 如,当一个进程引用无效的内存时,SIGSEGV 宏产生发送给进程的信号标识符。 使用信号的两个目的: 让进程知道已经发生了一个特定的事件。 强迫进程执行它自己的代码中的信号处理程序。 除了一些常规信号,POSIX 标准还引入了一类新的信号,叫做实时...

新博客:https://aping-dev.com/ 7221

linux 信号signal实现

信号是发送给进程或进程组的非常小的消息,通常只包含信号编号;现在的系统可以附带siginfo信息,见sigaction的SA_SIGINFO标识。 信号主要有以下两个目的: 1.让进程知道出现某异步事件 2.出现异步事件,让进程能做出相应的处理(通过提供信号处理函数,由内核自动调用)   I.信号生命周期 i.信号生命周期 1.信号产生:内核更新目标进程数据结构,表示出现某异步事件

永无止境 3153
上一篇: SylixOS信号系统(2)
下一篇: FTP 协议(指令集)
flags_s
博客等级 码龄11年 15粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值