Linux物理地址到虚拟地址的映射

相关理论:

Linux中用户空间是无法直操作寄存器的,需要先将寄存器对应的物理地址通过转换成虚拟地址然后在进行操作。

高性能处理器一般会提供一个内存管理单元(MMU),该单元辅助操作系统进行内存管理,提供虚拟地址和物理地址的映射,内存访问权限保护和cache缓存控制等硬件支持。

MMU具有虚拟地址和物理地址转换、内存访问权限等功能。这将使得Linux操作系统能单独的为系统的每一个用户进程分配独立的内存空间,并保证用户空间,不能访问内核空间地址。为操作系统的虚拟内存管理模块提供硬件基础。上层应用看到的内存都是虚拟内存,应用就不能直接访问硬件,所以这样就保证了系统安全。

对于包含MMU的处理器,Linux系统提供了复杂的存储管理系统,使得进程访问的内存达到了4G。在Linux系统中,进程的4GB内存空间被分成了两个部分------用户空间与内核空间。


每个进程的用户空间都是完全独立、互不相干的,用户进程各自有不同的页表。而内核空间是由内核 负责映射,它并不会跟着进程改变,是固定的。内核空间的虚拟地址到物理地址映射是被所有进程共享的, 内核的虚拟空间独立于其他程序。
在Linux中,内核给我们提供了相关的函数:
函数定义在内核源码目录 include/asm-generic/io.h

|--------------|-----------------------------------------------------------------------------|
| 函数 | static inline void __iomem * ioremap (phys_addr_t offset, size_t size) |
| 参数<offset> | 需要映射的物理地址的起始地址 |
| 参数<size> | 映射多大的内存空间(字节数) |
| 返回值 | 成功返回虚拟地址的首地址失败返回 NULL 。 |
| 功能 | 把物理地址转换成虚拟地址 |

|------------|------------------------------------------------------|
| 函数 | static inline void iounmap (void __iomem *addr) |
| 参数<addr> | 要取消映射的虚拟地址的首地址 |
| 功能 | 释放掉 ioremap 映射的地址 |

注意:物理地址只能被映射一次,多次映射会失败。如何查看:

bash 复制代码
cat /proc/iomem

相关推荐
β添砖java4 分钟前
学习笔记:实战章节:在Linux上部署各类软件
linux·笔记·学习
老当益壮梁奶奶38 分钟前
Linux软件编程学习笔记(十一):深入浅出 TCP 协议与 Socket 编程实践
linux·c语言·笔记·学习·tcp/ip
speop1 小时前
hell-gpu| TASK01-2
linux·运维·算法
byte轻骑兵1 小时前
【BlueZ 】用户态入口:main.c 核心函数与程序启动流程
linux·人工智能·bluez·电脑蓝牙·嵌入式蓝牙
Tisfy2 小时前
LeetCode 2058.找出临界点之间的最小和最大距离:遍历+遇到极值则更新(这种题谁空间复杂度不是O(1)啊)
linux·数据库·leetcode·链表·题解·模拟·遍历
liulilittle2 小时前
REALITY 代理隧道的有效检测方法: 被动、主动与确定性三层实证研究
linux·服务器·网络·网络协议·安全·网络安全·通信
邪修king2 小时前
Re:Linux 系统篇(十五):进程篇(四):进程切换深度解析 —— CPU 寄存器、进程上下文与切换全流程万字详解
linux·运维·服务器
高亦真3 小时前
今天是学习嵌入式的第33天
linux·学习·算法
cuijiecheng20183 小时前
Rocky Linux 安装 libltc、ltc-tools 和 ltcdump
linux
BlueAsia_Lab3 小时前
BQB 认证执行标准是什么?核心条款通俗解读
linux·运维·网络