|
juq2oyobhrl64031919635.gif (60.41 KB, 下載次數(shù): 2)
下載附件
保存到相冊(cè)
juq2oyobhrl64031919635.gif
2024-9-21 21:47 上傳
/ y$ ?$ S/ n. A
點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
) H4 j" d/ I- l; x L! C/ V9 O
: O& X ~6 y5 Y; q1* F1 A. e% z9 q( \7 g5 L+ A9 ?
微控制器 (MCU)) f. z0 y1 H3 D4 L+ G/ v3 k
大多數(shù)微控制器 (MCU) 使用物理地址進(jìn)行內(nèi)存訪問(wèn)。MCU 通常是設(shè)計(jì)為簡(jiǎn)單、資源有限的嵌入式設(shè)備,目標(biāo)是低功耗、低成本以及實(shí)時(shí)操作。
2 K$ c. f9 d: f' W& C; K0 S5 `% Z& Y! q1 t
這些設(shè)備一般沒(méi)有復(fù)雜的內(nèi)存管理單元 (MMU) 來(lái)處理虛擬地址到物理地址的映射。因此,程序代碼和數(shù)據(jù)是直接通過(guò)物理地址訪問(wèn)的。
6 e- ` d" p4 A# F* B. |( S1 u& S! h" U8 q
以常見(jiàn)的 STM32 系列微控制器為例:1 v0 l3 N# R0 U
Flash 存儲(chǔ)器:通常從地址 0x08000000 開(kāi)始。這個(gè)地址是物理地址,程序代碼通常存儲(chǔ)在這里。SRAM:通常從地址 0x20000000 開(kāi)始。這個(gè)地址也是物理地址,用于數(shù)據(jù)存儲(chǔ)和堆棧操作。
1 F% p- @% x M4 x" X4 B# p9 u
; ~0 l, L9 Y# X4 [8 x7 V% T' m& `( B在編程時(shí),當(dāng)開(kāi)發(fā)者使用指針或訪問(wèn)某個(gè)變量時(shí),實(shí)際操作的是物理地址。例如:
5 e8 o7 I) m% Z/ x+ U( `1 g8 c! X. | J4 t' Q7 s2 W5 v. q
#define LED_PIN (*(volatile uint32_t*)0x48000814) // 指定 GPIO 端口的物理地址 int main(void) { LED_PIN = 0x01; // 設(shè)置引腳電平為高 while (1);} Z! ~1 P3 P* z
在這個(gè)例子中,0x48000814 是直接引用的物理地址,用于控制 MCU 上的 GPIO 引腳。0 A3 g4 l. ~( u
2
' C7 u( M' q4 r, K6 o7 A系統(tǒng)級(jí)芯片 (SoC)
2 R7 g/ b- |) ~# V) m與 MCU 不同,系統(tǒng)級(jí)芯片 (SoC) 通常集成了更復(fù)雜的處理器內(nèi)核(例如 ARM Cortex-A 系列),并且可能運(yùn)行如 Linux 這樣的操作系統(tǒng)。
% q+ W1 j) D) W8 o- b, b9 n
. \7 ^+ o+ ^8 C這些 SoC 通常具有內(nèi)存管理單元 (MMU),能夠?qū)⑻摂M地址映射到物理地址。因此,虛擬地址是應(yīng)用程序通常使用的地址空間。
# Y" s% |4 j( d6 j% v
# W) C4 g4 e5 b4 c) J; Q以 Raspberry Pi 這類基于 ARM Cortex-A 系列處理器的 SoC 為例:
. ^% |1 V) k) a( }內(nèi)核態(tài)地址空間:在操作系統(tǒng)內(nèi)核中,內(nèi)核會(huì)管理物理內(nèi)存,內(nèi)核代碼通常可以直接訪問(wèn)物理地址,但通常仍使用虛擬地址進(jìn)行管理。用戶態(tài)地址空間:應(yīng)用程序在用戶態(tài)下運(yùn)行,所有內(nèi)存訪問(wèn)都是通過(guò)虛擬地址進(jìn)行的。操作系統(tǒng)通過(guò) MMU 將這些虛擬地址映射到實(shí)際的物理內(nèi)存。
' a! [: |& D" t9 w
9 ?: k9 J0 L. aC 語(yǔ)言示例如下:
' J; H% E& W' Q0 \, L2 Q* Y& R2 T" i% c0 u2 z4 v$ x: N: L
#include #include int main() { int *ptr = (int *)malloc(sizeof(int)); if (ptr == NULL) { fprintf(stderr, "內(nèi)存分配失敗!5 ^/ h3 a4 F* M
"); return 1; } *ptr = 123; printf("虛擬地址: %p, 值: %d
; [' I: d9 Q' {* T", (void*)ptr, *ptr); free(ptr); return 0;}+ {- t: ~7 A+ _5 p8 C
在這個(gè)例子中,malloc 函數(shù)返回的指針 ptr 是一個(gè)虛擬地址。操作系統(tǒng)會(huì)通過(guò) MMU 將其映射到物理內(nèi)存。應(yīng)用程序無(wú)需了解這個(gè)過(guò)程,操作系統(tǒng)自動(dòng)管理虛擬地址和物理地址之間的映射關(guān)系。1 ^# x: X" L( ?5 W8 ], Q
$ s3 T7 M9 J& d# x
MCU 通常使用物理地址進(jìn)行內(nèi)存訪問(wèn),因其設(shè)計(jì)簡(jiǎn)單且資源受限,不具備復(fù)雜的內(nèi)存管理單元 (MMU)。SoC,特別是那些運(yùn)行復(fù)雜操作系統(tǒng)的 SoC,如 ARM Cortex-A 系列,通常使用虛擬地址進(jìn)行內(nèi)存管理,依賴 MMU 將虛擬地址映射到物理地址。" U1 b6 F2 ~- k2 T0 H U
; S5 w3 y6 u# d3 M( O
理解這兩者的差異對(duì)于開(kāi)發(fā)嵌入式系統(tǒng)的程序時(shí)至關(guān)重要,因?yàn)閮?nèi)存管理的復(fù)雜性和方式直接影響到程序的設(shè)計(jì)和調(diào)試方式。/ a& }" b- ^/ B9 g; Z9 I
, K% ?- Y Q4 `9 v* x2 X
x1o5tsoha1y64031919735.jpg (71.14 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
x1o5tsoha1y64031919735.jpg
2024-9-21 21:47 上傳
6 G; c$ U; @, z
eif0p15bvpy64031919835.gif (45.46 KB, 下載次數(shù): 2)
下載附件
保存到相冊(cè)
eif0p15bvpy64031919835.gif
2024-9-21 21:47 上傳
9 Z+ d) T& k+ u7 E( F, B點(diǎn)擊閱讀原文,更精彩~ |
|