前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 / 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )

【Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 / 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )

作者头像
韩曙亮
发布2023-03-30 14:13:39
1.5K0
发布2023-03-30 14:13:39
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、禁止 / 开启内核抢占 与 方法保护临界区


如果要使用 " 内存屏障 " , 如 : 禁止 内核 抢占 " 方法保护临界区 " :

首先 , 声明 preempt_disable(); 宏 , 表示下面的代码就是 " 方法保护临界区 " 内的代码 , 这些代码禁止 内核 抢占 ;

然后 , 编写 " 方法保护临界区 " 代码 ;

最后 , 使用 preempt_enable(); 宏 , 表示之后的代码允许 内核 抢占 ;

preempt_disable();preempt_enable(); 之间的代码 , 就是 " 方法保护临界区 " 代码 , 这样可以 阻止编译器重排指令 , 在 禁止 内核抢占 preempt_disable 与 开启内核抢占 preempt_enable 之间的 " 方法保护临界区 " 代码中 , 添加 " 编译器优化屏障 " ;

声明 " 方法保护临界区 " 代码示例 :

代码语言:javascript
复制
preempt_disable();

// 方法保护临界区

preempt_enable();

二、编译器优化屏障


gcc 编译器优化屏障 参考 【Linux 内核 内存管理】优化内存屏障 ① ( barrier 优化屏障 | 编译器优化 | CPU 执行优化 | 优化屏障源码 barrier 宏 ) 博客 ; " 编译器优化屏障 " 是通过 barrier() 宏定义 实现的 , gcc 编译器 的 " 优化屏障 " 定义在 linux-5.6.18\include\linux\compiler-gcc.h 源码中 ;

代码语言:javascript
复制
/* Optimization barrier */

/* The "volatile" is due to gcc bugs */
#define barrier() __asm__ __volatile__("": : :"memory")
在这里插入图片描述
在这里插入图片描述

源码路径 : linux-5.6.18\include\linux\compiler-gcc.h#20

三、preempt_disable 禁止内核抢占 源码


在 Linux 内核源码 linux-5.6.18\include\linux\preempt.h 中 , 定义了 preempt_disable 宏 ;

preempt_disable() 宏源码如下 :

代码语言:javascript
复制
#define preempt_disable() \
do { \
	preempt_count_inc(); \
	barrier(); \
} while (0)
在这里插入图片描述
在这里插入图片描述

源码路径 : linux-5.6.18\include\linux\preempt.h#169

四、preempt_enable 开启内核抢占 源码


在 Linux 内核源码 linux-5.6.18\include\linux\preempt.h 中 , 定义了 preempt_enable

代码语言:javascript
复制
#ifdef CONFIG_PREEMPTION
#define preempt_enable() \
do { \
	barrier(); \
	if (unlikely(preempt_count_dec_and_test())) \
		__preempt_schedule(); \
} while (0)
在这里插入图片描述
在这里插入图片描述

源码路径 : linux-5.6.18\include\linux\preempt.h#185

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、禁止 / 开启内核抢占 与 方法保护临界区
  • 二、编译器优化屏障
  • 三、preempt_disable 禁止内核抢占 源码
  • 四、preempt_enable 开启内核抢占 源码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档