juq2oyobhrl64031919635.gif
; }) d$ H0 I2 S% Y" g1 m% x/ r
点击上方蓝色字体,关注我们
5 x# P- ~/ w3 E) U
" O& ^8 [6 N" r- t1 h1
9 d; \9 s- U9 Q微控制器 (MCU). V- E/ n9 B7 G
大多数微控制器 (MCU) 使用物理地址进行内存访问。MCU 通常是设计为简单、资源有限的嵌入式设备,目标是低功耗、低成本以及实时操作。% r; P K* A p! q4 }
( H& n& k, P2 g5 Q, n这些设备一般没有复杂的内存管理单元 (MMU) 来处理虚拟地址到物理地址的映射。因此,程序代码和数据是直接通过物理地址访问的。% C7 l( v! R$ C* n6 |; k
7 V6 I6 V- k: n以常见的 STM32 系列微控制器为例:
+ T8 T+ Z8 d3 A, V% xFlash 存储器:通常从地址 0x08000000 开始。这个地址是物理地址,程序代码通常存储在这里。SRAM:通常从地址 0x20000000 开始。这个地址也是物理地址,用于数据存储和堆栈操作。( F, Z) U3 c& V& ~. D$ l
* ~( v* a& \# [: H o
在编程时,当开发者使用指针或访问某个变量时,实际操作的是物理地址。例如:7 N+ D6 u8 ]4 y$ v6 ~) \# C
& Y5 Z5 _/ i) l7 Z" `#define LED_PIN (*(volatile uint32_t*)0x48000814) // 指定 GPIO 端口的物理地址 int main(void) { LED_PIN = 0x01; // 设置引脚电平为高 while (1);}
, R; J$ {' E# @ \在这个例子中,0x48000814 是直接引用的物理地址,用于控制 MCU 上的 GPIO 引脚。
1 o( ]- X6 N4 R# N% r, L0 p2
7 V! r: {* J! y$ e9 ?5 r: Y( j系统级芯片 (SoC)3 e- {" U; W+ u& ?( n$ Z/ W
与 MCU 不同,系统级芯片 (SoC) 通常集成了更复杂的处理器内核(例如 ARM Cortex-A 系列),并且可能运行如 Linux 这样的操作系统。) S! v4 w" R( O+ t. X
. ^/ t7 F' v8 n' ?6 I% | ]' t: u这些 SoC 通常具有内存管理单元 (MMU),能够将虚拟地址映射到物理地址。因此,虚拟地址是应用程序通常使用的地址空间。
* W% t4 b2 g# ~2 i; {6 O- c e6 N6 `- I2 c& L' ]( A# _
以 Raspberry Pi 这类基于 ARM Cortex-A 系列处理器的 SoC 为例:
8 K" U y: A! a* p( z" {' c内核态地址空间:在操作系统内核中,内核会管理物理内存,内核代码通常可以直接访问物理地址,但通常仍使用虚拟地址进行管理。用户态地址空间:应用程序在用户态下运行,所有内存访问都是通过虚拟地址进行的。操作系统通过 MMU 将这些虚拟地址映射到实际的物理内存。
. r" x1 A, E2 K3 ^; R" v0 t5 f3 k6 w
# `0 h) z! r# dC 语言示例如下:
4 l7 z5 w" b) \0 w, g- r" _ F. |4 n% q+ | D. a$ I- B
#include #include int main() { int *ptr = (int *)malloc(sizeof(int)); if (ptr == NULL) { fprintf(stderr, "内存分配失败!
6 s) ]& d& i4 f( F, `8 x9 J"); return 1; } *ptr = 123; printf("虚拟地址: %p, 值: %d/ C- A$ T: g7 h6 s8 O$ _# C
", (void*)ptr, *ptr); free(ptr); return 0;}0 D4 g- v& c; u& S) o5 q7 \1 \9 s
在这个例子中,malloc 函数返回的指针 ptr 是一个虚拟地址。操作系统会通过 MMU 将其映射到物理内存。应用程序无需了解这个过程,操作系统自动管理虚拟地址和物理地址之间的映射关系。% K& \! e8 k. [ }2 Y) q7 r# T: B
) F) ~ }2 Y* ]8 o7 W( Y* m1 q* V
MCU 通常使用物理地址进行内存访问,因其设计简单且资源受限,不具备复杂的内存管理单元 (MMU)。SoC,特别是那些运行复杂操作系统的 SoC,如 ARM Cortex-A 系列,通常使用虚拟地址进行内存管理,依赖 MMU 将虚拟地址映射到物理地址。1 ~/ G" y+ l1 O, H f5 {! J% b, @
7 X% { n" ~0 _/ q; G理解这两者的差异对于开发嵌入式系统的程序时至关重要,因为内存管理的复杂性和方式直接影响到程序的设计和调试方式。, ^& \8 Q0 a$ A& C
: D [& \; _/ B
x1o5tsoha1y64031919735.jpg
3 P* U, ~7 P" n9 r
eif0p15bvpy64031919835.gif
/ N- `# F; l- N s* W# T- O% j- |0 l点击阅读原文,更精彩~ |