定义
多数嵌入式微控制器(如ARM、PowerPC等)中并不提供I/O空间,而仅存在内存空间。
- 内存空间可以直接通过地址、指针来访问,程序及在程序运行中使用的变量和其他数据都存在于内存空间中。
unsighted int *p = 0x12345678;
*p=0x87654321;
虚拟地址⇒物理地址
高性能处理器一般会提供一个内存管理单元(
MMU
),该单元辅助操作系统进行内存管理,提供虚拟地址和物理地址的映射、内存访问权限保护和Cache
缓存控制等硬件支持。
MMU
具有虚拟地址和物理地址转换、内存访问权限保护等功能,这将使得Linux操作系统能单独为系统的每个用户进程分配独立的内存空间并保证用户空间不能访问内核空间的地址。- 为操作系统的虚拟内存管理模块提供硬件基础。上层应用看到的内存都是虚拟内存,应用就不能直接访问硬件,所以这样就保证了系统安全。
- 当程序访问一个虚拟地址时,
MMU
会将虚拟地址分解为页号和页内偏移量,然后查找页表,根据页号找到对应的页表项。页表项中包含了对应的物理页地址或页框号。最后将物理页地址与偏移量结合得到物理内存地址。 - 采用多级页表、
TLB
(Translation Lookaside Buffer
)等缓存机制,提高效率。
物理地址⇒虚拟地址
- 物理地址只能被映射一次
- 查看哪些物理地址被映射
cat/proc/iomem
函数原型
// ioremap.h
/**
* \file ioremap.h
* \brief 包含ioremap和iounmap函数的声明
*/
#ifndef IOREMAP_H
#define IOREMAP_H
#include <linux/types.h> // 假设这里包含了必要的类型定义
/**
* \brief 将物理地址映射到内核虚拟地址空间
*
* 此函数用于将一个给定的物理地址映射到内核的虚拟地址空间,
* 使得可以通过普通的指针操作来访问硬件设备的内存。
*
* \param phys_addr 要映射的物理地址
* \param size 映射的大小
* \return 返回映射后的虚拟地址,如果失败则返回 NULL 或者出错代码
*/
void *ioremap(phys_addr_t phys_addr, unsigned long size);
/**
* \brief 撤销ioremap创建的物理地址到虚拟地址的映射
*
* 此函数用于撤销由 ioremap 函数创建的物理地址到虚拟地址的映射。
*
* \param addr 通过ioremap获取的虚拟地址
* \param size 当初映射时指定的大小
*/
void iounmap(void *addr);
#endif // IOREMAP_H