【ARM 嵌入式 编译系列 4 -- GCC 编译属性 __read_mostly 详细介绍】

文章目录

    • [__read_mostly 介绍](#__read_mostly 介绍)
      • [__read_mostly 在 linux 中的使用](#__read_mostly 在 linux 中的使用)
      • [.data.read_mostly 介绍](#.data.read_mostly 介绍)

__read_mostly 介绍

__read_mostly 是一个在Linux内核编程中用到的宏定义,这是一个gcc编译器的属性,用于告诉编译器此变量主要用于读取,很少进行写入,最好将此变量放在具有相同特性的变量附近。使用这个宏可以优化程序在运行时的缓存性能,因为处理器会缓存经常读取的部分。

这个宏在arm gcc中和其他平台的gcc编译器中都有同样的作用。

以下是一个简单的使用示例:

c 复制代码
static int __read_mostly my_variable = 0;

在这个示例中,my_variable 被声明为一个主要用于读取的静态变量。这意味着在大多数情况下,my_variable 的值将被读取,而不是写入。通过这种方式,编译器可以进行一些优化,提高代码执行的效率。

__read_mostly 在 linux 中的使用

arch/arm/kernel/process.c 中有如下定义:

c 复制代码
unsigned logn stack_chk_guard __read_mostly

参考网上资料了解到 __read_mostly 修饰的变量放在定义为存放在 .data.read_mostly 段中。

c 复制代码
#if defined(CONFIG_X86) || defined(CONFIG_SPARC64)
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
#else
#define __read_mostly
#endif

Linux 内核被加载时,__read_mostly 修饰的数据将自动被存放到 Cache 中,以提高整个系统的执行效率。

如果所在的平台 没有 Cache,或者虽然有Cache,但并不提供存放数据的接口(也就是并不允许人工放置数据在Cache中) ,这样定义为 __read_mostly类型的数据将不能存放在Linux内核中,甚至也不能够被加载到系统内存去执行,将造成Linux 内核启动失败。

解决的方法有两种:

  • 修改 include/asm/cache.h 中的 __ready_mostly 定义为:#define __read_mostly
  • 修改 arch/xxx/kernel/vmlinux.S,将 .data.read_mostly 段的位置到实际内存空间中去,例如放置在 .data 段之后等等。

.data.read_mostly 介绍

.data.read_mostly 是Linux内核中的一个特殊的数据段。这个段用于存放被__read_mostly宏标记的变量。这些变量主要用于读取,很少进行写入,所以将它们放在同一个区域可以优化处理器的缓存性能。

在Linux内核编译过程中,GCC编译器会根据__read_mostly宏的标记,将对应的变量放在.data.read_mostly数据段中。这样,处理器在进行内存访问时,可以把这个段的数据预先加载到缓存中,从而提高访问效率。

需要注意的是,使用__read_mostly标记并不意味着这个变量永远不会被写入,而只是一个优化建议,指示编译器这个变量在大部分时间里是被读取的,写入操作相对较少。

相关推荐
橘色的喵21 小时前
ARM-Linux 嵌入式消息总线:高优先级驱逐机制设计
linux·arm开发·性能优化·嵌入式·newosp
橘色的喵1 天前
ARM-Linux 嵌入式共享内存环形缓冲区:内存序的设计选择
linux·arm开发·性能优化·嵌入式·newosp
果果燕1 天前
实习笔记(一):NFS、Samba、VNC、Git、CMake、systemd、内核、交叉编译
linux·arm开发·c++·笔记·git
振南的单片机世界2 天前
1MΩ内阻+10pF寄生电容=信号“低通谋杀”
arm开发·stm32·单片机·嵌入式硬件
0x3F(小茶)2 天前
FreeRTOS 任务相关 API 函数
c语言·arm开发·单片机
zlinear数据采集卡3 天前
ZLinear DABM-D223 通信协议与软件开发全解析:从 USB CDC 到 DDS 波形输出
arm开发·嵌入式硬件·fpga开发·开源
LCMICRO-133108477463 天前
国产长芯微LD3092完全pin-pin替代LT3092,是一款可编程两端电流源
arm开发·单片机·嵌入式硬件·fpga开发·硬件工程·恒流源·lt3092
工业设备方案笔记4 天前
RK3588 vs RK3568:AI边缘计算项目到底应该如何选择芯片平台?
arm开发·人工智能·目标跟踪·架构·边缘计算
过客而已20034 天前
Model Context Protocol(MCP)技术深度解析
arm开发