操作系统内核源码杂谈篇:临界区
创始人
2024-12-26 05:36:32
0

临界资源,是指同一时刻只能由一个线程(linux下为进程)访问的资源,而临界区就是为了确保临界资源访问是单一数据流。

临界区的代码执行,也就是进行原子操作,不会被打断。

先分析RTOS的运行架构,以cm3为例,它的中断屏蔽寄存器如下:

那么让我们看看FreeRTOS中的临界区,在RTOS中,多线程本质上是协程,也就是CPU不断切换而达到的伪多线程,其实某一时刻仍然只有一个任务被执行。而任务的切换又是通过Pednsv中断编程进行的,所以为了完成原子操作,RTOS采用的临界区实现方式就是关闭中断:

basepri的目的是屏蔽你设置的中断优先级及以下的中断,所以如果有更高的中断,这里的代码就会被打断,后面的dsb和isb指令将会毫无意义,因为在嵌入式系统中,访问硬件寄存器的操作必须是原子的,这样显然是不行的,所以要使用cpsid指令先屏蔽所有中断(cpsid本质上是在操作PRIMASK)。

进入临界区,屏蔽一定优先级的中断后,由于Pendsv中断设置优先级是最低,所以其他线程将无法工作。

不过临界区的代码也是会被打断的,因为basepri只屏蔽一定优先级的中断,如果你对ulnewBASEPRI设置过低,那么临界区的代码其实还不是严格意义上的原子操作。不过在RTT内核中,它是直接操作primask屏蔽所有中断,确保了严格的原子性。

现在让我们看看linux内核中的临界区:

linux内核中,为了确保对数据操作的原子性,采用的是内存锁。

不同于RTOS,linux的实时性差得要命,通过屏蔽中断来完成临界区更是无稽之谈,所以linux采用了其他方法:内存锁。

linux中,进程和线程其实是统一的,对于一个复杂的操作系统,为了确保只有单一进程访问内存数据,对内存进行上锁,这样,持有锁的进程可以访问内存,不持有锁的进程无法访问,也就无法对数据进行操作,确保了数据的有效性。

通过memw_locked函数,linux内核也可以形成原子操作,这样就不会被打断了。

其实,对于运行linux内核的单核CPU而言,这里的代码还是会被打断的,因为单核处理器多进程的本质也是swtich。

相关内容

热门资讯

技巧辅助挂!pokermast... 技巧辅助挂!pokermaster修改器,丹东约战麻将辅助器,演示教程(有挂细节)1、点击下载安装,...
现场直击!wepokerplu... 现场直击!wepokerplus万能挂,丰城双剑新版最强高分攻略,操作教程(有挂方针)1.丰城双剑新...
插件辅助挂!wepoker有辅... 插件辅助挂!wepoker有辅助器吗,乐平包王攻略,学习教程(有挂方略)1、首先打开乐平包王攻略辅助...
据玩家消息!拱趴大菠萝辅助神器... 据玩家消息!拱趴大菠萝辅助神器,多乐跑得快辅助器,机巧教程(证实有挂)1、在拱趴大菠萝辅助神器插件功...
此事备受玩家关注!来玩app破... 此事备受玩家关注!来玩app破解版,h5能反杀吗,绝活教程(有挂详细)1、打开软件启动之后找到中间准...
值得注意的是!aapoker破... 值得注意的是!aapoker破解侠是真的吗,蜀山四川游戏修改工具,经验教程(有挂助手)1、金币登录送...
第三方辅助!wepoker脚本... 第三方辅助!wepoker脚本,广东星悦有外开挂辅助器吗,法门教程(有挂分析)广东星悦有外开挂辅助器...
此事引发广泛关注!德州透视脚本... 此事引发广泛关注!德州透视脚本,崇阳斗棋辅助脚本视频,诀窍教程(的确有挂)暗藏猫腻,小编详细说明崇阳...
黑科技辅助挂!wepoker买... 黑科技辅助挂!wepoker买脚本靠谱吗,情怀七喜游戏辅助,法门教程(有挂方法)1、每一步都需要思考...
方法辅助挂!aapoker怎么... 方法辅助挂!aapoker怎么设置提高好牌几率,蘑菇云辅助使用视频,绝活儿教程(讲解有挂)1、完成蘑...