操作系统内核源码杂谈篇:临界区
创始人
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。

相关内容

热门资讯

透视挂!aapoker安装包怎... 透视挂!aapoker安装包怎么使用(透视)aapoker怎么拿好牌,详细教程(有挂插件)1、该软件...
透视辅助“约局吧德州有挂吗”p... 透视辅助“约局吧德州有挂吗”poker master辅助(透视)攻略方法(真是真的是有挂)1、起透看...
透视黑科技!德普之星私人局辅助... 透视黑科技!德普之星私人局辅助免费(透视)辅助软件(有挂方法);1、许多玩家不知道德普之星私人局辅助...
透视存在“wepoker手机版... 透视存在“wepoker手机版辅助”wepokerplus透视脚本免费(透视)有辅助器(确实有挂)1...
透视攻略“约局吧作弊脚本”智星... 透视攻略“约局吧作弊脚本”智星菠萝透视(透视)新2025教程(真是是有挂)1)约局吧作弊脚本辅助挂:...
透视游戏!aapoker ai... 透视游戏!aapoker ai插件(透视)aapoker脚本怎么用,2025新版教程(有挂工具);1...
透视好友!德普辅助器辅助器怎么... 透视好友!德普辅助器辅助器怎么用(透视)透视软件免费入口官网(有挂规律)1、德普辅助器辅助器怎么用a...
透视辅助“wepoker有没有... 透视辅助“wepoker有没有挂”wepoker辅助器如何使用(透视)外挂(本来是有挂)所有人都在同...
透视好牌!aapoker俱乐部... 透视好牌!aapoker俱乐部靠谱吗(透视)aapoker怎么拿好牌,透明挂教程(有挂详情)1.aa...
透视总结“werplan外挂”... 透视总结“werplan外挂”哈糖大菠萝有没有挂(透视)AI教程(确实有挂)1、不需要AI权限,帮助...