您的位置:首页 > 理论基础 > 计算机网络

清问一个Windows的程序的LDT是谁创建的?http://topic.csdn.net/t/20061228/17/5262577.html

2007-11-14 16:20 441 查看

清问一个Windows的程序的LDT是谁创建的?

楼主Windows_80X86_C()2006-12-28 17:00:10 在 其他开发语言 / 汇编语言 提问
一个Windows的程序的LDT是谁创建的?
看了80x86编程后,可以看到程序中自己创建了GDT和LDT,那么我假如自己编写一段C语言的程序,那么最后这个程序执行,它的LDT是操作系统创建的,还是编译器创建的? 问题点数:20、回复次数:17Top

1 楼Windows_80X86_C()回复于 2006-12-29 08:48:36 得分 0

自己顶一个,有没有人明白?what's my meaning?thanksTop

2 楼Windows_80X86_C()回复于 2006-12-29 09:32:35 得分 0

是每一个Windows程序都有一个LDT吗?我的C程序里又没有构建
那它是在那个阶段构建的呢?编译器编译后or操作系统运行的时候Top

3 楼cfy_yelong()回复于 2006-12-29 09:41:14 得分 2

我个人认为都不是,应该是由操作系统来进行分配的,LDT以及GDT是保护模式下非常重要的信息,系统要非常小心的管理这些信息才能很好的起到保护作用,实际上在80x86以后,程序中的用到的资源(段地址、内存)基本上都要进过操作系统进行重新映射,因为我们的程序都是基于操作系统的,所以我们想拿任何资源都是经过操作系统来进行分配的。Top

4 楼Windows_80X86_C()回复于 2006-12-29 14:58:33 得分 0

好像针对每个程序的LDT,是由操作系统为每个进程创建的,但是操作系统又怎知,正准备从磁盘加载到内存中代码有多少个段呢?
难到这还和这个exe文件结构(PE)相关吗? 里面有描述它的各个段Top

5 楼gaoqing000(gongkejin)回复于 2006-12-29 15:02:30 得分 0

什么是LDT呀Top

6 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-12-29 18:30:06 得分 9

现在WinXP根本不用LDT


在32位Windows下
CS、DS、SS、ES的基址都是0
进程空间保护靠的是分页机制
这就是所谓的平坦内存模式

FS的基址是当前线程的线程描述块
用户模式不使用GS




Windows XP Professional SP2 下的测试结果:

CS=001B, DS=0023, SS=0023, ES=0023, FS=003B, GS=0000

GDT:
...
001B Code32 00000000 FFFFFFFF 3 P RE
0023 Data32 00000000 FFFFFFFF 3 P RW
...
003B Data32 7FFDD000 00000FFF 3 P RW
...
Top

7 楼mengshijie_1981(云中雀)回复于 2006-12-29 19:07:29 得分 0

权威答案:LDT、GDT都是操作系统的重要数据结构,GDT是操作系统最重要的数据结构,操作系统在加载应用程序时为每一个应用程序创建一个LDT,用于管理应用程序。GDT与LDT的关系类似于主干与树枝的关系。Top

8 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-12-29 19:27:46 得分 0

在WinXP下
当你双击一个exe启动一个可执行文件时
操作系统会在进程初始化时用默认值来初始化寄存器
具体的内存管理靠的是操作系统后台的虚拟内存管理机制

既:
1.操作系统将整个程序运行环境给初始化好了,你不需要管
2.操作系统根本不允许应用程序访问GDT/LDT等重要数据


而且现在Windows系统用的是平坦内存模式
只需要将那些段寄存器的基址设为0就行
既然所有进程的段寄存器都是0,那还要LDT干什么
Top

9 楼mengshijie_1981(云中雀)回复于 2006-12-29 22:24:09 得分 9

一个Windows的程序的LDT是操作系统创建的。
如果你用C语言编写的是DOS环境下的程序16位程序,那么不会有LDT的创建,如果你编写的是基于Windows的32位程序,那么它的LDT是操作系统创建的,如果你编写的程序是基于CPU的并能切换到保护模式的程序,那么GDT都得靠你自己编写,LDT你可以用也可以不用。编译器只是翻译汇编代码为机器指令,并不创建LDT。GDT、LDT是两个数据结构,但是只有程序运行后,GDT和LDT的结构被加载内存后,才叫作LDT和GDT,存在于磁盘文件中的LDT结构是数据段的一部分。Top

10 楼Windows_80X86_C()回复于 2006-12-29 23:33:50 得分 0

>GDT、LDT是两个数据结构,但是只有程序运行后,GDT和LDT的结构被加载内存后,才叫作LDT和GDT,存在于磁盘文件中的LDT结构是数据段的一部分。

我对这句话有些疑问,就是既然LDT是磁盘文件中的数据段,是指的是我不基于操作系统自己定义程序吗?即:该程序的GDT和LDT内容都是我设计的
但是一个windows的程序,存储在磁盘上,是不是它的内容里,即便是数据段里都没有LDT的结构,一切都发生在操作系统加载该程序时,根据该程序的逻辑结构,而创建的LDT啊?Top

11 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-12-30 09:36:25 得分 0

就是因为描述符很复杂
导致动态分配描述符的程序是很复杂的
所以那些保护模式例子大多是事先将所需的描述符人工计算好,并保存在到数组中,自然是在数据段
编译器编译成可执行文件,文件存储在磁盘上,这就是“存在于磁盘文件中的LDT结构是数据段的一部分”

一定要注意,代码段、数据段的“段”,在Windows平台下对应术语是节(Section),是指不同类型数据的存放区域。
千万别跟保护模式中的段描述符混为一谈。

段描述主要用于虚拟地址到线性地址的转换。而现在使用32位平坦内存模式,虚拟地址等于线性地址,所以段描述基本没用。
门描述符用作特权级转换,即内核层与应用层沟通。所以只需要一套就行了,没必要为每一个进程建立门描述符。
而LDT专门用来存放某进程特有的描述符,根本没东西放嘛,还要LDT干什么?
Top

12 楼Windows_80X86_C()回复于 2006-12-30 11:18:56 得分 0

那么按照你的意思:没有了LDT,没有了段,Windows程序采用32位平坦内存模式,虚拟地址等于线性地址,每个程序都拥有4G内可寻址虚拟空间,靠分页机制把各个进程区分开来,而这些页表是由Windows操作系统管理的Top

13 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-12-30 11:33:51 得分 0

至少对于应用程序层来说,是这样子的


这就是我用SoftICE调试的心得体会


以前Windows9X时,应用程序所用的段选择子是LDT中的,但已经都是相同的固定值(基址0、限长4G)
到了Win2k/XP,我发现,应用程序所用的段选择子直接用GDT中的默认值了
最开始的确有点奇怪,后来想明白了:在平坦内存模式下,段描述符的作用极其有限


就是因为段寄存器都是基址0、限长4G
所以整个4G地址空间都是可执行的(但受分页保护)
Top

14 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-12-30 11:36:07 得分 0

//就是因为段寄存器都是基址0、限长4G
//所以整个4G地址空间都是可执行的(但受分页保护)


// 一定要注意,代码段、数据段的“段”,在Windows平台下对应术语是节(Section),是指不同类型数据的存放区域。


这就是为什么现在的Windows系统用节的概念来管理代码段、数据段Top

15 楼mengshijie_1981(云中雀)回复于 2006-12-30 14:28:08 得分 0

再次解释:“GDT、LDT是两个数据结构,但是只有程序运行后,GDT和LDT的结构被加载内存后,才叫作LDT和GDT,存在于磁盘文件中的LDT结构是数据段的一部分。”

感谢Windows_80X86_C()的一丝不苟的关注,本人最近在编写操作系统,上述两行内容是针对操作系统程序自身而言的,并不是针对应用程序而言的,应用程序没有上述结构,也不创建这两个数据结构。与应用程序相关的LDT是由操作系统加载应用程序时创建的。虽然每个应用程序被加载后都有一个与之相关的LDT,但这个LDT数据结构却不属于应用程序,而是操作系统建立的为了管理应用程序而临时生成的数据。Top

16 楼mengshijie_1981(云中雀)回复于 2006-12-30 15:05:11 得分 0

严谨的详细答案:

1.一个Windows的程序的LDT是谁创建的?

答:如果程序不是指操作系统,那么它是由Windows创建的,如果程序是指操作系统本身,那么它就是由自己创建的。

2.看了80x86编程后,可以看到程序中自己创建了GDT和LDT,那么我假如自己编写一段C语言的程序,那么最后这个程序执行,它的LDT是操作系统创建的,还是编译器创建的?

“看了80x86编程后,可以看到程序中自己创建了GDT和LDT”,此句话中的程序就是操作系统。你看的书中的这部分内容是教你如何写操作系统。

如果你用C语言编写的是DOS环境下的程序16位程序,那么不会有LDT;
如果你编写的是基于Windows的应用程序,那么它的LDT是操作系统创建的;
如果你编写的程序是基于CPU的并能切换到保护模式的操作系统类型的程序,那么GDT都得靠你自己编写,LDT你也得要你的程序自己创建。编译器只负责翻译工作,即转化程序的表达形式,把C语言源程序翻译为机器指令的可执行文件。你的操作系统程序是由BIOS引导程序加载至内存的。Top

17 楼Windows_80X86_C()回复于 2007-01-03 14:48:06 得分 0

感谢zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)和mengshijie_1981() 的精彩而详细的解答~谢谢你们的帮助
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐