qq974969638 发表于 2012-9-11 04:26:10

被骗好多年,诚心求知!真相是什么?

一直以为,找操作系统分配一个内存空间,假设 是10000那么在内存条上的位置也是 10000
也就是 定义一个内存 进行加减乘除 MOV SUB INC 等指令就是直接在数据总线上 发送 10000 的 二进制,
在 8086的时候,这还真是这样
可学到 X86 汇编,妈呀,什么内存分页,搞了半天才知道,
原来 4GB内存 空间是虚拟的,
内存地址也是虚拟的
这也终于明白,为什么之前微研究逆向,一个CALL/变量 地址 会有静态的
(此前一直以为, 这些 CALL/变量地址 是根据 PE 启动过程 PE头和 操作性进行重定位 重新分配内存地址,也就是
假定, 设定子程序1 地址=100
若,在程序运行前,其他程序 分配了 地址 100
程序启动过程就 重定位一个地址给 子程序
原来他妈的不用考虑地址被占用,直接独享4G地址啊,我擦..............)
不得不说,虚拟内存很好,很强大!!!!!!


问题:虚拟地址转物理地址
(对于一个要转换成物理地址的虚拟地址,CPU首先根据CR3中的值,找到页目录所在的物理页。然后根据虚拟地址的第22位到第31位这10位(最高的10bit)的值作为索..........百科资料 )


暂且不讨论 具体过程,我想问的是
CPU将一个 虚拟地址转化成物理地址 的过程,岂不是 涉及到 读取内存,计算地址 等等操作?
那么,每一个涉及地址的 指令岂不是都要大费周章去 计算物理地址?
上亿的CPU指令,都涉及到 了 虚拟地址,CPU如何做到高效率的?
一级缓存?二级缓存?三级缓存?不够用吧.............

川本姨夫 发表于 2012-9-11 18:18:23

每个任务有不同的页目录和页表,计算无力地址的开销很小的,所以为了考虑内存还采用了两级页表

网络学习 发表于 2012-9-11 18:58:24

很复杂的问题静观解答

qq974969638 发表于 2012-9-12 03:37:48

川本姨夫 发表于 2012-9-11 18:18 static/image/common/back.gif
每个任务有不同的页目录和页表,计算无力地址的开销很小的,所以为了考虑内存还采用了两级页表

谢谢指导
...............00000000000000000.......

QICQ 发表于 2012-9-12 08:36:11

建议去看看操作系统 。
页: [1]
查看完整版本: 被骗好多年,诚心求知!真相是什么?