本课时主要介绍保护模式下的内存管理机制,以分段存储部分介绍为主,分页部分在后面的章节中介绍。
参考文档为《Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B, 3C & 3D): System Programming Guide》,仅关注其中的第3章。
IA32内存管理机制概览
IA32将内存管理分为两部分:段式存储和页式存储,目前我们只考虑了段式存储。由于这种处理,所以得出了三种类型的地址:逻辑地址、线性地址、物理地址。
物理地址:实际物理内存中的地址
逻辑地址:使用段+偏移表示的地址
线性地址:将段+偏移进行转换后的地址,也是我们程序中所用的地址。如果分页机制未开启,则线性地址=物理地址。
(注:以上在操作系统教材中是有相关介绍的,可以参考下这些郝教材)
其中段式存储特点如下:
将线性地址空间转变成多个段(segments)
每个段带有相关的保护机制
有多种类型的段:数据、代码、栈、门、tss
使用的地址为逻辑地址,即段选择子+偏移
页式存储的特点如下:
将线性地址转换为逻辑地址
在较小的内存上实现更大的虚拟内容
按需加载等功能
参考文档的第88页
平坦模型
IA32中段式存储比较复杂,用起来很容易晕,我就晕过。所以课程里使用的是基础平坦模型,其特点如下:
只用了两个段:代码段和数据段(课程的最后会用到4个)
段起始地址均为0,大小为4GB。即不管实际有没有那么大的内存空间,都设置成那么大。访问不存在的区域会产生保护异常。
即采用上述模型中,我们不使用limit界限检查,也不使用段的基地址功能,这样程序处理会更为简单。
(注:最终我们的系统采用的模型和上述略有些不同,这在以后会再提及)
逻辑地址到线性地址的转换
在程序进行内存访问时,会进行逻辑地址的转换,转换到线性地址(暂不考虑分页机制),转换过程如下:
参考资料
课程附带的intel编程文档卷3:Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B, 3C & 3D): System Programming Guide
登陆发表评论