ARM 學習筆記(三)

參考文獻:《ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition》
《ARM Cortex-A (ARMv7-A) Series Programmer’s Guide》

1、內存類型

ARMv7-A 處理器中,將 Memory 定義為幾種類型(Memory Type):

  • Strongly-ordered
  • Normal
  • Device

2、Normal memory

2.1 Non-shareable

Normal memory must also be designated either as Shareable or Non-Shareable. A region of Normal memory with the Non-Shareable attribute is one that is used only by this core. There is no requirement for the core to make accesses to this location coherent with other cores. If other cores do share this memory, any coherency issues must be handled in software. For example, this can be done by having individual cores perform cache maintenance and barrier operations.
——————《ARM Cortex-A (ARMv7-A) Series Programmer’s Guide》

對于 Normal memory 類型的內存區域:

  • 必須指定為 Shareable 或 Non-Shareable

  • 如果它被標記為 Non-Shareable:

    • 硬件不會保證這塊內存在多個核心之間的數據一致性
    • 默認認為只有當前核心在使用這塊內存
    • 如果實際上多個核心訪問這塊內存,那就必須靠軟件來保證一致性,比如通過緩存管理(清除/失效)、內存屏障(DMB/DSB/ISB)、通信協議等手段來同步數據

既然 Non-Shareable 需要手動維護一致性,那它存在的意義和優勢是什么?

實際上,Non-Shareable 并不是沒有用,而是出于以下幾個考慮,它在某些場景下非常有意義:

? 一、性能更高
在多核系統中,如果你使用 Shareable memory(尤其是 SMP 系統中的 Inner Shareable):

  • 每次訪問緩存行都可能觸發硬件級的 cache coherency 協議(如 MESI、MOESI 等);
  • 這會引入額外的 總線/互聯傳輸負擔 和 延遲;
  • 也可能導致 cache line bouncing,尤其當多個核頻繁修改同一個變量時。

而使用 Non-Shareable memory:

  • 硬件默認只在當前核心訪問,不涉及其它核;
  • 避免了不必要的 cache coherency 操作;
  • 訪問更快,cache 命中率更高,延遲更低;
  • 適合性能敏感、訪問頻繁、無需共享的私有數據。

? 二、明確分工與控制
Non-Shareable 強制開發者:

  • 明確哪些內存區域是只在本核使用的;
  • 哪些區域需要小心處理共享和同步;
  • 有助于提升系統結構的清晰度和可維護性;
  • 對一些實時性要求高的系統(RTOS)非常有用,避免因不必要的一致性導致時間不確定性。

2.2 Inner Shareable, and Outer Shareable

A region of Normal memory with the Shareable attribute is one for which data accesses to memory by different observers within the same shareability domain are coherent
——————《ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition》

??具有 Shareable 屬性的 Normal memory 區域,其特點是:在同一共享域內的不同觀察者對該內存的數據訪問是一致的。

??在 ARMv7 架構中,可共享屬性(Shareability Attributes)用于定義一組觀察者(Observers),使得 data or unified caches 對特定訪問透明化。這些觀察者的集合被稱為可共享域(Shareability Domains),其具體行為由系統實現決定。以下通過示例說明其應用場景:

舉一個案例:

某虛擬內存系統架構(VMSA)的實現包含 two clusters of processors,需滿足以下要求:

  • 對于每個 clusters :若數據訪問標記為 Inner Shareable,則集群內所有處理器的 data or unified caches 對該訪問透明(即緩存一致性自動維護)
  • 兩個 cluster 之間:
    • 僅標記為 Inner Shareable 的訪問無法跨集群維護緩存透明性
    • 標記為 Outer Shareable 的訪問則能在兩個集群間實現緩存透明。此時,每個集群構成獨立的 Inner Shareable 域,而整個子系統屬于同一個 Outer Shareable 域。

若系統包含多個此類子系統,且子系統間的緩存互不透明,則每個子系統將形成獨立的 Outer Shareable 域。

為什么需要分層設計?
設置兩個層次的可共享性屬性(Inner Shareable 和 Outer Shareable)意味著系統設計者可以減少對于不需要參與 Outer Shareable 域的共享內存區域的性能與功耗開銷。

  • 多級共享域的設計允許系統更靈活地控制共享粒度;
  • 如果某塊內存只在一個 CPU cluster 內共享,就設置為 Inner Shareable,避免跨 cluster 的 coherency 同步開銷;
  • 避免不必要的 Outer Shareable 標記 → 減少 coherency 機制觸發 → 更高效、節能。

In a VMSA implementation, for Shareable Normal memory, whether there is a distinction between Inner Shareable and Outer Shareable is IMPLEMENTATION DEFINED
——————《ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition》

??需要注意的是,在 VMSA(虛擬內存系統架構)的實現中,對于 Shareable 類型的 Normal memory,是否區分 Inner Shareable 和 Outer Shareable 是由具體實現決定的(實現自定義)。

??對于 Shareable 類型的 Normal memory,Load-Exclusive 和 Store-Exclusive(即 LDREX/STREX)同步原語會考慮到同一 shareability 域內多個觀察者可能同時訪問該地址的情況

  • ARM 的原子指令(如 LDREX/STREX)依賴于共享域概念;
  • 若兩個核在同一 Inner Shareable 域內,它們的原子操作會被視為相關;
  • 如果不在同一共享域中,它們可能不會觀察到彼此的修改 → 可能導致同步失敗。

??系統設計者可以使用 Shareable 屬性來指定哪些 Normal memory 區域需要具備緩存一致性的要求。但為了便于軟件移植,軟件開發人員不能因為某塊內存被標記為 Non-shareable,就假設多個處理器之間訪問該內存一定是非一致性的。

  • 也就是說,Non-shareable ≠ 一定不一致;
  • 有些系統中,Non-shareable 的內存可能也通過某種方式被多個核緩存一致;
  • 所以不能依賴 Non-shareable 來推導“多個核訪問時不一致”的行為;

This architecture is written with an expectation that all processors using the same operating system or hypervisor are in the same Inner Shareable shareability domain
——————《ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition》

本架構(ARMv7-A)假設:所有運行在同一操作系統或同一 hypervisor 下的處理器,屬于同一個 Inner Shareable 共享域。

2.3 Write-Through、Write-Back、Non-cacheable

??在 ARMv7 架構中,除了 Shareability(可共享性)(Outer Shareable / Inner Shareable / Non-shareable)之外,Normal Memory(普通內存) 還需要設置 Cacheability(緩存屬性),以決定 CPU 如何緩存該內存區域。

緩存屬性主要分為以下三種:

  • Write-Through Cacheable.
    • A cache in which when a cache hit occurs on a store access, the data is written both to the cache and to main memory.
      This is normally done via a write buffer, to avoid slowing down the processor
  • Write-Back Cacheable.
    • A cache in which when a cache hit occurs on a store access, the data is only written to the cache. Data in the cache
      can therefore be more up-to-date than data in main memory. Any such data is written back to main memory when
      the cache line is cleaned or reallocated. Another common term for a write-back cache is a copy-back cache
  • Non-cacheable
    • 這個比較好理解,就是內存不帶 cache,即對這塊內存的訪問,不會經過 cache

In some cases, the use of Write-Through Cacheable or Non-cacheable regions of memory might provide a better mechanism for controlling coherency than the use of hardware coherency mechanisms or the use of cache maintenance routines
——————《ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition》

??在某些情況下,使用 Write-Through 緩存策略或 Non-cacheable 的內存區域,可能比依賴硬件緩存一致性機制或緩存維護指令,更適合作為控制一致性的一種機制。用合理的緩存策略(Memory Attributes)來“避免麻煩”,可能比“處理麻煩”更好。

3、 Device and Strongly-ordered memory

3.1 概念

??在 ARMv7 架構中,設備內存(Device Memory) 和 強序內存(Strongly-ordered Memory) 通常用于映射內存映射外設(Memory-mapped Peripherals) 和 I/O 地址空間(I/O Locations)。

System peripherals will almost always be mapped as Device memory.
——————《ARM Cortex-A (ARMv7-A) Series Programmer’s Guide》

??對于處理器顯式訪問標記為 Device 或 Strongly-ordered 的內存區域,需遵循以下規則:

  • 訪問大小嚴格匹配程序定義:所有訪問必須按照程序中指定的數據寬度(如 8 位、16 位、32 位)執行,不可拆分或合并。
    • 對 Device/Strongly-ordered 內存的每次訪問(如 STR/LDR)必須作為一個完整單元執行。例如,32 位寄存器寫入不可拆分為兩個 16 位寫入。
  • 訪問次數嚴格匹配程序定義:訪問次數必須與程序指定的次數一致,不可因優化而增減。
    • 編譯器/硬件不得對這類內存進行訪問合并(如合并相鄰寫操作)或冗余訪問消除(如省略重復讀操作)

硬件實現限制:
除非由于異常(Exception)(如中斷、缺頁)導致額外訪問,否則處理器不得對 Device 或 Strongly-ordered 內存執行比程序順序執行所規定的更多訪問。本節將討論異常對訪問行為的允許影響。

從上面這些分析可以看出,ARMv7 對 Device/Strongly-ordered 內存的嚴格訪問規則,確保了硬件寄存器和關鍵 I/O 操作的可預測性

下面再總結下,Device and Strongly-ordered memory 的一些特性:

  • The architecture does not permit speculative data accesses to memory marked as Device or Strongly-ordered
  • The architecture does not permit unaligned accesses to Strongly-ordered or Device memory
  • Address locations marked as Device or Strongly-ordered are never held in a cache
  • In the ARMv7 architecture, the core can re-order Normal memory accesses around Strongly-ordered or Device memory accesses

3.2 Device and Strongly-ordered 區別

第一個區別就是共享域的區別:

  • a region of Device memory can be described as one of
    • Outer Shareable Device memory.
    • Inner Shareable Device memory.
    • Non-shareable Device memory
  • Strongly ordered memory regions are always shareable

關于 shareable,ARMv7 手冊中有這樣一段描述:

ARM deprecates the marking of Device memory with a shareability attribute other than Outer Shareable or Shareable. This means ARM strongly recommends that Device memory is never assigned a shareability attribute of Non-shareable or Inner Shareable
——————《ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition》

??ARM 不建議你對 Device memory 設置為除了 “Outer Shareable” 或早期架構中通用的 “Shareable” 之外的任何 shareability 屬性。尤其要避免使用 “Inner Shareable” 或 “Non-shareable”。


第二個區別就是完成時的區別:

The only architecturally-required difference between Device and
Strongly-ordered memory is that:

  • A write to Strongly-ordered memory can complete only when it reaches the peripheral or memory component accessed by the write.
  • A write to Device memory is permitted to complete before it reaches the peripheral or memory component accessed by the write.

??上面這個說法是官方的意思,我理解一下,應該是 Strongly-ordered 不惜犧牲性能,去做保序的要求,一定要實際訪問到外設,而 Device 類型的訪問指令,可能還在路上(流水線中);

4、總結

4.1 關于 Inner Shareable, and Outer Shareable 的疑惑

??關于 Inner Shareable, and Outer Shareable 屬性,初學者經常會疑惑,這兩個屬性是從什么角度去定義的?從上面的分析來看,是從 cahce 一致性角度來定義的?直接上結論:

??Shareable 確實和 cache 一致性密切相關。但 Shareable 的概念并不僅限于 Normal memory,它是一種通信語義或訪問語義的定義,用來告訴處理器系統(包括緩存子系統、互聯、總線和外設)這個區域是否可能被多個觀察者訪問

??例如,Device 類型的 memory,雖然不帶 cache,但是也有 Inner Shareable, and Outer Shareable 屬性。

  • Device memory 是不能被緩存的,所以 Shareable 與否不會影響緩存行為。
  • 但是在 Barrier(內存屏障)語義中,Shareable 的 Device memory 和 Non-shareable 的 Device memory 是不一樣的:
    • DMB 等指令中的 Shareable,就是在說:“這個屏障要作用于 Shareable 范圍內所有可能看到這個地址空間的主體。”
    • 比如 CPU 和 DMA 共享一個外設寄存器區,這個區域應該標記為 Device + Shareable,這樣 DMB 可以保證這些外設訪問的順序一致性。

ARM 中的內存屏障指令 DMB

#define dma_wmb()	dmb(oshst)
#define __smp_wmb()	dmb(ishst)
  • ISHST
    DMB operation that waits only for stores to complete, and only to the inner shareable domain
  • OSHST
    DMB operation that waits only for stores to complete, and only to the outer shareable domain

??我們要明白,Shareable 并不等于“能被多個主體訪問”,而是告訴系統:這個 memory 區域的訪問順序、一致性、barrier 等行為可能涉及多個 observer,系統必須尊重這點。

4.2 注意項

??有一點非常重要:內存類型(如 Normal、Device、Strongly-Ordered)并不會對整個指令流的執行順序產生可靠影響,它們只對內存訪問的順序產生影響

  • 指令的執行順序 ≠ 內存訪問的順序
  • 內存類型(如 Device、Normal)只能控制 load/store 的順序
  • 想要確保 某個寫操作之后再執行某條指令 → 你得用 DMB, DSB, ISB 這類內存屏障指令
  • 千萬不要以為 “把內存設成 Strongly-Ordered,就等于所有指令順序都被保留了” ——這只是內存訪問順序的保證,不是執行語義的全局保證

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

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

相關文章

Flask 框架(一):核心特性與基礎配置

目錄 一、為什么選擇 Flask? 二、Flask 核心概念與初始化 2.1 程序實例初始化 2.2 運行配置:app.run () 參數詳解 2.3 應用配置:三種參數設置方式 1. 字典直接配置(簡單臨時場景) 2. 配置文件導入(生…

社交圈子系統開源社交源碼 / 小程序+H5+APP 多端互通的底層技術分析

伴隨社交產品向“圈子化”、“內容驅動”發展方向演進,打造一套支持小程序、H5、APP 互通的社交圈子系統,已經成為構建垂直社區的基礎架構能力要求。本文圍繞一套典型的多端社交興趣平臺(即友貓社區平臺)的設計實踐,對…

gitlab-runner配置問題記錄

引言 筆者曾通過2種方式部署過 gitlab-runner,在 gitlab 中使用這個 runner 拉起 ci job 的過程中或多或少遇到些問題,主要都是 job 中無法訪問宿主機的docker 等組件。本篇文檔主要記錄 gitlab-runner 安裝及相關配置。 二進制部署 gitlab-runner 部署 …

每日面試題10:令牌桶

令牌桶算法:優雅的流量控制藝術在現代分布式系統中,流量控制如同交通信號燈般重要——它既不能讓請求"堵死"系統,也不能放任流量"橫沖直撞"。令牌桶算法(Token Bucket Algorithm)正是這樣一種精妙…

【java】消息推送

文章目錄Java網頁消息推送解決方案 短輪詢、長輪詢、SSE、Websocket

STM32 | 有源蜂鳴器響,無源蜂鳴器播音樂

目錄 Overview 有源蜂鳴器 無源蜂鳴器 有源蜂鳴器控制 GPIO配置 控制程序 無源蜂鳴器控制 反轉GPIO控制 GPIO配置 控制接口 PWM控制 GPIO配置 控制函數 改變頻率播音樂 原理 1. 頻率決定音調 2. 占空比決定音量 GPIO初始化 結構體定義和音符頻率表 播放接口 …

第十四章 gin基礎

文章目錄Gin快速搭建一個web服務Gin數據交互JSON串內容規范Gin使用結構體返回數據給前端Gin配置POST類型的路由Gin獲取GET請求參數Gin獲取POST請求參數-form-data類型Gin獲取POST請求參數-JSON類型Gin獲取參數綁定至結構體Gin快速搭建一個web服務 下載包 \\新建一個文件&…

Baumer工業相機堡盟工業相機如何通過YoloV8的深度學習模型實現PCB的缺陷檢測(C#代碼,UI界面版)

Baumer工業相機堡盟工業相機如何通過YoloV8的深度學習模型實現PCB的缺陷檢測(C#代碼,UI界面版)工業相機使用YoloV8模型實現PCB的缺陷檢測工業相機實現YoloV8模型實現PCB的缺陷檢測的技術背景在相機SDK中獲取圖像轉換圖像的代碼分析工業相機圖…

【Vivado那些事兒】AMD-XILINX 7系列比特流加密

前提:加密有風險,操作需謹慎前言在許多項目中,經過漫長的等待,我們的 FPGA 設計終于可以投入現場部署了。前期的資金的投入及知識產權的保護,我們需要對現場部署的 FPGA 進行比特流保護以防止逆向工程和未經授權的重復…

RK3588 安卓adb操作

adb(Android Debug Bridge)是一個用于與安卓設備進行通信和控制的工具。adb可以通過USB或無線網絡連接安卓設備,執行各種命令,如安裝和卸載應用,傳輸文件,查看日志,運行shell命令等。adb是安卓開…

【華為機試】70. 爬樓梯

文章目錄70. 爬樓梯描述示例 1示例 2提示解題思路核心分析問題建模算法實現方法1:動態規劃(標準解法)方法2:空間優化動態規劃(最優解)方法3:遞歸 記憶化方法4:數學公式(…

山東大學軟件學院面向對象期末復習

面向對象 文章目錄面向對象04 類封裝接口 抽象類05 消息,實例化,靜態變量方法消息動/靜態類型語言對象創建類及實例具有下面特征對象數組的創建靜態數據成員構造函數06_0 繼承繼承是向下傳遞的JAVA為什么不支持多重繼承繼承的形式特殊化繼承替換原則規范…

讓 Windows 用上 macOS 的系統下載與保姆級使用教程

模擬蘋果桌面軟件下載:https://xpan.com.cn/s/8NFAGT 還記得 Windows 11剛發布時,很多人就說“果里果氣"的,但界面確實做的漂亮。 不知道現在有多少小伙伴正用著macOS,不過我敢確定,喜歡macOS的人絕對不少&#…

嵌入式硬件篇---繼電器

繼電器是一種通過小電流控制大電流的電磁開關,廣泛應用于自動化控制、電力系統和電子設備中。以下從工作原理、應用場景和電路特點三個方面詳細介紹:一、工作原理繼電器本質是電磁控制的機械式開關,核心部件包括:線圈(…

鴻蒙網絡編程系列58-倉頡版TLS數字證書查看及驗簽示例

1. TLS數字證書驗簽簡介 數字證書的簽名驗證是網絡編程中一個重要的功能,它保證了數字證書是由可信任的簽發方簽署的,在此基礎上,我們才可以信任該證書,進而信任基于該證書建立的安全通道,所以說,數字證書…

【React Native】安裝配置 Expo Router

過去開發React Native,所使用的路由都是React Navigation。但是這個東西使用起來非常困難,配置無比繁瑣。Expo,為了簡化操作,就基于React Navigation開發了Expo Router。 Expo Router用起來就要簡單的多了,配置也相對…

美國VPS服務器Linux內核參數調優的實踐與驗證

美國vps服務器Linux內核參數調優的實踐與驗證在云計算和虛擬化技術日益普及的今天,美國VPS服務器因其穩定的網絡環境和優越的性價比,成為眾多企業和開發者的首選。Linux內核參數的默認配置往往無法充分發揮VPS的性能潛力。本文將深入探討美國VPS服務器上…

在Vscode中使用Kimi K2模型:實踐指南,三分鐘生成個小游戲

Kimi K2是一款基于多專家(MoE)架構的強大代碼與代理能力基礎模型。本文將通過在VS Code及其擴展Cline和RooCode中的實際應用,詳細說明如何使用Kimi K2-0711-preview模型。不得不說kimi這次的K2模型就是強大,在vscode中配置使用體驗…

基于SpringBoot+Uniapp球場預約小程序(騰訊地圖API、Echarts圖形化分析、二維碼識別)

“ 🎈系統亮點:騰訊地圖API、Echarts圖形化分析、二維碼識別”01系統開發工具與環境搭建前后端分離架構 項目架構:B/S架構 運行環境:win10/win11、jdk17前端: 技術:框架Vue.js;UI庫:…

windows + phpstorm 2024 + phpstudy 8 + php7.3 + thinkphp6 配置xdebug調試

windows phpstorm 2024 phpstudy 8 php7.3 thinkphp6 配置xdebug調試 下載配置phpstudyPhp.ini配置phpstorm配置xdebug運行一會就停了配置虛擬機 0localhost_90.conf 配置php.ini配置下載 在下面地址下載合適的xdebug 放到對應的php https://xdebug.org/wizard 配置phpst…