国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價(jià)值的文章主要介紹了【ARM 嵌入式 編譯系列 4 -- linux 編譯屬性 __read_mostly 介紹】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


請(qǐng)閱讀【ARM GCC 編譯專欄導(dǎo)讀】


上篇文章:【ARM 嵌入式 編譯系列 3.3 – gcc 動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)的鏈接方法介紹】
下篇文章:【ARM 嵌入式 編譯系列 4.1 – GCC 編譯屬性 likely與unlikely 學(xué)習(xí)】

__read_mostly 介紹

__read_mostly 是一個(gè)在Linux內(nèi)核編程中用到的宏定義,這是一個(gè)gcc編譯器的屬性,用于告訴編譯器此變量主要用于讀取,很少進(jìn)行寫(xiě)入,最好將此變量放在具有相同特性的變量附近。使用這個(gè)宏可以優(yōu)化程序在運(yùn)行時(shí)的緩存性能,因?yàn)樘幚砥鲿?huì)緩存經(jīng)常讀取的部分。

這個(gè)宏在arm gcc中和其他平臺(tái)的gcc編譯器中都有同樣的作用。

以下是一個(gè)簡(jiǎn)單的使用示例:

static int __read_mostly my_variable = 0;

在這個(gè)示例中,my_variable 被聲明為一個(gè)主要用于讀取的靜態(tài)變量。這意味著在大多數(shù)情況下,my_variable 的值將被讀取,而不是寫(xiě)入。通過(guò)這種方式,編譯器可以進(jìn)行一些優(yōu)化,提高代碼執(zhí)行的效率。

__read_mostly 在 linux 中的使用

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

unsigned logn stack_chk_guard __read_mostly

參考網(wǎng)上資料了解到 __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 內(nèi)核被加載時(shí),__read_mostly 修飾的數(shù)據(jù)將自動(dòng)被存放到 Cache 中,以提高整個(gè)系統(tǒng)的執(zhí)行效率。

如果所在的平臺(tái) 沒(méi)有 Cache,或者雖然有Cache,但并不提供存放數(shù)據(jù)的接口(也就是并不允許人工放置數(shù)據(jù)在Cache中),這樣定義為 __read_mostly類型的數(shù)據(jù)將不能存放在Linux內(nèi)核中,甚至也不能夠被加載到系統(tǒng)內(nèi)存去執(zhí)行,將造成Linux 內(nèi)核啟動(dòng)失敗。

解決的方法有兩種:

  • 修改 include/asm/cache.h 中的 __ready_mostly 定義為:#define __read_mostly
  • 修改 arch/xxx/kernel/vmlinux.S,將 .data.read_mostly 段的位置到實(shí)際內(nèi)存空間中去,例如放置在 .data 段之后等等。

.data.read_mostly 介紹

.data.read_mostly 是Linux內(nèi)核中的一個(gè)特殊的數(shù)據(jù)段。這個(gè)段用于存放被__read_mostly宏標(biāo)記的變量。這些變量主要用于讀取,很少進(jìn)行寫(xiě)入,所以將它們放在同一個(gè)區(qū)域可以優(yōu)化處理器的緩存性能。

在Linux內(nèi)核編譯過(guò)程中,GCC編譯器會(huì)根據(jù)__read_mostly宏的標(biāo)記,將對(duì)應(yīng)的變量放在.data.read_mostly數(shù)據(jù)段中。這樣,處理器在進(jìn)行內(nèi)存訪問(wèn)時(shí),可以把這個(gè)段的數(shù)據(jù)預(yù)先加載到緩存中,從而提高訪問(wèn)效率。

需要注意的是,使用__read_mostly標(biāo)記并不意味著這個(gè)變量永遠(yuǎn)不會(huì)被寫(xiě)入,而只是一個(gè)優(yōu)化建議,指示編譯器這個(gè)變量在大部分時(shí)間里是被讀取的,寫(xiě)入操作相對(duì)較少。

上篇文章:【ARM 嵌入式 編譯系列 3.3 – gcc 動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)的鏈接方法介紹】
下篇文章:【ARM 嵌入式 編譯系列 4.1 – GCC 編譯屬性 likely與unlikely 學(xué)習(xí)】
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-644266.html

到了這里,關(guān)于【ARM 嵌入式 編譯系列 4 -- linux 編譯屬性 __read_mostly 介紹】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【ARM 嵌入式 編譯系列 10.4 -- 生成二進(jìn)制文件】

    在嵌入的工作中,經(jīng)常會(huì)使用到二進(jìn)制文件,那么我們?nèi)绾巫约荷梢粋€(gè)二進(jìn)制文件呢?接下來(lái)介紹如何將一個(gè)只包含將32位數(shù)據(jù)的文件轉(zhuǎn)化為二進(jìn)制文件,原文件如下(數(shù)據(jù)一共 64bytes): 我們使用 gcc 對(duì)齊先進(jìn)行編譯然后再進(jìn)行反匯編: 具體命令如下: 通過(guò)上面命令會(huì)生成

    2024年02月02日
    瀏覽(62)
  • 【ARM 嵌入式 編譯 Makefile 系列 2 - Makefile 如何打印信息】

    請(qǐng)閱讀 【ARM GCC Makefile 編譯專欄導(dǎo)讀】 下篇文章:【ARM 嵌入式 編譯 Makefile 系列 2.1 - Makefile info,warn, error 打印詳細(xì)介紹】 上篇文章:【ARM 嵌入式 編譯 Makefile 系列 1 - Makefile 如何調(diào)用 shell 腳本】 在Makefile中,我們可以使用echo命令來(lái)打印信息。這種方法適用于大多數(shù)的 UNI

    2024年02月12日
    瀏覽(47)
  • 【ARM 嵌入式 編譯系列 10.3 -- GNU elfutils 工具小結(jié)】

    請(qǐng)閱讀 【ARM GCC 編譯專欄導(dǎo)讀】 上篇文章:【ARM 嵌入式 編譯系列 10.2 – 符號(hào)表與可執(zhí)行程序分離詳細(xì)講解】 下篇文章:【ARM 嵌入式 編譯系列 11 – GCC attribute ((packed))詳細(xì)介紹】 GNU elfutils是一個(gè)開(kāi)源的工具集,用于處理 ELF (Executable and Linkable Format)格式的可執(zhí)行文件、

    2024年02月13日
    瀏覽(25)
  • 【ARM 嵌入式 編譯系列 3.4 -- libgcc.a 詳細(xì)介紹】

    【ARM 嵌入式 編譯系列 3.4 -- libgcc.a 詳細(xì)介紹】

    請(qǐng)閱讀 【嵌入式開(kāi)發(fā)學(xué)習(xí)必備專欄 之 ARM GCC 編譯專欄】 libgcc 是GCC的一部分。C語(yǔ)言不僅僅是由編譯器構(gòu)成,還包括了一個(gè)標(biāo)準(zhǔn)庫(kù)。編譯器在 GCC包里 ,標(biāo)準(zhǔn)庫(kù)則位于 GNU C庫(kù)里 ,即glibc包里。C編譯器(cc1)肯定是要依賴 glibc庫(kù)才能正常運(yùn)行。 但是編譯器本身還使用了一個(gè)內(nèi)部

    2024年01月20日
    瀏覽(23)
  • 【ARM 嵌入式 編譯系列 10 -- GCC 編譯縮減可執(zhí)行文件 elf 文件大小】

    請(qǐng)閱讀 【ARM GCC 編譯專欄導(dǎo)讀】 上篇文章:ARM 嵌入式 編譯系列 9-- GCC 編譯符號(hào)表(Symbol Table)的詳細(xì)介紹 下篇文章:ARM 嵌入式 編譯系列 10.1 – GCC 編譯縮減可執(zhí)行文件 elf 文件大小 在開(kāi)發(fā)過(guò)程總,總是希望編譯出來(lái)的可執(zhí)行文件盡量小,因?yàn)檫@樣可以節(jié)省更多的磁盤(pán)空間

    2024年02月09日
    瀏覽(119)
  • 【ARM 嵌入式 編譯系列 3.6 -- 刪除lib中的某個(gè)文件】

    請(qǐng)閱讀 【嵌入式開(kāi)發(fā)學(xué)習(xí)必備專欄 之 ARM GCC 編譯專欄】 比如,如果要?jiǎng)h除 libc.a 靜態(tài)庫(kù)中的特定對(duì)象文件并重新使用這個(gè)靜態(tài)庫(kù),在終端中可以使用 ar 命令。 ar 是一個(gè)歸檔工具,它可以創(chuàng)建、修改、提取以及列出歸檔庫(kù)文件(如 .a 文件)的內(nèi)容。 下面是刪除 libc.a 中指定

    2024年01月25日
    瀏覽(50)
  • 【ARM 嵌入式 編譯系列 7.3 -- GCC 鏈接腳本中 DISCARD 與 .ARM.exidx】

    【ARM 嵌入式 編譯系列 7.3 -- GCC 鏈接腳本中 DISCARD 與 .ARM.exidx】

    請(qǐng)閱讀 【嵌入式開(kāi)發(fā)學(xué)習(xí)必備專欄 之 ARM GCC 編譯專欄】 在移植 RT-Thread 到 cortex-m33(RA4M2)上的時(shí)候,在編譯的時(shí)候遇到下面問(wèn)題:

    2024年01月23日
    瀏覽(73)
  • 【ARM 嵌入式 編譯系列 2.5 -- GCC 編譯參數(shù)學(xué)習(xí) --specs=nano.specs選項(xiàng) 】

    請(qǐng)閱讀 【嵌入式開(kāi)發(fā)學(xué)習(xí)必備專欄 之 ARM GCC 編譯專欄】 ARM 工具鏈 ( arm-none-eabi- ) 包括了一個(gè)叫作 --specs 的編譯器和鏈接器選項(xiàng),這個(gè)選項(xiàng)允許用戶指定一個(gè)或多個(gè) “specs” 文件,以影響編譯或鏈接階段的行為。Specs 文件包含一系列的命令行參數(shù),這些參數(shù)可以是編譯器選項(xiàng)

    2024年01月22日
    瀏覽(28)
  • 【ARM 嵌入式 編譯系列 5 -- GCC 內(nèi)建函數(shù) __builtin 介紹】

    請(qǐng)閱讀 【ARM GCC 編譯專欄導(dǎo)讀】 上篇文章:ARM 嵌入式 編譯系列 4.2 – GCC 鏈接規(guī)范 extern “C“ 介紹 下篇文章:ARM 嵌入式 編譯系列 6 – GCC objcopy, objdump, readelf, nm 介紹 GCC提供了一些專門(mén)的功能,用于訪問(wèn)特定的硬件指令或者實(shí)現(xiàn)特定的優(yōu)化,它們被稱為\\\" __builtin \\\"函數(shù)。 這些

    2024年02月13日
    瀏覽(96)
  • 【ARM 嵌入式 編譯系列 4.2 -- GCC 鏈接規(guī)范 extern “C“ 介紹】

    請(qǐng)閱讀 【ARM GCC 編譯專欄導(dǎo)讀】 上篇文章:ARM 嵌入式 編譯系列 4.1 – GCC 編譯屬性 likely與unlikely 學(xué)習(xí) 下篇文章:ARM 嵌入式 編譯系列 5 – GCC 內(nèi)建函數(shù) __builtin 介紹 extern “C” 是一種鏈接規(guī)范,它用于告訴C++編譯器按照C語(yǔ)言的方式來(lái)鏈接代碼。這個(gè)主要用于在C++代碼

    2024年02月13日
    瀏覽(54)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包