在计算机中,最常见的外设是主存(main memory),通常会将主存理解为 RAM。也就是说,RAM 只是众多外设中的一种,它的内存范围对应其容量。
RAM 的独特之处在于,它完全由 内核管理,对用户来说是透明的。RAM 控制器连接到 CPU 的数据总线、控制总线和地址总线,这些总线同时也被其他设备共享。
这些共享总线的设备被称为 内存映射设备(memory-mapped devices),与它们的通信(输入/输出操作)称为 内存映射 I/O(memory-mapped I/O)。
这些设备包括:由 CPU 提供的各种总线控制器(如 USB、UART、SPI、I2C、PCI 和 SATA);以及一些 IP,如 VPU、GPU、图像处理单元(IPU)、安全非易失性存储设备。
在 32 位系统中,CPU 可以访问多达 2的32次方 个内存地址(从 0 到 0xFFFFFFFF)。但问题是,并非所有地址都对应 RAM。其中一些地址被保留用于访问外设,这部分称为 I/O 内存。
这些 I/O 内存被划分为不同大小的地址范围,并分配给各个外设。这样,当内核请求 CPU 访问某个物理地址时,CPU 就能将请求路由到 该地址范围所对应的设备。每个设备(包括 RAM 控制器)分配的地址范围通常会在 SoC 数据手册中描述,通常在一个名为 memory map 的章节中。
由于内核 仅通过虚拟地址(通过页表)进行操作,要访问某个外设的特定地址,必须先将该地址映射到虚拟地址空间(如果系统中存在 IOMMU——I/O 设备的