1、实地址是没有内存保护的,一个程序可以访问整个1M的地址空间
2、最开始的8086地址线有20根数据总线最大宽度是16,正常只能寻址2^16,后面的实模式下的逻辑地址的计算都是基地址加偏移地址来算,深度探索linux系统虚拟化这本书里写了最开始是搞了四个段寄存器 cs ds es ss,个人理解就是最开始你可以选哪个段,物理地址被分成了几段,然后每一段你都可以去寻1M的地址。
不过后续都是平坦内存模型了已经不用上面这个了
什么是平坦内存模型呢?
郭健: Linux内存模型——平坦、非连续与稀疏_Linux阅码场的博客-CSDN博客
这里可以先去看一下这个博客了解一些基础。
平坦内存模型,介绍最多的就是段基地址是0,也就是说我的物理内存的寻址方式的,基地址都是0,那会不会就导致寻址范围变小呢?
首先平坦内存模型建立了四个段:
特权级3的用户代码段 数据段
特权级0的内核代码段 数据段
这4个段基地址都是0,很奇怪是吧
他咋区分,咋去访问地址呢?
这里引入了段描述符的概念
31~24就是刚刚的基地址他是0
G是单位设置 0就是以字节为单位 1就是以4KB为单位
TYPE表示是代码段还是数据段
段界限表示段的长度单位依赖于TYPE
这里我们上面说了他分四段,内核用户的代码和数据段,怎么分的呢?
看段描述符的0~15位,这里他有个名字叫做段选择子,这里配置了我们是内核用户的哪一段,还有我们是GDT 还是LDT,全局还是局部描述符,这两个概念要记住只有在保护模式里才有,因为这个段描述符里涉及了一些权限的东西,实模式没有这些,没有内存保护。
此外我看到这还有个疑问这个能寻多大的地址呢?
这里主要是看G的粒度0以字节为单位就比较小1·1M,1以4KB为单位就是4K~4G
这里想到段机制和我的分页机制的区别是什么呢?
首先实模式是生成逻辑地址
段机制是保护模式里面的(看上下猜这里是生成虚拟地址也就是线性地址的地方),但是这里要记住我如果没有分页,那段机制的生成的线性地址就是物理地址。(补充下:线性地址特指段模式生成的地址,他可以是虚拟地址也可以是物理地址)
页表机制是将虚拟地址转为逻辑地址