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

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

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

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

[復(fù)制鏈接]

532

主題

532

帖子

3116

積分

四級會員

Rank: 4

積分
3116
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-9-20 08:01:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
3 ^! j- B) Q0 s/ w$ x2 k2 C; q
點擊上方藍(lán)色字體,關(guān)注我們
# b/ Z6 ^9 {% k) ^+ q( O0 ~/ Z' s4 s# I# }6 r
1# U  A5 G/ R  s8 R
微控制器 (MCU)6 I# ^1 X  u3 j& R  }. g
大多數(shù)微控制器 (MCU) 使用物理地址進(jìn)行內(nèi)存訪問。MCU 通常是設(shè)計為簡單、資源有限的嵌入式設(shè)備,目標(biāo)是低功耗、低成本以及實時操作。
8 A, B4 y. F7 `7 T6 a4 D
, J/ ~5 _0 w, g; Y+ H這些設(shè)備一般沒有復(fù)雜的內(nèi)存管理單元 (MMU) 來處理虛擬地址到物理地址的映射。因此,程序代碼和數(shù)據(jù)是直接通過物理地址訪問的。
& {: _4 T& L0 _6 E, h: Y$ X3 g# C  f% Z8 Z( E4 q. u
以常見的 STM32 系列微控制器為例:
1 n+ b& l! ]# V! j# j; a! G
  • Flash 存儲器:通常從地址 0x08000000 開始。這個地址是物理地址,程序代碼通常存儲在這里。
  • SRAM:通常從地址 0x20000000 開始。這個地址也是物理地址,用于數(shù)據(jù)存儲和堆棧操作。
    : L6 V: D9 I3 I! I  C! w* S" w
    1 Z9 `4 w- E- v* X% E4 f0 v% B; P( D
    在編程時,當(dāng)開發(fā)者使用指針或訪問某個變量時,實際操作的是物理地址。例如:
    + B! {# S. ~( l/ y8 ~- c: f$ _+ W) Z
  • #define LED_PIN (*(volatile uint32_t*)0x48000814)  // 指定 GPIO 端口的物理地址 int main(void) {    LED_PIN = 0x01;  // 設(shè)置引腳電平為高    while (1);}% ?4 s* X% J2 B- R, n
    在這個例子中,0x48000814 是直接引用的物理地址,用于控制 MCU 上的 GPIO 引腳。
    1 D5 c# m5 D( M+ E( q0 u& a4 G2
    3 M1 a- Y: w& j; x# s/ Z& X系統(tǒng)級芯片 (SoC)$ L% n0 p2 w% [" ~# H5 k
    與 MCU 不同,系統(tǒng)級芯片 (SoC) 通常集成了更復(fù)雜的處理器內(nèi)核(例如 ARM Cortex-A 系列),并且可能運行如 Linux 這樣的操作系統(tǒng)。7 J& S5 T/ w/ J1 E9 V# q
    4 S  W; R6 X: \9 P# ?5 v
    這些 SoC 通常具有內(nèi)存管理單元 (MMU),能夠?qū)⑻摂M地址映射到物理地址。因此,虛擬地址是應(yīng)用程序通常使用的地址空間。# p9 n5 r- |$ K1 W; Z7 L

    " P0 F5 y# H- W3 b4 u: `/ H7 t+ i以 Raspberry Pi 這類基于 ARM Cortex-A 系列處理器的 SoC 為例:/ ?8 I! R; m( Y+ h- t: D
  • 內(nèi)核態(tài)地址空間:在操作系統(tǒng)內(nèi)核中,內(nèi)核會管理物理內(nèi)存,內(nèi)核代碼通?梢灾苯釉L問物理地址,但通常仍使用虛擬地址進(jìn)行管理。
  • 用戶態(tài)地址空間:應(yīng)用程序在用戶態(tài)下運行,所有內(nèi)存訪問都是通過虛擬地址進(jìn)行的。操作系統(tǒng)通過 MMU 將這些虛擬地址映射到實際的物理內(nèi)存。
    7 v3 Y  R" R! ^& `

    , Y& A! o) o, F3 m" KC 語言示例如下:
    ' a$ G% v! U0 M6 |( D; s0 s/ u* H" t+ s5 O: s0 J' h# R
  • #include #include  int main() {    int *ptr = (int *)malloc(sizeof(int));    if (ptr == NULL) {        fprintf(stderr, "內(nèi)存分配失!3 T: v5 P2 x% w  B* v' D
    ");        return 1;    }     *ptr = 123;    printf("虛擬地址: %p, 值: %d
    - c* D6 v: g( d- H; T9 ^", (void*)ptr, *ptr);     free(ptr);    return 0;}
    6 D1 y; v6 c9 N在這個例子中,malloc 函數(shù)返回的指針 ptr 是一個虛擬地址。操作系統(tǒng)會通過 MMU 將其映射到物理內(nèi)存。應(yīng)用程序無需了解這個過程,操作系統(tǒng)自動管理虛擬地址和物理地址之間的映射關(guān)系。
    4 a3 I* R2 s" f  G
    $ a: r$ g7 P3 u+ q2 c
  • MCU 通常使用物理地址進(jìn)行內(nèi)存訪問,因其設(shè)計簡單且資源受限,不具備復(fù)雜的內(nèi)存管理單元 (MMU)。
  • SoC,特別是那些運行復(fù)雜操作系統(tǒng)的 SoC,如 ARM Cortex-A 系列,通常使用虛擬地址進(jìn)行內(nèi)存管理,依賴 MMU 將虛擬地址映射到物理地址。4 ?" o; Y$ Z% j5 }8 F' g5 A$ P
    5 s, i, Q' a: |( Q3 A# a
    理解這兩者的差異對于開發(fā)嵌入式系統(tǒng)的程序時至關(guān)重要,因為內(nèi)存管理的復(fù)雜性和方式直接影響到程序的設(shè)計和調(diào)試方式。5 `8 M1 |; ?/ @6 |3 ^8 l
    ) m7 g1 W+ X2 D' \+ J7 T
    ; ~. h) S( ?/ B$ X1 x
    ( E) a8 H/ p+ T% I4 V1 O+ s
    點擊閱讀原文,更精彩~
  • 回復(fù)

    使用道具 舉報

    發(fā)表回復(fù)

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

    本版積分規(guī)則

    關(guān)閉

    站長推薦上一條 /1 下一條


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