Linux系统可以搭载在不同的微处理器上,一般的微处理器一直带有片上内存管理单元(MMU)。
MMU是一种负责处理中央处理器(CPU)的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制,在较为简单的计算机体系结构中,负责总线的仲裁以及存储体切换(bankswitching,尤其是在8位的系统上)。(百度百科搜索)
内存管理单元的存在,导致Linux内核不能直接访问CPU的物理地址,必须先将物理地址转换为虚拟地址,Linux内核才能通过访问虚拟地址来访问系统内存。
物理地址如何得到他们的虚拟地址
- 安装驱动
申请物理内存区做一个资源 → 通过IO内存的动态映射得到虚拟地址 - 卸载驱动
释放物理内存区 → 解除IO内存的动态映射
涉及的相关函数
- 函数所在头文件
#include <linux/ioprot.h>
- 申请物理内存区函数
#define request_mem_region(start , n ,name) ......
参数:
start:物理起始地址
n:申请内存区的大小
name:自定义的内存区名字
注:申请成功后 可以在 proc/iomem
中找到。
- 释放物理内存区
void release_mem_region(resource_size_t start ,resource_size_t n);
参数:
start:物理起始地址
n:释放物理内存的大小