|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
一直以为,找操作系统分配一个内存空间,假设 是 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如何做到高效率的?
一级缓存?二级缓存?三级缓存?不够用吧............. |
|