《ARM Architecture Reference Manual ARMv8-A》里面有Memory層級框架圖,從中可以看出L1、L2、DRAM、Disk、MMU之間的關系,以及他們在整個存儲系統中扮演的角色。
涉及到的相關文檔有:
《ARM Architecture Reference Manual ARMv8-A》:E2 The AArch32 Application Level Memory Model和G3 The AArch32 System Level Memory Model兩個章節,從總體架構上介紹了ARMv8-A Memory系統。
《Cortex-A53 TRM》:6 Level 1 Memory System、5 Memory Management Unit、7 Level 2 Memory System三個章節介紹了MMU/L1/L2三個模塊在A53上的實現。
具體到MMU:
《MMU-500 TRM》:MMU-500技術參考手冊。
《ARM SMMUv2》:System MMU 架構規格 version 2.0。
具體到L2:
《L2C-310 TRM》:L2控制器技術參考手冊。
在Linux內核中查看L1/L2/L3緩存:
lscpu
...
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 6144K
...
或者讀取節點:
cat /sys/devices/system/cpu/cpu0/cache/indexx/size
cat /sys/devices/system/cpu/cpu0/cache/indexx/level
ARM Architecture Reference Manual ARMv8
ARM Corelink MMU-500 System Memory Management Unit Revision r2p4
1 Introduction
VA:Virtual Address
PA:Physical Address
IPA:Intermediate Physical Address
MMU-500是系統級的存儲管理單元,它基于自身寄存器和轉換表中的地址映射和存儲器屬性,將虛擬地址轉換成物理地址。
將這個轉換過程分為兩個階段:
Stage 1 - 將輸入的VA轉換成PA或者IPA輸出。
Stage 2 - 將IPA轉換成PA。
或者結合Stage 1和Stage 2將輸入的VA->IPA->PA。
MMU-500可以將 轉換表查找結果緩存到TLB中。
MMU-500包含一下主要部件:
TBU(Translation Buffer Unit) - 包含緩存頁表的TLB,MMU-500給每個Master配置了一個TBU,專屬于Master。
TCU(Translation Control Unit) - 控制和管理地址轉換,一個MMU-500僅包含一個TCU。
Interconnect - 多TBU到TCU之間的連接。
Master可能包括GPU、Video engines、DMA Controller、LCD Controller、Network Controller等。
2 Functional description
2.1 About the functions
從Figure 1-1可知,一個MMU有多個TBU和一個TCU。TBU包含TLB,主要用于緩存經常使用的地址范圍;TCU主要查找頁表。
2.2 Interfaces
L2 Cache
摘錄A53規格書中關于L2 Cache一段屬性描述:
Optional tightly-coupled L2 cache that includes:
— Configurable L2 cache size of 128KB, 256KB, 512KB, 1MB and 2MB.---多種大小可配置
— Fixed line length of 64 bytes.------------------------------------每條Cache Line大小是64Bytes
— Physically indexed and tagged cache.
— 16-way set-associative cache structure.
— Optional ACP interface if an L2 cache is configured.
— Optional ECC protection
Cache Line可以簡單的理解為CPU Cache中的最小緩存單位。
大小為64Bytes大小的Cache Line,128KB的L2 Cache,一共有128KB/64B=2048個Cache Line。
那么Cache存放規則是什么呢?Fully Associative、Direct Mapped、N-Way Set Associative。
Fully Associative是全關聯的意思:如果在一個Cache集內,任何一個地址的數據都可以緩存在任何一個Cache Line里,那么我們稱這個Cache是Fully Associative。
給一個內存地址,要知道他是否存在于Cache中,就需要遍歷所有Cache Line并比較緩存內容的地址。
Direct Mapped給定一個內存地址,就唯一確定了一條Cache Line。以4GB內存空間,128KB L2 Cache,64B Cache Line,那么4GB/(128KB/64B)=2MB共用一條Cache Line,使用率太低。
N-Way Set Associative是吧一個緩存按照N個Cache Line作為一組(Set),緩存按組劃為等分。
同樣以上面32位系統中L2 Cache規格為例,低6位是Cache Line中的偏移量;128KB/16/64B=128,中間7位表示Cache組號(Set Index);剩余高19位就是內存地址的唯一ID。
給定一個內存地址可以唯一對應一個Set,對于Set中只需遍歷16個元素就可以確定對象是否在緩存中。
128KB的Cache,分成128個Set;一個Set包含16根Cache Line;每根Cache Line大小64Byte。
即在連續內存地址中每Cache Line Offset+Set Index長度8KB就會出現一個處于同一Cache Set的緩存對象,爭搶一個僅有16個空位的緩存池。
每Cache Line Offset+Set Index+16 Way=128KB才會導致一個Set內的Conflict。
《關于CPU Cache -- 程序猿需要知道的那些事》
《2.2 Cache的組成結構》
《CACHE的一些基本概念》
《7個示例科普CPU Cache line》
《cpu性能探究-Linux Cache機制》
《深入理解Cache》
L2C-310在Linux
archarmmmcache-l2x0.c
#
# Processor Type
#
CONFIG_CPU_V7=y
CONFIG_CPU_32v6K=y
CONFIG_CPU_32v7=y
CONFIG_CPU_ABRT_EV7=y
CONFIG_CPU_PABRT_V7=y
CONFIG_CPU_CACHE_V7=y
CONFIG_CPU_CACHE_VIPT=y
CONFIG_CPU_COPY_V6=y
CONFIG_CPU_TLB_V7=y
CONFIG_CPU_HAS_ASID=y
CONFIG_CPU_CP15=y
CONFIG_CPU_CP15_MMU=y
#
# Processor Features
#
CONFIG_OUTER_CACHE=y
CONFIG_OUTER_CACHE_SYNC=y
CONFIG_MIGHT_HAVE_CACHE_L2X0=y
CONFIG_CACHE_L2X0=y
CONFIG_CACHE_PL310=y
CONFIG_ARM_L1_CACHE_SHIFT_6=y
CONFIG_ARM_L1_CACHE_SHIFT=6
CONFIG_ARM_DMA_MEM_BUFFERABLE=y
CONFIG_ARM_NR_BANKS=8
CONFIG_CPU_HAS_PMU=y
CONFIG_MULTI_IRQ_HANDLER=y
# CONFIG_ARM_ERRATA_430973 is not set
# CONFIG_ARM_ERRATA_458693 is not set
# CONFIG_ARM_ERRATA_460075 is not set
CONFIG_PL310_ERRATA_588369=y
CONFIG_ARM_ERRATA_720789=y
CONFIG_PL310_ERRATA_727915=y
CONFIG_ARM_ERRATA_743622=y
CONFIG_ARM_ERRATA_751472=y
CONFIG_PL310_ERRATA_753970=y
CONFIG_ARM_ERRATA_754322=y
CONFIG_PL310_ERRATA_769419=y
# CONFIG_ARM_ERRATA_775420 is not set
# CONFIG_FIQ_DEBUGGER is not set
在setup_processor中將cache相關操作函數賦給cpu_cache,同時還包括cpu_tld和cpu_user。
start_kernel-->
setup_arch-->
setup_processor-->
static void __init setup_processor(void)
{
...
list = lookup_processor_type(read_cpuid_id());
...
processor = *list->proc;
cpu_tlb = *list->tlb;
cpu_user = *list->user;
cpu_cache = *list->cache;
...
}
內核對這些函數的使用又進行了封裝,同時對應底層匯編(以v7為例)。在arch/arm/mm/proc-v7.S中實現了匯編函數。
extern struct cpu_cache_fns cpu_cache;
#define __cpuc_flush_icache_all cpu_cache.flush_icache_all
#define __cpuc_flush_kern_all cpu_cache.flush_kern_all
#define __cpuc_flush_user_all cpu_cache.flush_user_all
#define __cpuc_flush_user_range cpu_cache.flush_user_range
#define __cpuc_coherent_kern_range cpu_cache.coherent_kern_range
#define __cpuc_coherent_user_range cpu_cache.coherent_user_range
#define __cpuc_flush_dcache_area cpu_cache.flush_kern_dcache_area
/*
* These are private to the dma-mapping API. Do not use directly.
* Their sole purpose is to ensure that data held in the cache
* is visible to DMA, or data written by DMA to system memory is
* visible to the CPU.
*/
#define dmac_map_area cpu_cache.dma_map_area
#define dmac_unmap_area cpu_cache.dma_unmap_area
#define dmac_flush_range cpu_cache.dma_flush_range
關于TCM
TCM(Tighyly Coupled Memory,緊耦合內存)是一個固定大小的RAM,緊密地耦合至處理器內核,提供與cache相當的性能。
相比于cache的有點是,程序代碼可以精確地控制什么函數或什么代碼放在哪兒。當然TCM永遠不會被踢出主存儲器,他會有一個用戶預設性能,而不是cache那樣是統計特性的提高。
TCM對于以下幾種情況的代碼是非常有用、也是需要的:可預見的實時處理(中斷處理)、時間可預見(加密算法)、避免cache分析(加密算法)、或者只是要求高性能的代碼(編解碼功能)。
隨著cache大小的增加以及總線性能的規模,TCM將會變得越來越不重要,但是他提供了一個讓你權衡的機會。
如何使用TCM?
再支持TCM的處理上,包含頭文件#include
使用__tcmdata、__tcmconst、__tcmfunc、__tcmlocalfunc修飾符,將變量、函數放到特定的tcm段中。
還可以使用tcm_alloc/tcm_free申請釋放內存。
延伸閱讀:
《對ARM緊致內存TCM的理解》- 關于TCM的介紹,以及和Cache相比的優劣。
《內核中tcm(arm)與sram代碼》- 如何使用TCM。
上一篇:S3c2410裸板程序入門---單按鍵(一)
下一篇:在ARM64位開發板上兼容ARM32位的可執行程序
推薦閱讀
史海拾趣
近年來,電子行業面臨著成本上升、全球不穩定以及經濟動蕩等多重挑戰。FCT electronic公司憑借其在撓性電路板領域的深厚積累,積極應對這些挑戰。公司加強了對供應鏈的管理,提高了生產效率,降低了成本。同時,FCT electronic公司還加大了對研發的投入,推動產品向高端化、智能化方向轉型升級。這些努力使FCT electronic公司在行業中保持了領先地位。
隨著云計算和大數據技術的興起,計算機行業迎來了新一輪的變革。Computer Conversions Corp公司迅速調整戰略,開始研發與云計算相結合的新型轉換設備。通過不斷地技術革新和產品迭代,公司成功推出了一系列高效、穩定的云計算轉換解決方案,幫助眾多企業順利遷移到了云平臺,從而保持了在行業中的領先地位。
隨著全球化趨勢的加強,CTS公司開始積極拓展國際市場。公司在全球范圍內設立了多個生產基地和銷售網絡,以便更好地服務全球客戶。同時,CTS還加強了與國際知名企業的合作,共同推動電子行業的發展。
在快速發展的同時,ERGOBAHCO公司始終不忘履行社會責任和推動可持續發展。公司積極參與社會公益事業,捐款捐物支持貧困地區的教育、醫療等事業。同時,ERGOBAHCO公司還注重環保和節能減排工作,通過引進先進的環保技術和設備,實現了生產過程的綠色化、低碳化。這些舉措不僅提升了公司的社會形象,也為公司的可持續發展奠定了堅實基礎。
自1981年成立以來,ECE公司始終將技術創新作為發展的核心驅動力。早期,公司專注于電子元器件的研發和生產,通過引進國際先進技術,并結合本地市場需求進行創新,成功推出了一系列具有競爭力的產品。隨著技術的不斷進步,ECE公司不斷加大研發投入,積極探索新的應用領域,逐漸成為電子行業的領軍企業。
1.安全性能 影響最大的是爆炸和漏液,主要與電池的內壓、結構和工藝設計有關(比如安全閥失效、鋰離子電池沒有保護電路等)。 2.容量 按照IEC標準和國標規定,鎳氫和鎳鎘電池是指在25±5℃的條件下,以0.1C充電16小時,以0.2C放電 ...… 查看全部問答∨ |
|
有人說單片機在驅動led燈時候,不管程序如何控制都要在單片機端口上(不只是P0口)加上下拉電阻,上電復位到程序運行總是有間隔的,如果不加電阻在這段時間內會在IO口上產生一個沖擊的。 從來沒考慮過這個問題,只是在P0口和在驅動三極管的時候再 ...… 查看全部問答∨ |
|
大家好: 主程序如下: main: nop nop nop ;-----------------開始判斷鍵值 ;main_loop01:cjne a,#1,main_loop02 ljmp main 這樣是不是說一直主程序在main 函數里循環,不會跳到下面的程序段里?還有中間的;main_loop01:cjne a,#1,main_lo ...… 查看全部問答∨ |
|
在Manage Catalog Features導入.cec,但在New Platform Wizard中沒有見到相關的BSPs,膽在CEC Editor里可以看到相關的信息;請問這是什么問題,應如何解決?… 查看全部問答∨ |
|
各位大俠 我用的STVD編譯器 為什么只有io相關寄存器可以設置其他寄存器都不可以設置呢??比如執行完 TIM2_CR1 = 0x01; 后 查看寄存器 TIM2_CR1 的值依然是0 用的是STM8L152C6 單片機 還有S ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 利用STM32MP1和STM32MP2在嵌入式 Linux 平臺上部署有效的安全保護機制
- 超小但強大:MCU 的小尺寸封裝和集成如何幫助優化空間受限的設計
- 德州儀器推出全球超小型 MCU,助力微型應用創新
- Microchip推出電動兩輪車(E2W)生態系統,加速電動出行創新
- 意法半導體推出STM32U3微控制器,面向遠程、智能和可持續應用,拓展超低功耗系列創新
- (一) ECloudIDE入門STM32-CubeMX工程創建與導入
- (二)ECloudIDE入門STM32-官方寄存器版例程使用
- Simulink STM32F407VGT6實現硬件在環
- openharmony:hilog_lite組件移植