操作系统——内存管理和虚拟地址映射那些事

为什么会有内存管理???
随着计算机的高速发展,计算机早已不是单道处理模式了,不再使用古老的纸带打孔的方式,将持续输入到cpu,让其执行了,而是将程序加载到内存中去,那么当多个程序同时运行的情况下,怎么去给程序分配位置就是发明者要考虑的问题了。因此有了内存管理这种说法,内存管理的目标有两点:
1.地址保护:一个程序不能访问另一个程序的地址空间
2.地址独立:程序发出的地址应与物理地址没有直接关系

既然提到了程序,就说一下现代系统是为每一个进程提供了一个虚拟地址空间,以方便管理,同时方便共享内核空间的代码。(尽管用户空间的代码很可能不同,至少数据会不一样)

那么问题来了。
每个进程的虚拟地址空间怎么映射到实际的物理内存的呢???
想要搞清虚拟地址空间,首先要解决为什么要分段这一问题,8086体系下,为了解决16位寄存器对20位地址线的寻址问题,引入了分段式内存管理。而CPU则使用CS,DS,ES,SS等寄存器来保存程序的段首地址。当CPU执行指令需要访问内存时,只会送出段内的偏移地址,而通过指令的类型类确定访问那一个段寄存器。简而言之,就是16位寄存器无法存入20位地址,那么通过两个寄存器的相互配合,就能解决这一问题,那么分段就是必然手段。

实模式寻址方式:
相应的段寄存<<4 (段基址) + ip寄存器(偏移量) = 物理地址
p.s逻辑地址只是一个段上的偏移量

保护模式寻址方式:
(保护模式下寄存器的16位的意义为何发生改变? 原因是我要保存的东西变多了,不仅要存内存段的起始地址,还有内存段的大小,权限信息)
80386开始保护模式 所以 段寄存器存前13位全局段描述符表的索引 GDT的下标
GDT由GDTR寄存器指向 里面保存内存段的信息:1.内存段的起始地址2.内存段的大小3.内存的访问权限
GDT每个表项的大小是8个字节 所以 GDT 一共63.多MB
段描述表项中的长度有20位:所以内存寻址2^20 = 1M
段描述表项中的G标志位若为0:描述内存的单位为1
若为1:描述内存的单位为一个页面,即4k,
所以保护模式下,内存的地址映射为:
GDT[相应的段寄存>>3 ].baseaddr +(ip和length 比较) = 线性地址
(通过相应的段寄存>>3 作为索引 在GDT数组中找到对应下标,取其中的内存起始地址 加上偏移量 构成)
若没有开启分页机制,线性地址就是物理地址

若开启分页机制,线性地址则是虚拟地址
为啥有段页式管理:向前兼容,为了用8060等的代码

页表放在系统空间的页表区,存放逻辑地址和物理地址的映射关系
对于32位寻址,每个页4K,一级页表映射将有2^20 = 1048576条记录还是太多,因此有了多级页表映射。


有了新的理解的话日后补充。。。。。。

猜你喜欢

转载自blog.csdn.net/stark_burton/article/details/80243156