【Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 / 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )
文章目錄
- 一、禁止 / 開啟內核搶占 與 方法保護臨界區
- 二、編譯器優化屏障
- 三、preempt_disable 禁止內核搶占 源碼
- 四、preempt_enable 開啟內核搶占 源碼
一、禁止 / 開啟內核搶占 與 方法保護臨界區
如果要使用 " 內存屏障 " , 如 : 禁止 內核 搶占 " 方法保護臨界區 " :
首先 , 聲明 preempt_disable(); 宏 , 表示下面的代碼就是 " 方法保護臨界區 " 內的代碼 , 這些代碼禁止 內核 搶占 ;
然后 , 編寫 " 方法保護臨界區 " 代碼 ;
最后 , 使用 preempt_enable(); 宏 , 表示之后的代碼允許 內核 搶占 ;
preempt_disable(); 與 preempt_enable(); 之間的代碼 , 就是 " 方法保護臨界區 " 代碼 , 這樣可以 阻止編譯器重排指令 , 在 禁止 內核搶占 preempt_disable 與 開啟內核搶占 preempt_enable 之間的 " 方法保護臨界區 " 代碼中 , 添加 " 編譯器優化屏障 " ;
聲明 " 方法保護臨界區 " 代碼示例 :
preempt_disable();// 方法保護臨界區preempt_enable();二、編譯器優化屏障
gcc 編譯器優化屏障 參考 【Linux 內核 內存管理】優化內存屏障 ① ( barrier 優化屏障 | 編譯器優化 | CPU 執行優化 | 優化屏障源碼 barrier 宏 ) 博客 ; " 編譯器優化屏障 " 是通過 barrier() 宏定義 實現的 , gcc 編譯器 的 " 優化屏障 " 定義在 linux-5.6.18\include\linux\compiler-gcc.h 源碼中 ;
/* 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() 宏源碼如下 :
#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 宏
#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
總結
以上是生活随笔為你收集整理的【Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 / 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux 内核 内存管理】优化内存屏
- 下一篇: 【Linux 内核 内存管理】优化内存屏