加载器知道分段已关闭(无异常)时,加载器是否会更改重定位表?

时间:2018-11-24 11:08:08

标签: assembly memory-management linker operating-system

让我尝试解释我的模糊问题。

几天前,我开始学习分页和分段,今天我了解到,通过将所有分段的基数都设置为0并将它们的最大值设置为限制2 ^ 32(也称为平面内存模型),可以忽略分段)。

但是在此之前以及今天(尽管已被忽略),每个内存引用都由一个段寄存器组合:段偏移量。段寄存器是一个选择器,它包含段表中段的索引,该表包含段的基地址。正如我之前所说的全0。此内存引用也称为“逻辑地址”。

从我的角度来看,在每个段都有自己的内存空间的时候,我们将通过以下方式到达代码的第一个字节:调用CS:0,并通过[DS:0]到达数据的第一个字节。 / p>

但是今天(我认为)将不起作用,因为所有段都使用相同的内存空间,因此代码需要不同。举例来说,代码的第一个字节应位于(任意地址)调用CS:0x4567(只是绝对的,而不是像以前那样的偏移量) 并且第一个数据字节将位于(任意地址)[DS:0x12121212]。

因此,当有或没有分段的情况下,将相同的代码加载到ram时,相同的代码应该有所不同。所以我的问题是,我说得通吗?如果没有,请向我解释事实,因为我提到的只是猜测。如果我是正确的,那么加载程序是否会执行所有这些重定位操作(因为它知道分段是打开还是关闭)?因为从我的角度来看,启用和禁用分段的代码与我上面提到的原因应该有所不同。

谢谢,祝你愉快。

0 个答案:

没有答案