首页
社区
课程
招聘
[分享][扫肓]虚拟地址转译 - 丢块砖出去,希望引。。。
发表于: 2010-1-7 14:09 5447

[分享][扫肓]虚拟地址转译 - 丢块砖出去,希望引。。。

2010-1-7 14:09
5447
前几晚上看了下 深入window核心 4 那本书,基本上,,很难看。。。

现在回忆一下,[书不在这里]

32位非pad
一个32虚拟地址分成三部分,
页目录索引  页表索引 字节索引

面页:32位下的小面页是4KB大小
页目录:存放着 页目录项[pde]
页目录项:存着页表[pte]项,每一项存着对应的物理地址。

一个进程读一个虚拟地址时,cpu会找到这个进程所在的
页目录地址所在的页,这个页目录是很多页目录项组成的一个表[可以这样看]
然后从虚拟地址的高10位即页目录索引,这个索引用作页目录里的索引,找到页目录项。

找到这个页目录项后,这个页目录项存着对应的页表,找到页表项,,然后用页表索引的值在这个页表项中查找页表,找到页表,就可以找到物理地址了。。再用字节索引查找这个面页所在的真正位置。

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个好,顶。。
2010-1-7 23:22
0
雪    币: 433
活跃值: (1875)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
3
打开调试器跟进内存瞧瞧更清楚,《软件调试》一书里面关于这部分内容就是用WinDBG来分析讲解的,更具有实践性。
2010-1-7 23:40
0
雪    币: 13
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我还是开学时看保护模式汇编时看过这东西了,现在都快忘得差不多了
2010-1-8 01:10
0
雪    币: 242
活跃值: (418)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
5
混乱得给翻译一些IA32的介绍做的准备工作,和LZ说的有关系:

翻译过程中的摘抄的笔记,应该少不了些错误。但愿你在配合此 笔记看原 TLBs, paging-structure cache, and their invalidation时可以指出那些 bugs。原文档中的主要部分, invalidation的翻译笔记没有包含在此处。

内容包括:
IA32的 paging流程说明
IA32的 转接(referenced)入 说明
_____________
Processor implementations may limit the size of the physical addresses to less than 52 bits. The physical-address width supported is enumerated using CPUID. 也即理论上当前可支持的最大内存是4294967296 GB(2的52次方),但windows给出的上限是512 GB,此是由于架构的设计中 paging所要 查询的表着实太多了,性能要求放弃那种设计,无法分配太多的内存用来 page structures的储存.

IA32e是当前的 intel主要架构,它既向下兼容 32位的设计,也是 intel 64的实现方式,简而言之,现在的intel 64并没有象  线性地址 那样大刀阔斧的新设计,而是扩展的 32 bits方式 ,因此按intel的意思,了解IA32e的设计在当前是 最简单有效、最值得涉猎和拥有的架构 /:^]。
参看:
64-bit mode (sub-mode of IA-32e mode) — This mode enables a 64-bit
operating system to run applications written to access 64-bit linear address
space. For brevity, the 64-bit sub-mode is referred to as 64-bit mode in IA-32
architecture.
64-bit mode extends the number of general purpose registers and SIMD
extension registers from 8 to 16. General purpose registers are widened to 64
bits. The mode also introduces a new opcode prefix (REX) to access the register
extensions.
64-bit mode is enabled by the operating system on a code-segment basis. Its
default address size is 64 bits and its default operand size is 32 bits. The default
operand size can be overridden on an instruction-by-instruction basis using a REX
opcode prefix in conjunction with an operand size override prefix.
REX prefixes allow a 64-bit operand to be specified when operating in 64-bit
mode. By using this mechanism, many existing instructions have been promoted
to allow the use of 64-bit registers and 64-bit addresses.

注意,文档中的全是IA-32e mode下的流程。
_____________________
由线程地址得到物理内存的过程称为 对页(paging),是由软件实现的。CR0的bit 31(PG位)为1时才会在访问内存地址时进行 paging,不然为 实地址模式。
指令、数据指令对内存的访问都是通过线性地址定址的。IA-32和inter 64下任何对内存的访问都通过 线性地址定址,包括一些永远不会表现在 可执行代码中的 访问过程,此种访问无论何种情况下都不会引发 page faults(主要表现,缺页异常)。
具体的paging流程由 处理器的控制变量寄存器中和 paging mode相关的位决定。
• If PAE (bit 5) is 0 in control register CR4, paging translates from 32-bit linear addresses
to 32-bit physical addresses. (This mode can translate to 36-bit physical addresses, but
only for large pages.) 当前主要应用在32位总线的系统中
• If CR4.PAE = 1 and LMA (bit 10) is 0 in the IA32_EFER MSR, paging translates from
32-bit linear addresses to 36-bit physical addresses.
• If IA32_EFER.LMA = 1, paging translates from 48-bit linear addresses to 52-bit physical
addresses.1 This mode is called IA-32e mode. IA-32e mode is available only on
processors that support the Intel® 64 architecture. 当前主要应用在64位系统上
PAE和 LMA同时为空的情况不会出现,此前提有 处理器的保证。
Paging Mode                               PML4         PDP         PDE         PTE
IA32_EFER.LMA = 1                         47:39         47:30         47:21         47:12
IA32_EFER.LMA = 0 and CR0.PAE = 1        N/A         31:30*         31:21         31:12  
IA32_EFER.LMA = 0 and CR0.PAE = 0        N/A         N/A         31:22         31:12
No PTE is used for large-page translations (if PS is 1 in the PDE);
*For this paging mode, these entries are called PDPTRs and are all loaded together.
n/a 表示不经过那流程

IA-32e的地址寄存器是 64 bits的,因此线性地址和物理地址便是64bits的。
从高至低各bits的意义为:
63~ 48的bits们保留为47的值。
47~12的bits们是 一个 page number,page number 索引的每一个page是 4KByte大小的物理内存。larger pages和global pages提供了 二类扩展的 paging 流程,此二种 pages中的page大小不是4 KByte。
11~0的bits们是目标地址在 page(依据47~12所取得的page)中的偏移量。

从线性地址到物理地址的流程为:
处理器收到访问线性地址的需求。
首先判断是否存在于TLB中,是则以查询 translation lookaside buffers(作定位页面用的后备缓冲区)的流程代替 paging流程。TLBs的笔记在paging 流程之后。
不然便进入paging的流程,一个paging流程是由一大类别的 paging structures(结构) 调控的。
一个 线性地址 被 paging成物理地址所 需要的 步骤受制于当前的 paging mode。
paging过程中需要使用的  paging structures包括:
0.最底层的paging structures的基地址保存在 CR3中,直接是52-bit的地址。CR3中保存的是 PML4 table的物理地址,而PML4 table中保存的是 地址寄存器(线性地址) 47-39 bits所使用的 物理地址 序列。所有 paging mode中的 线性地址 47-39 bits都是用来从 PML4 table中 选择 更详细层的 paging structures的物理地址。
1.根据 线性地址47-39 bits 得到了 PML4 对应元素中的 物理地址,其指向的是 page-directory-pointer table,每一个 page-directory-pointer 包含的是一个索引512 GB的物理内存范围,(注意,此512GB的内存范围是不必须相连的)此范围内的线性地址 paging时都会来到此page-directory-pointer,原因是它们的线性地址的47-39 bits相同,而不是物理地址的 bits相同 /:^]。
page-directory-pointer table中保存的是page-directroy的物理地址(英文简称PDP, page directroy-pointer)。线性地址的38-30 bits用来从此 序列中得到 更详细层的 paging structures的物理地址。
2.根据 线程地址38-30的bits得到一个PDP,它所指向的 page-directory包含索引 1GB的物理地址范围的 物理地址序列。地址值在同一1GB范围内的线性地址,也象上面的 512GB范围内的地址一样,会来到同一个 page-directory,它们的线性地址47-30 bits是一样的。
3.根据47-30 bits到达了 page-directroy,它里面的 物理地址是以29-21 bits来 索引的,代表的是一个 page table的物理地址。在同一个2MB内存范围的线性地址都在此索引到同一个 物理地址,它们有相同的 47-21 bits。事实上,在IA32e的设计中,相同2MB范围内的线性地址,63-21bits都是相同的。
另外,page-directory中的物理地址被称为 PDE(page-diredtroy entry),看过IA32 paging流程介绍的一定非常熟悉PDE了,没错,IA32e扩展的流程到此基本结束了,当然单说的paging流程。PDE提供了4GB的线性内存访问范围。
4.从page-directory中选中的 PDE内存是一个 page table(页表)的物理地址,一个页表的元素简称为PTE(page-table entry)。用在 page table中的 线性地址部分是 20-12的 bits。在相同4KB范围内的线性地址
使用的都是同一个page table,即在同一个page frame中。它们的 63-12 bits是相同的。
5.从page table中根据  20-12 bits得到了一个 (4KBs大小)内存页面的物理基地址后,11-0的值作为索引用来加在此基地(PTE)上,到此得到的值便是线性地址 完成paging后的 物理地址。
上面的笔记很晕人,但必须注意 线性地址和物理地址完全不同。线性地址相同不代表物理地址相同,在相同范围内的线性地址使用相同的一系列 page structures,最后却可能 索引往相差9999999GB 的二个地址。而且线性地址的63-47位是相同的,物理地址的此些位却还有特别的意义.因为 paging structures中的元素是用来定位下层 paging structures基址的,因此只需精确到4 kbs( 一个paging structures的大小)的程度,即 paging structures元素的低12 bits是用不到的,。
以及,在paging流程的使用中每一个 bits范围都是被用作 偏移的,不同的只不过是基地址。只有最后一次是特殊的,不需要读取值而是返回 地址的。区别象是 mov和lea。
page number,可认为是 47-12的bits,它是 线性地址中 用来得到 物理页面(page frame)的部分。线性地址的12-1 bits用来从物理页面中偏移出线性地址对应的物理地址
/:^]

每个 paging structures序列,其自身都是4-KByte的大小,占用一个页面。也即每一个paging structures包含着512个8- byte(64- bits)大小的元素。
一个paging structures中的64bits元素,除了包含52 bits的物理地址(高处的63-47也算进),还包含12个标志位,它们的值也会影响paging流程。主要是用在保护模式的设计中:
bit 0,persent位:
  若paging流程中在任何一层paging structures中遇到一个 元素的此位成了0,则立即 引发 page fault并停止 paging。一个清空persent位的 元素被认为不包含有效物理地址且不会被使用。
bit 1, read/ write:
  CPL=3(R3)代码执行级别的用户程序会被此位影响,当paging流程中遇到的所有 元素的read/write位都为1时为 允许用户程序write。不然write会引起一个page fault,特别的,当CR0中的WP(第16 bit)被 置位时,当前的CPL值也决定是否 引发 page fault
bit 2, user/supervisor:
  CPL=3的用户程序在所有的 user/supervisor位被置位时才能 访问到对应内存。不然会引起一个 page fault。
bit 5, accessed:
  由处理器设置。当一个线性地址被(操作系统等软件决策)用来 访问物理内存时,它所使用到的元素都会 置位 accessed。
bit 6,dirty
  由处理器设置。当一个线性地址被(决策)用来 写入物理内存时,它所用的的PTE会设置此位。除了page table,其他的 paging structures都不会使用此位,处理器只作忽略它的处理。
bit 63, execute-disable (bit 63)
  一个线性地址是否可用来 fetch (获取) 指令的标志。当此线性地址 paging所用到的所有 元素都清空此位时代表允许 执行(EIP指向此处)。不然遇到任何一个置位的execute-disable都引发 page fault. 注意,预处理,和为 获取指令而对内存的访问,是不会引起 page fault的,若此种情况发生了会中断预处理的指令执行。特别的,IA32_EFER MSR的 NXE(bit 11)被清空时, execute-disable 禁止为0,并被视为 保留位
reserved bits:
不同paging modes下的各个paging structue对reserved bits有不同的范围。但任何一个reserved bits被置位都会引起 page fault。
_____________________________
另外,paging structures也许存在于内存中,也可能存在于各级缓存中。一个简单的实际例子,当前看到的此文档所引用到的内存的page structures也许只存在于 page structures cache(数据缓冲区)中。

减免paging流程性能损失的设计是TLBs和 paging structures缓存。
其使用方式为,从缓冲中依据 线性地址的page number 转接(referenced)入 特定的 translation,而直接得到paging的结果。
查询流程是
首先根据page number(63-12的 bits)从TLBs查询
未得到对应translation则根据(63-21的bits)从PDE缓存中查询。
仍然未得到对应 translation则根据(63-30的bits)从PDP缓存中查询。
当依然无法得到对应translation时,根据(63-39的bits)从PML4的缓存中查询。
查询了TLB缓存的元素、PDE缓存的元素、PDP缓存的元素、PML4缓存的元素到此后,依然未曾匹配到translation,便从CR3指向的 PML4表开始一层层向下开始paging流程。
在任何一层缓存中匹配到了 translation时,会以对应translation中的 属性来作为完成paging流程的结果。

一个用来查询 TLBs的 page number,匹配时会直接从TLB中得到 由 线性地址 paging流程中的部分数据组成的信息:
  page frame,Page table Entry(PTE)中的物理地址52位 bit
  read/write, paging流程中 逻辑和 运算后得到的所有 read/write位的结果,1bit
  user/supervisor, 逻辑和paging流程中 所有的 user/ supervisor位的结果, 1bit
  dirty, PTE中的dirty 位, 1bit
  execute-disable, 逻辑或所有paging流程遇到的 execute-disable位的结果,1 bit
  注意,TLBs的元素还是可能包含 其他组合的数据的。例如一些特殊用途的TLBs,指令获取(fetches)用的 TLBs便不需要read/write和dirty bits。
每一个TLB元素都是一个独用的 translation,单独用给一个 page frame。

TLB包含  paging structures 缓存的基本属性:
1.一个TLBs元素(translation)的产生,必须要是相关persent全置位,相关reserved bits全清空。相关accessed必须全是1(产生translation时),不过特别的,处理器在 产生translation时 前总会去置位所有的accessed,当然早已置位了accessed便开始 产生。
2.缓存元素(translation)产生过程可能发生在 处理器 转换 page number到 page frame的过程中,如此会使得 translation中的 bits更新为最新的情况。但以后除了page frame属性的改变,上层PML4,PDP,PDE,PTE的改变不会引起 TLB中 translation更新。
3.代码预处理和 一些特殊的内存访问可能会被 缓存到 translations中,此处的特殊内存访问指永远不会出现 在 可执行代码的流程中的。
4.当一个page number准确对上(corresponds to)一个 TLB中translation的号时,处理器便可能利用 TLB的translation来决定 所操作的 page frame,即直接确定下层paging structures的物理地址,并会使用TLB元素中的 bits作为访问对应线性地址的处理依据。此时,处理器可能未曾把此线性地址对应的 paging structures放入内存,但依赖TLB中的translation可以访问到对应的物理内存page frame,也即structures存在于缓存中。
5,对于TLB,不应假设它的存在,包含TLBs设计的处理器也可能从不设置一个有效的 TLB元素。即我们的软件不应假设TLB的存在或假设TLB的内容。

除了page frame的 缓存TLB,处理器还可能使用其他的 paging structures缓存。
PML4 缓存,其中的数据是用线性地址的 9 bits来匹配的(47-39)
PML4的缓存有和TLB相同的paging structures 缓存基本属性,但PML4下层的paging structures 元素的persent,reserved bits,accessed不会影响 PML4 translation 的产生,即从一个 PML4缓存中取得的下层 paging structures 可能是 不persent( 存在)甚至 错误(eserved bits)的。
其下还有PDP缓存。PDP的translation的生产会被PML4中的 元素的persent/reserved bits/ accessed影响,但它的下层PDE和PTE的属性不会影响PDP缓存中tranlation的生产。使用的是
以及更下层的PDE缓存。再下层便是TLB了。

paging structures缓存中所缓存的数据是,可能不及时的translation。出现不及时的异常translation 原因是,处理器不会在 上层paging structures改变时更新translation 。此种情况称为invalidation(异常的) TLBs/paging structure caches。
软件需要负责invalidation translation的处理,特别的,对多核下的invalidation translation需要特别处理。
2010-1-8 02:15
0
游客
登录 | 注册 方可回帖
返回
//