電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 216|回復(fù): 0
收起左側(cè)

MCU和SoC內(nèi)存使用物理地址還是虛擬地址?

[復(fù)制鏈接]

514

主題

514

帖子

2920

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
2920
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-9-20 08:01:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

, f- j+ L( H# \# j% t8 e1 p點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
+ F& `. r1 G$ o) |* Z7 m8 ~3 c! ?# L5 {5 R
1
/ E" N# l7 k5 h; D) [微控制器 (MCU)
0 k; s. R1 x" N/ W大多數(shù)微控制器 (MCU) 使用物理地址進(jìn)行內(nèi)存訪問(wèn)。MCU 通常是設(shè)計(jì)為簡(jiǎn)單、資源有限的嵌入式設(shè)備,目標(biāo)是低功耗、低成本以及實(shí)時(shí)操作。
& c( w( i; L. z% Z4 k& o
; R% y3 q+ w( e, @- ~+ \* n這些設(shè)備一般沒(méi)有復(fù)雜的內(nèi)存管理單元 (MMU) 來(lái)處理虛擬地址到物理地址的映射。因此,程序代碼和數(shù)據(jù)是直接通過(guò)物理地址訪問(wèn)的。
, u6 z, O- T- O8 R0 Y, h1 X! o3 z% Y# [9 O: {/ `$ }3 U
以常見(jiàn)的 STM32 系列微控制器為例:$ P! d2 C3 N% C) G: e) x
  • Flash 存儲(chǔ)器:通常從地址 0x08000000 開(kāi)始。這個(gè)地址是物理地址,程序代碼通常存儲(chǔ)在這里。
  • SRAM:通常從地址 0x20000000 開(kāi)始。這個(gè)地址也是物理地址,用于數(shù)據(jù)存儲(chǔ)和堆棧操作。8 g; N  {4 n. ^8 @
    ) G  D3 D9 _1 q" ?
    在編程時(shí),當(dāng)開(kāi)發(fā)者使用指針或訪問(wèn)某個(gè)變量時(shí),實(shí)際操作的是物理地址。例如:8 t) v9 A: K  V* r  K) Y
    ) `* O* r5 E3 D% a1 x; J# T
  • #define LED_PIN (*(volatile uint32_t*)0x48000814)  // 指定 GPIO 端口的物理地址 int main(void) {    LED_PIN = 0x01;  // 設(shè)置引腳電平為高    while (1);}
    9 t* J; d) p. K; Y# D% A  ]在這個(gè)例子中,0x48000814 是直接引用的物理地址,用于控制 MCU 上的 GPIO 引腳。
    . Q+ B# U0 C1 l$ @$ ~9 A) n2  U/ ?# X8 D( b; z5 ^( v0 T8 ^9 a/ m
    系統(tǒng)級(jí)芯片 (SoC)
      i4 O& @. u9 r4 z* l% R" Q* `與 MCU 不同,系統(tǒng)級(jí)芯片 (SoC) 通常集成了更復(fù)雜的處理器內(nèi)核(例如 ARM Cortex-A 系列),并且可能運(yùn)行如 Linux 這樣的操作系統(tǒng)。
    6 F  C3 M: c+ S3 ~
    & T" S  m5 h7 q2 p這些 SoC 通常具有內(nèi)存管理單元 (MMU),能夠?qū)⑻摂M地址映射到物理地址。因此,虛擬地址是應(yīng)用程序通常使用的地址空間。3 g: b8 [0 {' z
    . ~( ~8 N9 b& Q  G& ^
    以 Raspberry Pi 這類(lèi)基于 ARM Cortex-A 系列處理器的 SoC 為例:/ R( K8 A) w4 v5 M7 L
  • 內(nèi)核態(tài)地址空間:在操作系統(tǒng)內(nèi)核中,內(nèi)核會(huì)管理物理內(nèi)存,內(nèi)核代碼通?梢灾苯釉L問(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)存。
    1 B4 ?! i7 q4 i: v

    3 T, {2 _' q, C5 h+ k! JC 語(yǔ)言示例如下:
    / r( V4 q& R$ f, C
    9 F: G6 O- i2 r' A2 U9 n
  • #include #include  int main() {    int *ptr = (int *)malloc(sizeof(int));    if (ptr == NULL) {        fprintf(stderr, "內(nèi)存分配失!
    # L7 s% O* k( A  s8 |3 i");        return 1;    }     *ptr = 123;    printf("虛擬地址: %p, 值: %d
    / j* a% z$ l$ ]0 u8 u", (void*)ptr, *ptr);     free(ptr);    return 0;}
    $ Y8 W- f! D$ o& p) i. }在這個(gè)例子中,malloc 函數(shù)返回的指針 ptr 是一個(gè)虛擬地址。操作系統(tǒng)會(huì)通過(guò) MMU 將其映射到物理內(nèi)存。應(yīng)用程序無(wú)需了解這個(gè)過(guò)程,操作系統(tǒng)自動(dòng)管理虛擬地址和物理地址之間的映射關(guān)系。8 h2 |+ L( }9 c: h+ H1 W+ u: ?9 Z/ D
    # [7 |7 H1 A6 U6 P( o/ |: G
  • 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 將虛擬地址映射到物理地址。
    2 s& h/ R! R. g
    : x& o7 ?9 I5 E0 E# @- a
    理解這兩者的差異對(duì)于開(kāi)發(fā)嵌入式系統(tǒng)的程序時(shí)至關(guān)重要,因?yàn)閮?nèi)存管理的復(fù)雜性和方式直接影響到程序的設(shè)計(jì)和調(diào)試方式。
    + Y8 b8 E1 _: u6 A0 `; _  h/ F' c% y
    ( C! p1 E8 {  g  B) j" a4 ~1 ~( T
    . O+ x" ^  b% ~6 v, r" J) w + u' E1 Z' ^, W* P8 @0 r' x5 D
    點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

    本版積分規(guī)則

    關(guān)閉

    站長(zhǎng)推薦上一條 /1 下一條


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表