关于ldt的一个疑问

Anod221 2007-11-04 05:05:57
一般来说每个程序编译完成得到了可执行的文件,里面是否会带有此程序专门的ldt呢?如果有的话,那这样的程序在多任务系统下面同时运行两个,操作系统应当怎么为它们分配内存空间啊?
...全文
92 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Anod221 2007-11-05
  • 打赏
  • 举报
回复
那我想知道,我在同一时刻运行同样的一个可执行文件,里面有一个全局变量t,那这样的全局变量在可执行文件中应当有一个特定的地址(逻辑地址)吧,那我在一个进程下面改动这个t,另外的进程中的t是不会改变的,所以他们的物理地址应当是不一样的,那是怎么做到的呢,按道理无论是用段表的方式还是页表的方式它们都会映射到相同的地址吧?
Anod221 2007-11-05
  • 打赏
  • 举报
回复
//按道理无论是用段表的方式还是页表的方式它们都会映射到相同的地址吧?

你从哪看到的这个结论?不论是分段或分页机制都可以轻易做到不同地址
的映射。

是这样子的,我在网上看到winodws下面是默认把六个段寄存器的选择子选择到基址为0的4g的内存空间(flat模式),而我是在lunux底下用gdb同时开两个gdb调试同一个程序:
#include <stdio.h>

int t;

int main()
{
printf("%i\n",t);
t = 9;
printf("%i\n",t);
return 0;
}

在运行到t=9这一句,我用i reg看所有的寄存器,在两个gdb下面可以看到六个段寄存器是一样的值(而且指向的是GDT,因为第2位是0),所以有理由相信得到的线性地址是一样的(系统的GDT没有必要常常变动吧)!如果页表在我的gdb调试的时候没有进行动态的变动的话,当然是会映射到相同的地址的(我是看不到cr0和ldtr,gdtr的寄存器的内容的)
大熊猫侯佩 2007-11-05
  • 打赏
  • 举报
回复
//按道理无论是用段表的方式还是页表的方式它们都会映射到相同的地址吧?

你从哪看到的这个结论?不论是分段或分页机制都可以轻易做到不同地址
的映射。
王鲲彩 2007-11-05
  • 打赏
  • 举报
回复
同一个程序运行两次,就是两个不同的进程。一般操作系统会为不同的进程分配不同的LDT。
注意逻辑地址一般只是编程时从0开始的偏移地址而已。
大熊猫侯佩 2007-11-04
  • 打赏
  • 举报
回复
这是 保护模式的一个理论概念,但在 windows NT 中用的很少。

//一般来说每个程序编译完成得到了可执行的文件,里面是否会带有此程序专门的ldt呢?
它不是必须要有的。

21,458

社区成员

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

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