【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标记并不意味着这个变量永远不会被写入,而只是一个优化建议,指示编译器这个变量在大部分时间里是被读取的,写入操作相对较少。

相关推荐
qq_4597300311 小时前
4-3 MCU中ARM存储器的作用
arm开发·单片机·嵌入式硬件
轩辰~21 小时前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
ARM&开发(Haidong)21 小时前
ARM 获取cpu个数
arm开发
憧憬一下2 天前
PCIe_Host驱动分析_设备枚举
arm开发·嵌入式硬件·嵌入式·pcie·linux驱动开发
7yewh2 天前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
憧憬一下4 天前
PCIe_Host驱动分析_地址映射
arm开发·嵌入式硬件·嵌入式·linux驱动开发·pci/pcie
楼兰公子4 天前
相机主要调试参数
arm开发·驱动·camera·v4l2
7yewh4 天前
嵌入式驱动RK3566 HDMI eDP MIPI 背光 屏幕选型与调试提升篇-eDP屏
linux·arm开发·驱动开发·嵌入式硬件·嵌入式linux·rk·edp
千千道6 天前
深入理解 Linux 内核启动流程
linux·arm开发·驱动开发
徐某人..6 天前
ARM嵌入式学习--第八天(PWM)
arm开发·学习·arm