1
2
2
远古的开发模式弊端:
程序的定位非常困难,原因:
当一个程序员在一台机器上使用内存的开头和结尾的位置,这个内存512K;
换一台电脑运行,内存变小了256k,那么原来的程序就不能再这一台电脑上运行了;
多道程序:
A程序和外设交互,这时处理器是空转的,另外的B程序就能在处理上运行,为什么会有障碍呢?还是因为使用实地址的问题
当A和B程序有重叠的时候,并行执行会导致问题,此时就不能并行执行了。
3
段地址:偏移地址
段地址指的是一段内存的起始地址,偏移地址指的是相对于段地址偏移了多少,如果实地址发生了冲突,那就改一下段地址的位置就可以了。这是一种模块化的思想,模块整体移动,解决了冲突难以定位的问题;
如何访问1M所有的内存呢?段寄存器和通用寄存器配合访问。
4
当今处理器的鼻祖
5
默认段地址放到ds寄存器中
6
处理方式:不处理
7
不处理的过程推理,最后结果:可访问的最大地址+HMA
HMA是无效地址范围
8
8086高端地址映射到低端地址,使其合法化,这个是保护模式的触发点
9
10
11
8086没有考虑安全性
12
80286中2代表第二代产品
13
14
保护模式,保护内存段的安全
15
16
段属性
段界限:表示段内偏移地址的最大值,实际物理地址=段基地址+段偏移地址(也就是段界限)在运算时,需要检查一下段偏移是否在合法的范围内。
这样就防止"回卷"了。
段基质分开写了,是历史原因,自己不需要拼装,硬件已经拼装好了;
17
相当于一个数组,放到了内存里,在80286中把描述符表放到了gdt_ptr寄存器中了;
每一个段描述符,都是一段内存的定义;
18
19
2、8086是默认0-19地址线
3、把描述符表的地址放到gdt_ptr寄存器里
4、把某个寄存器的某一位从0变成1就可以了
20
21