免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 新警察
打印 上一主题 下一主题

请问关于CPU的虚拟地址空间和虚拟内存 [复制链接]

论坛徽章:
2
2015亚冠之莱赫维亚
日期:2015-09-14 11:19:42操作系统版块每日发帖之星
日期:2015-11-05 06:20:00
41 [报告]
发表于 2009-09-16 08:47 |只看该作者
。。。

[ 本帖最后由 lixinwei1985@si 于 2009-9-16 08:58 编辑 ]

论坛徽章:
0
42 [报告]
发表于 2009-09-17 11:45 |只看该作者
虚拟地址空间由GDT 映射的全局地址空间和由LDT映射的局部地址空间组成。
选择符的索引部分由13 个比特位表示,加上区分GDT 和LDT 的1 个比特位;
因此Intel 80X86 CPU 共可以索引16384 个选择符。若每个段的长度都取最大值4G,则最大虚拟地址空间范围是16384 * 4G = 64T

硬件地址寻址空间,是和CPU的管脚数有关;

论坛徽章:
0
43 [报告]
发表于 2009-09-20 13:35 |只看该作者
嗯,好帖子,只有一人说对了。。。。。。

论坛徽章:
0
44 [报告]
发表于 2009-09-20 20:42 |只看该作者
原帖由 shenbo7 于 2009-9-17 11:45 发表
虚拟地址空间由GDT 映射的全局地址空间和由LDT映射的局部地址空间组成。
选择符的索引部分由13 个比特位表示,加上区分GDT 和LDT 的1 个比特位;
因此Intel 80X86 CPU 共可以索引16384 个选择符。若每个段的长 ...


   高人.

论坛徽章:
0
45 [报告]
发表于 2009-09-20 22:16 |只看该作者
GDTR是一个长度为48bit的寄存器,内容为一个32位的基地址和一个16位的段限。这是386一个专门用来寻找虚拟内存的寄存器。32位基地址是物理内存的地址,16位段限存储虚拟内存页文件的索引编号,16位其中有两位表示该内存分页的特权级别。最大内存索引虚拟内存2^14*4G=64T
--------
分析:由于GDTR是48bit寄存器,CPU通用寄存器是32bit(还有16bit)所以一个指令周期根本不能处理这个48bit的寄存器,需要很多指令操作这个寄存器。欢迎讨论。

论坛徽章:
0
46 [报告]
发表于 2009-09-20 22:48 |只看该作者
386的GDTR寄存器选择48bit是因为386是一个32位寄存器和16位寄存器混合的处理器,两部分数据分别由两种类型的通用寄存器处理。直接寻址就是一个指令周期能读入和写出的地址。GDTR寄存器仅仅代表了一种能力,可以软实现。

论坛徽章:
0
47 [报告]
发表于 2009-09-20 23:25 |只看该作者
这贴没有再讨论的必要了。


这么多人都把“虚拟地址空间”和“虚拟内存”搞混淆!


virtual address   --------------------->  linear(or physical) ----------------> physical address
(logic address)       (segmentation)                                             (paging)




1、  寄存器,包括: GDTR、LDTR、IDTR & TR, Segment(selector) registers
   数据结构,包括:GDT、LDT、IDT & TSS
  以及由此产生的各种寻址手段 -------- 段式管理范畴
------------------------------------------------------------------------------
  这些都是 segmentation (段式管理)阶段,在 segmentation 阶段没有真正意义的 虚拟内存 的概念。

  在 segmentation 阶段负责将 virtual address(有时称为逻辑地址) 转化为 linear address (无分页时是物理地址)


     在 segmentation 阶段只有地址空间的概念,整个地址空间就是 4G,无论在这个空间里怎么分割,整个空间还是 4G



2、 只有在 paging 管理下才有真正意义的 虚拟内存,通过分页可以将不存在的物理内存,虚拟成内存使用。

  可以将只有 4G 内存的机器上,通过 paging 使用超过 4G 内存。这才叫做 虚拟内存

  通过 paging 机制的,换页等手段可以实现


  在 分段机制 下能做到这一点吗? 分段机制下能访问超过 4G 的内存空间吗? 




3、 通过 GDT / LDT 来讨论 64TB 虚拟内存,地址空间等  ------ 那都是瞎谈

  不管是什么经典的教材,既使是老外的教材,我不认为他这些的说法是正确的

论坛徽章:
0
48 [报告]
发表于 2009-09-20 23:45 |只看该作者
原帖由 rawa9999 于 2009-9-20 22:16 发表
GDTR是一个长度为48bit的寄存器,内容为一个32位的基地址和一个16位的段限。这是386一个专门用来寻找虚拟内存的寄存器。32位基地址是物理内存的地址,16位段限存储虚拟内存页文件的索引编号,16位其中有两位表示 ...


不说不知道,一说就漏馅。

大哥,你好好读读 intel / amd 的手册吧!


1、现在的 GDTR 都是 80 位(64+16)

2、GDTR.base 放的是 linear address ,不是物理内存地址。(如果你硬要说是物理地址,那可以:在无分页下)


3、 >> 16位段限存储虚拟内存页文件的索引编号,16位其中有两位表示该内存分页的特权级别。
      
        啥东东,明明是 segment,说成 page


4、需要较多的时钟周期,并不是因为你说的这个原因,而是因为需要权限,它需要做更多的检测 check 工作

  这是所有 system instruction 的通病,所有 system instruction 类都需要做更多的工作。

论坛徽章:
0
49 [报告]
发表于 2009-09-21 00:03 |只看该作者
原帖由 rawa9999 于 2009-9-20 22:48 发表
386的GDTR寄存器选择48bit是因为386是一个32位寄存器和16位寄存器混合的处理器,两部分数据分别由两种类型的通用寄存器处理。直接寻址就是一个指令周期能读入和写出的地址。GDTR寄存器仅仅代表了一种能力,可以 ...

 
>>> 386的GDTR寄存器选择48bit是因为386是一个32位寄存器和16位寄存器混合的处理器

    在 386 下,GDTR 是 48 bit,是因为需求,需要 32 位 base address 和 16 位 limit。是经过考虑才设计成这样的

  选择 16 位的 limit 是因为,通过 selector 只能找到 8192(13 位) 个 descriptors,

    8192 * 8 = 10000(64K)(0 ~ 8191)选择范围是 0 ~ FFFF (16 位 limit)



>>> 386 是 32 位寄存器和 16 位寄存器混合的处理器。

  头一次听这样说,386 就是 32 位处理器,怎么说成的 32 和 16 混合的处理器,使用 32 位还是 16位处理器,

  那是指令操作数大小上的选择。


      照你这样说:64 位的 x64 处理器,那是三者的混合体??

论坛徽章:
0
50 [报告]
发表于 2011-04-26 13:02 |只看该作者
关于X86的保护模式困扰我快一年了,好不容易找到这么好的帖子,mik (AMD fusion) 说的很清晰了,在内存中的那些描述符 是(表示)假的内存即虚拟内存地址 , 而每个描述符的这个地址可以表示4GB的虚拟空间,基本上是虚拟地址------》逻辑地址----》线性地址-----》物理地址
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP