java

在 linux x86-64 模式下分析内存映射流程

我爱IT资讯库   2021/02/20

前言

在上一篇中我们分析了 linux 在 x86-32 模式下的虚拟内存映射流程,本章主要继续分析 linux 在 x86-64 模式下的虚拟内存映射流程。

讨论的平台是 x86-64, 也可以称为 amd64, ia-32e, 是现在广泛使用的 64 位架构,可以向前兼容 16位和 32 位的 x86. 另外一种独立的 64 位架构 ia-64与现有架构不同而且貌似发展不好,一般是接触不到的,我们平常讨论的 64 位基本就是指 x86-64.

现在的 cpu 基本都是支持 64 位的,根据处理器强大的兼容性,我们可以配置为 long modelegacy mode, 根据安装的操作系统的模式可以使用不同的模式。

从 wikipedia 的截可以看出, 我们下面要测试的是 operating mode = long mode, operating sub-mode = 64-bit mode 下的虚拟内存映射流程。

映射流程简述

分段的存在更多就是为了兼容性,所以在 x86-64 下的 64位程序该功能近似于 bypass。处理器默认 cs, ds, es, ss的段基址为 0,所以我们下面就不讨论逻辑地址到线性地址的转换了,因为基址为0,经过运算后线性地址和逻辑地址是一样的,和上一章的扁平模式一样。

分页过程会将 48-bit 的线性地址转换为 52-bit 的物理地址, 可以看出虽然是 64bit 的操作系统但在处理器层面并没有提供 2^64 大小的访问范围。48-bit 线性地址可以有以下 3 种映射分配.

4-kbyte 页面

2-mbyte 页面

1-gbyte 页面

我们暂时还不知道 linux 使用哪种分页,但是知道了每种模式下各个寄存器和page structure entry的格式,可以下面慢慢分析。

格式

验证方案

本文整个流程参考了网上的另一篇文章,我会在文章末尾列出链接。

整个验证流程和上一篇在 x86-32 下的测试流程一样,这里就不说明了。

验证过程

编译加载

编译文件,加载 sys_reg.ko, phy_mem.ko 模块

运行 running-prog

运行后可以得到以下输出:

可以看到变量 a, 这就是我们要寻找物理地址的变量,我们给变量 a 赋了个特殊值方便确认。由于我的操作系统和 running-prog 都是64位的,所以对 a 的地址翻译是遵循 x86-64 下的机制的。a 的逻辑地址已经打印出来,而且也就是 a 的线性地址,我们先将 48bit 的线性地址分段.

pml4

控制寄存器 cr3 存储的是 pml4 的基址, bits 47~39 为 pml4e 的序号,对应的 pml4e 地址为:

0x275a1000 + 0 * 8 = 0x275a1000

pml4e 的值为 0x275da067.

pdpt

pdpt 的基址为 0x275da000, bits 38~30 为 pdpte 序号,计算出的 pdpte 地址为:

0x275da000 + 0 * 8 = 0x275da000

pdpte 的值为 0x623a4067, bit7 = 0 说明指向的是 page directory.

pd

pd 的基址为 0x623a4000, bits 29~21 为 pde 的序号,计算出 pde 的地址为:

0x623a4000 + 3 * 8 = 0x623a4018

pde 的值为 0x692bb067, bit7 = 0 说明指向的是 page table.

pt

pt 的基址为 0x692bb000, bits 20 ~12 为 pte 的序号, 计算出 pte 的地址为:

0x692bb000 + 1 * 8 = 0x692bb008

pte 的值为 0x800000004ad6f867.

page frame

page frame 的基址为 0x4ad6f000, bits 11~0 为在 page frame内的偏移,计算出变量的物理地址为:

0x4ad6f000 + 120 = 0x4ad6f078.

熟悉的 0xa5a5aa550000ffff, 说明我们找到了变量 a 的实际物理地址。

结束

感谢 linux内核在x86_64 cpu中地址映射 一文,我的整个流程参考了原作者的文档和代码, 再次感谢原作者的分享。

下面是源代码链接.
study-linux-vm-64bit




热门内容

一个过滤器类,过滤多个路径

<!-- 登录验证 --> <filter> <filter-name>... ...

网页中的平衡、对比、连贯和留白

网页中的平衡、对比、连贯和留白 <!-- Body Copy --> 网页设计中需要把握好很多原则和细节,... ...
好高兴啊

好高兴啊

  好高兴啊…..好高兴啊….终于发现了…..   ... ...

WCF技术剖析(卷1)之目录

第1章  WCF简介 (WCF Overview)      ... ...

EXT核心API详解(五)

[转载]EXT核心API详解(五)-Ext.EventManager/EventObject/CompositeElem... ...

xorg如何使用 xkbprint?

问题:手册中没有例子,我所尝试的每个文件都需要一些几何。$ xkbcomp/usr/share/x11/xkb/symb ...
织梦淘宝客常见问题

织梦淘宝客常见问题

一、下载安装 见官方帖子,不细说。http://bbs.dedecms.com/203194.html 在此强烈建议新手... ...

(转)批处理(bat)全盘搜索指定文件获取其完整路径方法大全

本文总结了4种实现全盘搜索指定文件获取其完整路径的bat批处理文件源码,有需要的朋友可以参考下 【方案一】fo... ...

Java线程讲解

一 线程的基本概念 线程是一个程序内部的顺序控制流.一个进程相当于一个任务,一个线程相当于一个任务中的一条执行路径. ... ...

css display:none和visibility:hidden和visible="false"区别

  如果在p的style中把visibility设为 hidden则p隐藏,但是它会占据空白空间,... ...

ASP.NET[1]

   有很多人学过ASP,用ASP做过网站,可是到ASP .NET环境下发现,变化真是太大了... ...

构建一个安全的软件系统时,可能遇到的风险及解决方案(未完)

随着汽车工业的发展,汽车早以不是那个由一堆零件组成的大机器,而是由机械和电子器件构成的整体系统。并且,这个... ...
VPS上安装ShadowSocks

VPS上安装ShadowSocks

shadowsocks 是一个轻量级隧道代理,用来穿过防火墙。 我的VPS机器安装的是CentOS系统、... ...

ResultSet 调用getString 抛出NullPointException问题的解决

在Java连接数据库时,有时候在ResultSet 调用getString (或其他类似的方法),有时候会抛出Nu... ...

浅谈OSIV与泛型DAO模式

open session in view  简称 OSIV 模式 在Hibernate中能更好的应... ...

数据库设计原理:数据建模的三个阶段

如果你在Google或者百度上搜索数据建模,相信可以搜索出很多关于数据建模的文章,但是你会发现其中绝大部分是理论、... ...

ajaxfileupload.js 文件上传

一,前台代码。 <input id="fileToUpload" type="... ...

ios的标志常量

1 dec 2 fixed 3 hex 4 internal 5 left 6 oct 7 right 8 scien ...

discuz删除垃圾帖子

有时候如果你的论坛被垃圾帖子占满后,会发现使用后台的删除功能还是有些慢, 我们需要先备份自己需要的帖子,然后进行下面的 ...

Hibernate的主配置文件hibernate.cfg.xml

1:hibernate的主配置文件的名字必须是hibernate.cfg.xml:   1.1:主配置文件主要分为三部分 ...

关于html base元素的使用

base元素可以用于设置页面嵌入的css文件或js文件链接的基地址。 例子: <h... ...

类型转换与强制转换

自动转换: 举一个例子:把一个小的东西放到一个大的盒子里,是件非常容易的事,不用做任何改变,在这里理解成自动转换。... ...

利用wxwidgets操纵word

最近在学习怎么用wxwidgets来操纵word,寻找之中发现MedeoSoftware,里面有很多wxwidgets的... ...

Python中的简单类型

整数 & 浮点数 整数有两种,分别是 int 和 long。其中 int 最大值是 2147483647... ...

JS-时间函数

/** * 日期范围工具类 */ var daterangeutil = (function () { /** ...
“大数据”信息平台 覆盖社区5000老年人

“大数据”信息平台 覆盖社区5000老年人

突然头疼脑热,身边没人照顾;电灯坏了、水管漏了,该找谁来帮忙修?菊园新区智慧养老项目搭建了一个为老综合服务平台... ...

在PHP中全局变量的使用详解

即使开发一个新的大型PHP程序,你也不可避免的要使用到全局数据,因为有些数据是需要用到你的代码的不同部分的。一些常见的全... ...

名称空间也可以自定义

名字空间的定义 名字空间除了系统定义的名字空间之外,还可以自己定义,定义名字空间用关键字namespace,使用名字空 ...
从量价变化中洞察主力意图

从量价变化中洞察主力意图

成份B指(399003.SZ) <script language="JavaScript" typ... ...
android 继承view类刷新页面【安卓进化十一】

android 继承view类刷新页面【安卓进化十一】

       最近做项目中发现,继承了view类的子类... ...