国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

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

2024-06-28 13:22:08
字體:
來源:轉載
供稿:網友
在 linux x86-64 模式下分析內存映射流程前言

在上一篇中我們分析了 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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 偏关县| 怀远县| 十堰市| 迁安市| 聂荣县| 浙江省| 滦平县| 崇义县| 富阳市| 遵义县| 凤山县| 泌阳县| 剑河县| 齐齐哈尔市| 蒙自县| 丰宁| 平武县| 靖西县| 南投市| 武城县| 平山县| 资源县| 察哈| 固始县| 孟州市| 南陵县| 宁波市| 故城县| 巴楚县| 阿荣旗| 兴和县| 宕昌县| 龙州县| 扎兰屯市| 清水县| 永丰县| 株洲县| 吴江市| 丽江市| 西乌珠穆沁旗| 汾阳市|