绪论
由于linux不能直接使用物理内存,linux有mmu(memory manager unit)。
MMU完成虚拟空间到无论空间的内存映射,有内存保护功能,不能直接透过操作系统进行物理地址映射。
MMU同样映射DDR,IO寄存器:
ARM、RISC-V 这类嵌入式 CPU,物理地址空间是统一编址的(统一编址 = 内存映射 IO,MMIO):
- 一部分物理地址 → 对应 DDR 内存
- 另一部分物理地址 → 对应 片上外设寄存器(GPIO、UART、I2C、时钟控制器……)
CPU 只看物理地址
-
物理地址空间 = DDR + 各种外设寄存器
-
MMU 只做虚拟地址 → 物理地址翻译
-
只要物理地址落在外设区间,CPU 就直接访问硬件寄存器,不经过 DDR
ioremap 和 iounmap
ioremap 函数用于获取指 定 物 理 地 址 空 间 对 应 的 虚 拟 地 址 空 间 , 定 义 在 arch/arm/include/asm/io.h 文件中
iounmap 函数释放掉 ioremap 函数所做的映射