【ARM 嵌入式 編譯系列 4 -- GCC 編譯屬性 __read_mostly 詳細介紹】

文章目錄

    • __read_mostly 介紹
      • __read_mostly 在 linux 中的使用
      • .data.read_mostly 介紹

__read_mostly 介紹

__read_mostly 是一個在Linux內核編程中用到的宏定義,這是一個gcc編譯器的屬性,用于告訴編譯器此變量主要用于讀取,很少進行寫入,最好將此變量放在具有相同特性的變量附近。使用這個宏可以優化程序在運行時的緩存性能,因為處理器會緩存經常讀取的部分。

這個宏在arm gcc中和其他平臺的gcc編譯器中都有同樣的作用。

以下是一個簡單的使用示例:

static int __read_mostly my_variable = 0;

在這個示例中,my_variable 被聲明為一個主要用于讀取的靜態變量。這意味著在大多數情況下,my_variable 的值將被讀取,而不是寫入。通過這種方式,編譯器可以進行一些優化,提高代碼執行的效率。

__read_mostly 在 linux 中的使用

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

unsigned logn stack_chk_guard __read_mostly

參考網上資料了解到 __read_mostly 修飾的變量放在定義為存放在 .data.read_mostly 段中。

#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標記并不意味著這個變量永遠不會被寫入,而只是一個優化建議,指示編譯器這個變量在大部分時間里是被讀取的,寫入操作相對較少。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36242.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36242.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36242.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MYSQL中用字符串2022-07去匹配Date類型大于2022-07-01并小于2022-07-31

正文 需求上,是有個日期字符串,例如2022-07,代表著年月。數據庫中表對于這個字段存的是年月日,例如:2022-07-15。 我希望的是:獲取到2022-07-01到2022-07-31,之間的數據,條件是&…

21款美規奔馳GLS450更換中規高配主機,漢化操作更簡單

很多平行進口的奔馳GLS都有這么一個問題,原車的地圖在國內定位不了,語音交互功能也識別不了中文,原廠記錄儀也減少了,使用起來也是很不方便的。 可以實現以下功能: ①中國地圖 ②語音小助手(你好&#xf…

【BASH】回顧與知識點梳理(二十六)

【BASH】回顧與知識點梳理 二十六 二十六. 二十一至二十五章知識點總結及練習26.1 總結26.2 模擬26.3 簡答題 該系列目錄 --> 【BASH】回顧與知識點梳理(目錄) 二十六. 二十一至二十五章知識點總結及練習 26.1 總結 Linux 操作系統上面&#xff0c…

unittest單元測試

當你在編寫測試用例時,可以使用Python內置的unittest模塊來進行單元測試。下面是一個逐步指南,幫助你理解如何編寫和運行基本的單元測試。 導入必要的模塊: 首先,你需要導入unittest模塊和需要測試的模塊(例如&#xf…

運維監控學習筆記8

在服務器端,我們添加了nginx-server的主機: 在解決Error問題的過程中,我還通過zabbix_get這個命令進行了測試,發現是沒有的,后來確認是在web頁面配置的過程中,我輸錯了密碼。 yum install zabbix-getzabbi…

uniapp-原生地圖截屏返回base64-進行畫板編輯功能

一、場景 vue寫uniapp打包安卓包,實現原生地圖截屏(andirod同事做的)-畫板編輯功能 實現效果: 二、邏輯步驟簡略 1. 由 原生地圖nvue部分,回調返回 地圖截屏生成的base64 數據, 2. 通過 uni插件市場 im…

《圖解HTTP》——HTTP協議詳解

一、HTTP協議概述 HTTP是一個屬于應用層的面向對象協議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統。它于1990年提出,經過幾年的使用與發展,得到不斷地完善和擴展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP…

muduo 29 異步日志

目錄 Muduo雙緩沖異步日志模型: 異步日志實現: 為什么要實現非阻塞的日志

SQL 語句解析過程詳解

SQL 語句解析過程詳解: 1.輸入SQL語句 2.詞法分析------flex 使用詞法分析器(由Flex生成)將 SQL 語句分解為一個個單詞,這些單詞被稱為“標記“。標記包括關鍵字、標識符、運算符、分隔符等。 2.1 flex 原…

【CSS 布局】水平垂直方向居中

【CSS 布局】水平垂直方向居中 單行元素 <div class"container"><div class"item"></div> </div>方式一&#xff1a;relative 和 absolute .container {position: relative;height: 400px;border: 1px solid #ccc;.item {posit…

20個互聯網用戶Python數據分析項目

這篇文章給大家整理了20個互聯網用戶數據分析的項目。所有收錄的項目&#xff0c;進行了嚴格的篩選&#xff0c;標準有二&#xff1a; 1.有解說性文字&#xff0c;大家能知道每一步在干嘛&#xff0c;新手友好 2.數據集公開&#xff0c;保證大家可以在原文的基礎上自行探索 更…

[保研/考研機試] KY96 Fibonacci 上海交通大學復試上機題 C++實現

題目鏈接&#xff1a; KY96 Fibonacci https://www.nowcoder.com/share/jump/437195121692000803047 描述 The Fibonacci Numbers{0,1,1,2,3,5,8,13,21,34,55...} are defined by the recurrence: F00 F11 FnFn-1Fn-2,n>2 Write a program to calculate the Fibon…

【STM32】FreeRTOS互斥量學習

互斥量&#xff08;Mutex&#xff09; 互斥量又稱互斥信號量&#xff08;本質也是一種信號量&#xff0c;不具備傳遞數據功能&#xff09;&#xff0c;是一種特殊的二值信號量&#xff0c;它和信號量不同的是&#xff0c;它支持互斥量所有權、遞歸訪問以及防止優先級翻轉的特性…

人文景區有必要做VR云游嗎?如何滿足游客出行需求?

VR云游在旅游行業中的應用正在快速增長&#xff0c;為游客帶來沉浸式體驗的同時&#xff0c;也為文旅景區提供了新的營銷方式。很多人說VR全景展示是虛假的&#xff0c;比不上真實的景區觸感&#xff0c;人文景區真的有必要做VR云游嗎&#xff1f;我的答案是很有必要。 如果你認…

【跟小嘉學 Rust 編程】十二、構建一個命令行程序

系列文章目錄 【跟小嘉學 Rust 編程】一、Rust 編程基礎 【跟小嘉學 Rust 編程】二、Rust 包管理工具使用 【跟小嘉學 Rust 編程】三、Rust 的基本程序概念 【跟小嘉學 Rust 編程】四、理解 Rust 的所有權概念 【跟小嘉學 Rust 編程】五、使用結構體關聯結構化數據 【跟小嘉學…

【Pytroch】基于K鄰近算法的數據分類預測(Excel可直接替換數據)

【Pytroch】基于K鄰近算法的數據分類預測&#xff08;Excel可直接替換數據&#xff09; 1.模型原理2.數學公式3.文件結構4.Excel數據5.下載地址6.完整代碼7.運行結果 1.模型原理 K最近鄰&#xff08;K-Nearest Neighbors&#xff0c;簡稱KNN&#xff09;是一種簡單但常用的機器…

Redis基礎學習

目錄 第一章、Redis數據庫的下載和安裝1.1&#xff09;nosql數據庫和 Redis 介紹1.2&#xff09;Windows中下載安裝Redis數據庫1.3&#xff09;Linux中安裝Redis數據庫1.4&#xff09;Linux中啟動redis1.5&#xff09;Linux中關閉redis 第二章、三種Redis客戶端連接Redis數據庫…

安全遠控如何設置?揭秘ToDesk、TeamViewer 、向日葵安全遠程防御大招

寫在前面一、遠程控制&#xff1a;安全性不可忽略二、遠控軟件安全設置實測? ToDesk? TeamViewer? 向日葵 三、遠控安全的亮點功能四、個人總結與建議 寫在前面 說到遠程辦公&#xff0c;相信大家都不陌生。遠程工作是員工在家中或者其他非辦公場所上班的一種工作模式&…

傳輸層協議

傳輸層協議 再談端口號端口號范圍劃分認識知名端口號兩個問題netstatpidof UDP協議UDP協議端格式UDP的特點面向數據報UDP的緩沖區UDP使用注意事項基于UDP的應用層協議 TCP協議TCP協議段格式確認應答(ACK)機制超時重傳機制連接管理機制理解 CLOSE_WAIT 狀態理解TIME_WAIT狀態解決…

修改el-select和el-input樣式;修改element-plus的下拉框el-select樣式

修改el-select樣式 .select_box{// 默認placeholder:deep .el-input__inner::placeholder {font-size: 14px;font-weight: 500;color: #3E534F;}// 默認框狀態樣式更改:deep .el-input__wrapper {height: 42px;background-color: rgba(0,0,0,0)!important;box-shadow: 0 0 0 …