0

0

Linux 下的虚拟地址和物理地址:概念、转换和应用

WBOY

WBOY

发布时间:2024-02-14 21:54:02

|

1294人浏览过

|

来源于良许Linux教程网

转载

linux 系统中,内存管理是一个非常重要的话题,它涉及到程序的运行、性能和安全等方面。内存管理的一个核心概念是虚拟地址和物理地址,它们分别表示程序的逻辑视图和内存的实际布局。虚拟地址和物理地址之间的转换是内存管理的一个关键过程,它可以让程序更好地利用内存资源,提高内存的访问效率和保护性。但是,你真的了解虚拟地址和物理地址吗?你知道它们的定义、特点和区别吗?你知道如何在 linux 下进行虚拟地址和物理地址之间的转换吗?本文将为你详细介绍 linux 下的虚拟地址和物理地址的相关知识,让你在 linux 下更好地使用和理解这两种内存地址。

Linux 下的虚拟地址和物理地址:概念、转换和应用

应用程序只能提供一个虚拟地址,也可以通过如下方法获取物理地址,当然得调用驱动。

Linux采用页表的概念来管理虚拟空间,内核在处理虚拟地址时都必须将其转换为物理地址,然后处理器才能够访问。虚拟地址可以通过Linux的页表操作宏逐层查找到物理地址,简单来说需要将虚拟地址分段,每段地址都作为索引指向页表,最后一级页表指向物理地址。
Linux在2.6.11以后版本为了兼容各种处理器,采用四级页表结构:
 PGD:Page Global Directory,页全局目录,是顶级页表。
 PUD:Page Upper Directory,页上级目录,是第二级页表
 PMD:Page Middle Derectory,页中间目录,是第三级页表。
 PTE:Page Table Entry,页面表,最后一级页表,指向物理页面。
可以通过数据结构mm_struct访问PGD找到物理页面,如图4-8,根据页表寻找物理地址的流程见4-9。

图 Linux采用的4级页面

简化的转换代码如下:

 static int vir2phy(unsigned long va) 
 {   
 struct task_struct *pcb_tmp;   
 pcb_tmp = current;   
 pgd_tmp = pgd_offset(pcb_tmp->mm,va);   
 pud_tmp = pud_offset(pgd_tmp,va);   
 pmd_tmp = pmd_offset(pud_tmp,va);   
 pte_tmp = pte_offset_kernel(pmd_tmp,va);   
 pa = (pte_val(*pte_tmp) & PAGE_MASK) |(va & ~PAGE_MASK);   
 return pa; 
 }

pgd_offset(mm, addr) 接收内存描述符地址mm和线性地址addr作为参数。这个宏产生地址addr在页全局目录中相应表项的线性地址;
通过内存描述符mm内的一个指针可以找到这个页全局目录。

pud_offset(pgd, addr) 参数为指向页全局目录项的指针pgd和线性地址addr。这个宏产生页上级目录中目录项addr对应的线性地址。在两级或三级分页系统中,该宏产生pgd,即一个页全局目录项的地址。

H5响应式企业官网源码2.9
H5响应式企业官网源码2.9

cqcms通用企业建站介绍 H5响应式企业官网源码(带手机端)后台非常简单,一个后台同时管理PC和wap。把图片和文字稍加修改,就可以使用。适合任何企业网站 安装步骤: 1、下载文件,并且解压到网站的根目录,配置好apache/IIS虚拟主机以及伪静态; 2、安装网址http://localhost/(localhost为您网址地址) 3、网站后台入口

下载

pmd_offset(pud, addr) 接收指向页上级目录项的指针pud和线性地址addr作为参数。这个宏产生目录项addr在页中间目录中的偏移地址。在两级或三级分页系统中,它产生pud,即页全局目录项的地址。

pte_offset_kernel(dir, addr) 线性地址addr在页中间目录dir中有一个对应的项,该宏就产生这个对应项,即页表的线性地址。另外,该宏只在主内核页表上使用。

通过本文,你应该对 Linux 下的虚拟地址和物理地址有了一个深入的了解,知道了它们的定义、特点和区别。你也应该明白了虚拟地址和物理地址之间的转换的原理、方法和作用,以及如何在 Linux 下正确地进行虚拟地址和物理地址之间的转换。我们建议你在使用 Linux 系统时,使用虚拟地址来编写和运行程序,以提高程序的可移植性和安全性。同时,我们也提醒你在使用 Linux 系统时,注意一些潜在的问题和挑战,如内存碎片、内存泄漏、内存映射等。希望本文能够帮助你更好地使用 Linux 系统,让你在 Linux 下享受虚拟地址和物理地址的优势和便利。

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

529

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

6

2025.12.22

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1345

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

700

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

773

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

571

2023.07.06

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

544

2023.07.20

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.3万人学习

Git 教程
Git 教程

共21课时 | 2.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号