注:本文档为《从0学x86操作系统》课程配套的学习文档,提供相应的辅助学习资料和答疑勘误。 有关该课程的信息,请点击这里访问:https://study.163.com/provider/1017884735/index.htm 在阅读本文档时,如有疑问和建议,欢迎在下方留言或者直接联系我。

本课时主要介绍保护模式下的内存管理机制,以分段存储部分介绍为主,分页部分在后面的章节中介绍。
参考文档为《Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B, 3C & 3D): System Programming Guide》,仅关注其中的第3章。

IA32内存管理机制概览

IA32将内存管理分为两部分:段式存储和页式存储,目前我们只考虑了段式存储。由于这种处理,所以得出了三种类型的地址:逻辑地址、线性地址、物理地址。

  • 物理地址:实际物理内存中的地址
  • 逻辑地址:使用段+偏移表示的地址
  • 线性地址:将段+偏移进行转换后的地址,也是我们程序中所用的地址。如果分页机制未开启,则线性地址=物理地址。

(注:以上在操作系统教材中是有相关介绍的,可以参考下这些郝教材)
其中段式存储特点如下:

  • 将线性地址空间转变成多个段(segments)
  • 每个段带有相关的保护机制
  • 有多种类型的段:数据、代码、栈、门、tss
  • 使用的地址为逻辑地址,即段选择子+偏移

页式存储的特点如下:

  • 将线性地址转换为逻辑地址
  • 在较小的内存上实现更大的虚拟内容
  • 按需加载等功能

image.png
参考文档的第88页

平坦模型

IA32中段式存储比较复杂,我们使用的是基础平坦模型,其特点如下:

  • 两个段:代码段和数据段
  • 段起始地址均为0,大小为4GB。即不管有没有那么大空间,都可访问,访问结果未知。

image.png
即采用上述模型中,我们不使用limit界限检查,也不使用段的基地址功能,这样程序处理会更为简单。
(注:最终我们的系统采用的模型和上述略有些不同,这在以后会再提及)

逻辑地址到线性地址的转换

在程序进行内存访问时,会进行逻辑地址的转换,转换到线性地址(暂不考虑分页机制),转换过程如下:
image.png

参考资料

  • 课程附带的intel编程文档卷3:Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B, 3C & 3D): System Programming Guide