我正在努力理解低级别的内存管理,有几个问题:
1)Kip R. Irvine编写的汇编语言书籍中提到,在实模式下,程序启动时前三个段寄存器将装入代码、数据和堆栈段的基地址。这对我来说有点含糊不清。这些值是手动指定的还是汇编器生成指令以将这些值写入寄存器?如果是自动进行的,那么它如何找出这些段的大小呢?
2)我知道Linux使用平面线性模型,即非常有限地使用分段。此外,根据Daniel P. Bovet和Marco Cesati所著的《深入理解Linux内核》一书,GDT中有四个主要段:用户数据段、用户代码段、内核数据段和内核代码段。所有四个段的大小和基地址都相同。我不明白为什么需要四个段,如果它们只在类型和访问权限上有所不同(它们都产生相同的线性地址,不是吗?)。为什么不只使用其中一个并将其描述符写入所有段寄存器?
3)不使用分段的操作系统如何将程序划分为逻辑段?例如,如何在没有段描述符的情况下区分堆栈和代码。我读过使用页面处理此类事情的方法,但不理解如何实现。