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

相关推荐
华清远见IT开放实验室15 分钟前
STM32+Linux双体系,零基础玩转嵌入式
linux·stm32·嵌入式硬件
重生的黑客21 分钟前
Linux 进程状态详解:从理论到实践,僵尸进程与孤儿进程
linux·运维·服务器
脆皮炸鸡75532 分钟前
进程的程序替换
linux·经验分享·笔记·vim·学习方法
划水的code搬运工小李1 小时前
ubuntu下使用opencode
linux·运维·ubuntu
ZPC82101 小时前
Ubuntu 实时性优化(专属定制版,适配 fast_shm 通信)
linux·数据库·postgresql
郝学胜-神的一滴1 小时前
epoll 边缘触发 vs 水平触发:从管道到套接字的深度实战
linux·服务器·开发语言·c++·网络协议·unix
韩明君1 小时前
OpenClaw安全部署实现
linux·人工智能·安全·debian·本地部署·ai agent·openclaw
代码中介商1 小时前
Linux 文件操作系统调用完全指南:从 open 到 close
linux·运维·服务器
想拿大厂offer1 小时前
【Linux】权限
linux·服务器
倔强的石头1062 小时前
【Linux指南】基础IO系列(七):“一切皆文件” 底层实现 ——struct file 与统一 IO 接口的魔法
linux·运维·服务器