首页
社区
课程
招聘
[求助]这么理解保护模式下的内存寻址对吗?
发表于: 2009-2-4 20:27 3949

[求助]这么理解保护模式下的内存寻址对吗?

2009-2-4 20:27
3949
看了几遍保护模式  对着那GDT LDT的图看了半天
以前总搞不懂
保护模式下  线性地址指向物理内存的过程 可能我比较笨。。。·
目前这么理解对吗

线性地址=段地址+偏移地址

段地址怎么来?根据选择子也就是段寄存器的值 查GDT或LDT表 获取这个段的基地址(也是线性地址)还有这个段的保护属性,偏移地址就寻址寄存器的数值
GDT或LDT只是内存中的一段数据。地址也是线性地址。不过应该是所有的进程空间里都映射到同一块物理内存?GDT表的线性地址存在GDTR里。LDT表的地址也需要查询GDT,LDTR寄存器和其他段寄存器类似,同样存放索引。段寄存器使用GDT还是LDT取决于他们的TI位。

线性地址或称逻辑地址?它由内存管理器分页机制 把地址映射到不同的物理内存页也可能是虚拟内存页

不知道这么理解对不对?如果对的话。。。。这么简单的问题我为什么困惑了N天就是想不通(N>7)这线性地址和物理内存地址的对应关系。。。难道我真的很笨?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
顺便问下 上次偶然看到有人说。WinXP下没有LDT 这个说法对吗?
此问题不用回答了···
正好看到相关的介绍章节···惭愧。。
2009-2-4 20:37
0
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
基本不用LDT
2009-2-4 20:56
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
逻辑地址 通过 分段机制 映射到 线性地址
线性地址 通过 分页机制 映射到 物理地址
2009-2-4 20:56
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
那可以理解成
逻辑地址就是查表前的地址?如 cs:eip ds:esi ss:esp
分段机制就是查GDT
分页机制就是切换页表?
吗?
2009-2-4 21:05
0
雪    币: 175
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
|AA|BB|CC|DD|EE|FFFFFFFF|GG|HHH|II|JJ|KK|LL|MM|NN(这个是物理内存)
其中的|就好象一把刀把我们的腊肠分砍成了很多截
然后呢
又把AA这一截砍成很多小快
每一小快呢
贴上小标签,比如(FF是可写的,长度是8)
然后呢,我们的GDTR指向AA
再然后呢
我们的DS装着一个数,这个数是表示要找的小标签在AA里是第几个小快(选择子)
然后呢,就得到这个小标签上指的那快腊肠了
然后这快腊肠很长
我们再用一个叫偏移的东西来表示从这个腊肠开始到我们要啃的地方的长度
这样呢
就晓得老我们要找的实际地址老塞
不知对否
2009-2-4 21:19
0
雪    币: 135
活跃值: (76)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
比喻的很好啊..可是还是没理解透
2009-2-6 01:23
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
8
我按照我的理解再说一下这几个概念,不是正式的定义,可能说得不准确不严谨,但是比较容易理解。

逻辑地址:逻辑地址是由“段”和“段内偏移地址(也叫有效地址)”组成的。一般用冒号分隔,写成seg:offset的形式。

线性地址:从0到体系结构的指针类型所能达到的最大值的地址,这个地址范围称为线性地址空间,这个空间中的取值就是一个线性地址。

物理地址:就是最终出现在硬件的地址总线上的值,与地址总线的宽度相同。

在分页未开启时,线性地址就等于物理地址;在分页开启时,线性地址空间通常又称“虚拟地址空间”

在分段机制“关闭”(实际上是从功能上等效为绕过,因为80x86硬件实际不能关闭分段机制)时,即把段的基址设为0(还有段限设为最大值),则有效地址等于线性地址;在分段机制开启时,则有效地址用near指针表示,完整的逻辑地址用far指针来表示。

例子1:

8086是16位处理器,数据宽度,即寄存器宽度为16位,那么受到此限制,有效地址用16位表示。但是它的地址宽度是20位,即物理地址有20位,并且此架构不支持虚拟存储(即分页机制),因此线性地址空间等同于物理地址空间,也就是说16位的有效地址无法覆盖整个20位的线性地址空间,为此,引入了分段的机制,以及逻辑地址的概念。

例子2:

在IA32机器上,有效地址、线性地址和物理地址都是32位,段16位,因此near指针32位,far指针48位,线性地址空间是4GB(0 - 0xFFFFFFFF)。Windows(以及大多数现代操作系统),由于C语言对指针的要求,采用flat内存模型,即分段机制被绕过。这样,用near指针就可以寻址全部的线性地址空间,满足C语言中“单一指针类型”的要求。如前所述,有效地址=线性地址(虚拟地址)

例子3:

IA32处理器后来引入的PAE Paging机制,在32位有效地址、32位线性地址的基础上,通过特殊的分页机制,支持36位物理地址。

例子4:

IA32-EM64T技术,将32位处理器扩展到64位,线性地址空间扩展为64位,物理地址为40位,通用寄存器扩展为64位,有64位的有效地址,分段模式被忽略(实际上没有完全忽略,详细说明见体系结构手册)。
2009-2-6 08:29
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
保护模式下寻址方式

           分段机制和描述符          对应
1虚拟地址-----------------线性地址----------物理地址     在不采用分页管理机制时(不开启)
           分段机制和描述符         分页机制
2虚拟地址-----------------线性地址----------物理地址          分页机制开启
               分段机制和分页机制是两种不同的机制
       分段机制在线性地址中创建段表此时在没开启分页机制的时候 1和2中线性地址的块结构是一样的都是分段机制划分的块   线性地址直接对应物理地址
       分页机制开启后,2中的线性地址和物理地址从新建立了表,从新定位了机制表的位置、大小和使用情况。

2中虚拟地址转换线性地址,访问段转换机制划分的表,此时因为分页机制的开启,映射的表从新划分,表的对应关系也不同了,所以他访问的那个段地址还是那个段地址,可是分页机制已经从新划分的了,映射地址所处块大小位置也发生变化,此时映射的物理地址的位置也就不同了。
在2里面的线性地址中访问段转换机制的表格的时候不会察觉分页机制已经直接把线性地址转换成物理地址了,访问的1中的段转换机制表在2中已经是分页机制从新划分映射的表了,对应的物理地址块也就不同了。、

希望哪位大牛路过给看看  我理解的对不对   还在入门过程中确实很困惑啊   自当感激不尽!
2009-2-28 05:40
0
雪    币: 232
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
基本不用LDT
2009-2-28 08:32
0
雪    币: 232
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
读《linux源代码情形分析》上,第一二章可得到详细透彻的答案 ~·
2009-2-28 08:34
0
游客
登录 | 注册 方可回帖
返回
//