熟悉GDT的前辈进来看一下好么?

moomee 2009-04-19 12:38:02
网上的GDT资料说的都比较简单,看完之后我不知道自己的理解是否正确,如果理解错误很可能我要花相当长的时间来意识到它是个错误,所以想请教一下我的理解是否正确。

我对GDT的理解:
GDT是一个表,有很多表项,每一个项就是一段内存,这段内存可以人为自由划分,GDT表项里描述了它的地址、长度以及一些安全属性。保护模式下的cs只是GDT表项的索引。
LDT也是一个表,它是将GDT每一表项所描述的内存再进行细分用的。每一个LDT描述了具有共同作用的一组段,它们本身存在于某个GDT表的内存中。
所以,GDT把内存线形地址分成了若干段,它只有一个。而每一个GDT项所表示的内存都可以分为N个LDT来表示,LDT表示的段可以交叉可以完全不同。

是不是动态连接库的加载就是通过LDT呢?所有的动态库都按LDT格式写好存成一个表,每当一个程序加载时,就写一个LDT出来,然后把DLL表信息写进那个LDT,然后不用复制内存,也不用再加载那么多DLL了。
...全文
403 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sexboyohyeah 2009-04-22
  • 打赏
  • 举报
回复
WIN32系统下DLL文件装入内存后是共享的进程,所以DLL一定是加载到GDT,参数由调用程序提供,返回参数在EAX中,保护模式下一定采用分段机制,基本上所有的OS同时也启动分页,只要是保护模式则内存寻址就一定先在GDT/LDT/(IDT*)中由SREG索引描述符生成32位线性地址)IA-32模式(
大熊猫侯佩 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 moomee 的帖子:]
是不是动态连接库的加载就是通过LDT呢?所有的动态库都按LDT格式写好存成一个表,每当一个程序加载时,就写一个LDT出来,然后把DLL表信息写进那个LDT,然后不用复制内存,也不用再加载那么多DLL了。
[/Quote]
非也!dll用的是物理内存页共享及属性限制(比如写拷贝)机制。
elmnd 2009-04-22
  • 打赏
  • 举报
回复
GDT, 就把它看成一个结构体,爱好者里面放了很多东西的. 然后想用就在结构体上用就是了
sexboyohyeah 2009-04-21
  • 打赏
  • 举报
回复
GDT&LDT是保护模式下供所有SREG索引的一个表,表里的64位值读入CPU的默人高速缓存REG后得到32位的线性地址,如不采用分页机制则直接输出到地址总线
cnzdgs 2009-04-19
  • 打赏
  • 举报
回复
GDT是一个数组形式的表,表项个数(数组长度)不固定,每项(元素)是8字节的描述符。GDT有一个。
LDT与GDT类似,不同之处是LDT可以有很多个。
在Windows系统中,cs、ds、es、ss都是完全重叠的,加载DLL并没有改变段寄存器,所以也不涉及GDT和LDT。
rqshi0315 2009-04-19
  • 打赏
  • 举报
回复
Gdt 描述符表里是GDT描述符,每个GDT描述符8个字节。描述符分代码段和数据段描述符、系统段描述符和门描述符。
代码段描述符为例讲一下工作原理:

在操作系统内存管理中,采用分段机制,为不同的程序或数据分在不同的段中,段与段之间有访问权限的设置(这里不做具体分析),可以这样理解A程序不能随便访问B程序的数据段,这样起到一定的保护作用,因为现在的系统都是多任务的了,这种做法能起到保护作用。

但是段那么多,怎么找到呢? 那就是通过段描述符了。上边说了,一个描述符有8 个字节,其中有4 个字节用来放段的地址,2.5个字节即20位放段的界限,即长度(光有地址也不能完整描述一个段,还要有他的长度)。1.5 个字节放段的属性(这里不细说)。

好了既然段的描述符能确定相应的段,那么这个描述符怎么确定呢? 通过选择子,选择子是16位的,他放在16位寄存器CS中,顺便忘了说了这只是在保护模式下的。如果是实模式下,那么cs 中是段的地址。当然有想选择子能找到相应的描述符,那么描述符表必须装到GDTR(描述符表寄存器)中。

所以你理解的基本正确,但有一点,并不是GDT把内存分成段,GDT只是一个数据结构而已,线性地址的转换是cpu在保护模式下在自动转换的。因为段的大小不定,也难以说是固定划分的。涉及到线性地址的划分的话,应该是分页机制,在386中一个页是4K,在页表页(页目录表)中有1024个页目录(PDE),每个页目录指向1024个页表项(PTE),每个页表项指向一个4K大小的页表,这样 4K * 1024 *1024 =4GB 的线性地址空间

我 说的也不详细,有不对之处请多指证,大家共同交流进步!
BAYNPU 2009-04-19
  • 打赏
  • 举报
回复
可以参考<汇编语言程序设计教程>杨季文著,第10章保护方式下的80386及其编程.

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧