|
juq2oyobhrl64031919635.gif (60.41 KB, 下載次數(shù): 3)
下載附件
保存到相冊
juq2oyobhrl64031919635.gif
2024-9-21 21:47 上傳
2 D! [! y- X2 o: z" ]* \. P! A5 _
點擊上方藍色字體,關(guān)注我們$ T- @0 |4 o, L7 e* Z9 d- z
) n9 D |1 V# T' d
1$ L& i- @- ]* r% ?1 o" z7 I x0 p
微控制器 (MCU)7 v4 e) z5 Y9 z- ~
大多數(shù)微控制器 (MCU) 使用物理地址進行內(nèi)存訪問。MCU 通常是設(shè)計為簡單、資源有限的嵌入式設(shè)備,目標(biāo)是低功耗、低成本以及實時操作。
3 }: x F7 B' c9 D i3 `8 s4 E1 t5 _! |; M% v% ~& g* v
這些設(shè)備一般沒有復(fù)雜的內(nèi)存管理單元 (MMU) 來處理虛擬地址到物理地址的映射。因此,程序代碼和數(shù)據(jù)是直接通過物理地址訪問的。" H: ]# q" l' A e. O7 t
5 w" |5 k! m# F% J1 y
以常見的 STM32 系列微控制器為例:9 W# @, h2 V. y( [5 z8 g% B m
Flash 存儲器:通常從地址 0x08000000 開始。這個地址是物理地址,程序代碼通常存儲在這里。SRAM:通常從地址 0x20000000 開始。這個地址也是物理地址,用于數(shù)據(jù)存儲和堆棧操作。
, X% F# @, l4 _! O; h3 R# |- r) |' q2 p! K0 H4 l5 I3 T8 G; P6 t% @2 }
在編程時,當(dāng)開發(fā)者使用指針或訪問某個變量時,實際操作的是物理地址。例如:2 d$ m4 G, y- Z4 B
& g5 h( \! P. i/ {; l6 n/ r
#define LED_PIN (*(volatile uint32_t*)0x48000814) // 指定 GPIO 端口的物理地址 int main(void) { LED_PIN = 0x01; // 設(shè)置引腳電平為高 while (1);}& C7 ~6 K. U; B0 R
在這個例子中,0x48000814 是直接引用的物理地址,用于控制 MCU 上的 GPIO 引腳。; R# g8 O/ _* O9 l; Y! P. o
20 }0 J% `7 z l
系統(tǒng)級芯片 (SoC)( O8 L4 w% x7 p- ~9 d F: m
與 MCU 不同,系統(tǒng)級芯片 (SoC) 通常集成了更復(fù)雜的處理器內(nèi)核(例如 ARM Cortex-A 系列),并且可能運行如 Linux 這樣的操作系統(tǒng)。
' y2 w# F; _8 I
. Z2 I: t( a6 U) h1 T1 u這些 SoC 通常具有內(nèi)存管理單元 (MMU),能夠?qū)⑻摂M地址映射到物理地址。因此,虛擬地址是應(yīng)用程序通常使用的地址空間。
F: k! R) u% `) C$ I8 y+ ?
, ]% o! Q$ i1 `$ C1 O. c- g以 Raspberry Pi 這類基于 ARM Cortex-A 系列處理器的 SoC 為例:
2 q% i6 i" y9 D' N內(nèi)核態(tài)地址空間:在操作系統(tǒng)內(nèi)核中,內(nèi)核會管理物理內(nèi)存,內(nèi)核代碼通常可以直接訪問物理地址,但通常仍使用虛擬地址進行管理。用戶態(tài)地址空間:應(yīng)用程序在用戶態(tài)下運行,所有內(nèi)存訪問都是通過虛擬地址進行的。操作系統(tǒng)通過 MMU 將這些虛擬地址映射到實際的物理內(nèi)存。
- y# g4 o+ w# Q4 P5 v; t# g% `& |, }2 b0 ~# [: Y! U* e
C 語言示例如下:
6 U# r2 J* m6 f' R
- g$ S6 a4 M- H#include #include int main() { int *ptr = (int *)malloc(sizeof(int)); if (ptr == NULL) { fprintf(stderr, "內(nèi)存分配失。
u/ p; @& d) }' B3 L( g, h"); return 1; } *ptr = 123; printf("虛擬地址: %p, 值: %d0 v: Q" u: h% I1 a3 g b
", (void*)ptr, *ptr); free(ptr); return 0;}
" H- H3 \: Q* m' v3 }8 z5 ~在這個例子中,malloc 函數(shù)返回的指針 ptr 是一個虛擬地址。操作系統(tǒng)會通過 MMU 將其映射到物理內(nèi)存。應(yīng)用程序無需了解這個過程,操作系統(tǒng)自動管理虛擬地址和物理地址之間的映射關(guān)系。 R* z9 V+ Z# r# l; a
4 r! F3 p# J; X* q! H3 ?2 l Y- R9 PMCU 通常使用物理地址進行內(nèi)存訪問,因其設(shè)計簡單且資源受限,不具備復(fù)雜的內(nèi)存管理單元 (MMU)。SoC,特別是那些運行復(fù)雜操作系統(tǒng)的 SoC,如 ARM Cortex-A 系列,通常使用虛擬地址進行內(nèi)存管理,依賴 MMU 將虛擬地址映射到物理地址。
% H% Q7 ?. g6 h! C1 m& y
; K' s8 b8 M4 G8 K$ ^理解這兩者的差異對于開發(fā)嵌入式系統(tǒng)的程序時至關(guān)重要,因為內(nèi)存管理的復(fù)雜性和方式直接影響到程序的設(shè)計和調(diào)試方式。
. E# t* _' `" B, l' h/ c; F$ m0 X, I; q, C7 J2 F& Z+ f
x1o5tsoha1y64031919735.jpg (71.14 KB, 下載次數(shù): 1)
下載附件
保存到相冊
x1o5tsoha1y64031919735.jpg
2024-9-21 21:47 上傳
' O* a i9 U/ _( ?3 H e! {9 k
eif0p15bvpy64031919835.gif (45.46 KB, 下載次數(shù): 2)
下載附件
保存到相冊
eif0p15bvpy64031919835.gif
2024-9-21 21:47 上傳
1 v( Y6 c' w! `! \% M8 Q* c0 k
點擊閱讀原文,更精彩~ |
|