首先先回顾了下cpu的LDE模式的思路,主要就是在大多数时间让程序直接在硬件上运行,但是在一些关键功能上,比如硬件访问,进程调度上能够让os得到控制,从而实现了高效运行的同时也能保证对系统的控制。
这一章要说的内存控制也是一样的思路,我们需要一些基本的硬件的支持,在这之上让os能够高效的实现vm.并且我们实现的vm也是需要有很好的扩展性,因为对程序来说,内存的变化是非常频繁的。
为了实现vm,我们会使用到地址翻译,也就是说程序看到的内存地址都是虚拟的,而实际的物理地址是由os来掌握的,当然单凭硬件是无法虚拟的,硬件只是提供了实现的基本支持,需要os会运用物理硬件的功能,加上软件的管理来记录实际物理地址的使用情况,提供对应的分配和回收内存的功能,从而实现在对内存加以控制的情况下的高效的虚拟化。
再次强调,我们要做的是实现一个美好的假象:让每个进程都能看到自己独立的,并且大小一致的地址空间。在这之下的各种盘根错节的处理都由os来进行。
首先从最基本的说起,我们先做几个简单的假设:
1.用户的地址空间在物理内存中是连续存储的
2.地址空间的大小不会大于物理内存
3.假设地址空间都是相等大小的
首先我们来介绍一种动态分配地址空间的方式:
比如这段代码
128: movl 0x0(%ebx), %eax ; load 0+ebx into eax
132: addl $0x03, %eax ; add 3 to eax register
135: movl %eax, 0x0(%ebx) ; store eax back to mem
如果要运行这个程序,首先