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

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

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

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

[復(fù)制鏈接]

660

主題

660

帖子

4567

積分

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

Rank: 4

積分
4567
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-9-20 08:01:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  }/ A, B# X1 a  ~! Y, h: g8 e
點(diǎn)擊上方藍(lán)色字體,關(guān)注我們) }5 Z! c' Q% o
8 |) h/ I, N3 ^# m7 s$ |* e6 K
1
; f, R- e+ a$ J* j" v+ o9 Z微控制器 (MCU)
4 ^+ ]8 c# }& D! R大多數(shù)微控制器 (MCU) 使用物理地址進(jìn)行內(nèi)存訪問。MCU 通常是設(shè)計(jì)為簡單、資源有限的嵌入式設(shè)備,目標(biāo)是低功耗、低成本以及實(shí)時(shí)操作。
; h, D7 c, X8 h7 n! O
, K1 Z& f+ N, g1 y7 x1 l% E這些設(shè)備一般沒有復(fù)雜的內(nèi)存管理單元 (MMU) 來處理虛擬地址到物理地址的映射。因此,程序代碼和數(shù)據(jù)是直接通過物理地址訪問的。
% l, S1 _) L. T7 P/ r/ Z& o0 h! M0 t, l3 h8 n% V- V
以常見的 STM32 系列微控制器為例:
* x  o( f6 Y  _8 v/ ?" {2 L$ i, ~
  • Flash 存儲(chǔ)器:通常從地址 0x08000000 開始。這個(gè)地址是物理地址,程序代碼通常存儲(chǔ)在這里。
  • SRAM:通常從地址 0x20000000 開始。這個(gè)地址也是物理地址,用于數(shù)據(jù)存儲(chǔ)和堆棧操作。- ]$ ^: N0 d% j
    " h! G7 b1 [& z$ Y; [$ P8 Z
    在編程時(shí),當(dāng)開發(fā)者使用指針或訪問某個(gè)變量時(shí),實(shí)際操作的是物理地址。例如:
    - N$ a- N% t0 b6 {& c  d! x% k( }) I1 b) g  H6 S! e3 j4 I
  • #define LED_PIN (*(volatile uint32_t*)0x48000814)  // 指定 GPIO 端口的物理地址 int main(void) {    LED_PIN = 0x01;  // 設(shè)置引腳電平為高    while (1);}
    / I$ ]# j" L8 g7 ^* m在這個(gè)例子中,0x48000814 是直接引用的物理地址,用于控制 MCU 上的 GPIO 引腳。
    0 q9 s) ^, j& T2
    " D# {; ]' }, G4 r  z8 E* y系統(tǒng)級(jí)芯片 (SoC); I# X# K0 S; _+ d  G3 J
    與 MCU 不同,系統(tǒng)級(jí)芯片 (SoC) 通常集成了更復(fù)雜的處理器內(nèi)核(例如 ARM Cortex-A 系列),并且可能運(yùn)行如 Linux 這樣的操作系統(tǒng)。
    $ c, F0 X# i; G3 P. _, [
    + X) {! ?% M# h& {這些 SoC 通常具有內(nèi)存管理單元 (MMU),能夠?qū)⑻摂M地址映射到物理地址。因此,虛擬地址是應(yīng)用程序通常使用的地址空間。
      n# H; n* x, }9 i$ [2 p: k' y2 Y+ l, r) F8 t
    以 Raspberry Pi 這類基于 ARM Cortex-A 系列處理器的 SoC 為例:! d# s: n, W. f7 N3 |
  • 內(nèi)核態(tài)地址空間:在操作系統(tǒng)內(nèi)核中,內(nèi)核會(huì)管理物理內(nèi)存,內(nèi)核代碼通?梢灾苯釉L問物理地址,但通常仍使用虛擬地址進(jìn)行管理。
  • 用戶態(tài)地址空間:應(yīng)用程序在用戶態(tài)下運(yùn)行,所有內(nèi)存訪問都是通過虛擬地址進(jìn)行的。操作系統(tǒng)通過 MMU 將這些虛擬地址映射到實(shí)際的物理內(nèi)存。
    ' g  U1 ~8 w% }
    ; r! M6 z0 q/ {! P9 `, v: ~* e
    C 語言示例如下:
    % b9 h; y! p' h8 f, `2 Q% n  ?' l7 ~/ y) s8 `
  • #include #include  int main() {    int *ptr = (int *)malloc(sizeof(int));    if (ptr == NULL) {        fprintf(stderr, "內(nèi)存分配失敗!4 S8 d- r4 o9 m2 G8 H
    ");        return 1;    }     *ptr = 123;    printf("虛擬地址: %p, 值: %d
    . e; ]$ t0 h. A1 H3 ?0 K2 s* H; P", (void*)ptr, *ptr);     free(ptr);    return 0;}
    ) j7 O# }$ Z9 }& t在這個(gè)例子中,malloc 函數(shù)返回的指針 ptr 是一個(gè)虛擬地址。操作系統(tǒng)會(huì)通過 MMU 將其映射到物理內(nèi)存。應(yīng)用程序無需了解這個(gè)過程,操作系統(tǒng)自動(dòng)管理虛擬地址和物理地址之間的映射關(guān)系。
    8 h: Q/ h% s$ @4 B5 g6 ]# B( G; X
    3 q+ y8 ~% n8 f8 i: S
  • MCU 通常使用物理地址進(jìn)行內(nèi)存訪問,因其設(shè)計(jì)簡單且資源受限,不具備復(fù)雜的內(nèi)存管理單元 (MMU)。
  • SoC,特別是那些運(yùn)行復(fù)雜操作系統(tǒng)的 SoC,如 ARM Cortex-A 系列,通常使用虛擬地址進(jìn)行內(nèi)存管理,依賴 MMU 將虛擬地址映射到物理地址。; `. c7 C8 }: ]3 T% c: H3 i- _8 l  q
    ; C, n' }$ m6 t5 p
    理解這兩者的差異對于開發(fā)嵌入式系統(tǒng)的程序時(shí)至關(guān)重要,因?yàn)閮?nèi)存管理的復(fù)雜性和方式直接影響到程序的設(shè)計(jì)和調(diào)試方式。
    7 `* L1 D/ t4 d: W5 S9 A* O3 X, `6 `: L& }( M

    0 s, M( n6 ]9 t& ]% M# ~ ) A1 v2 N  M! }0 I1 F7 S( r5 k
    點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


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