前两篇已经说过了多任务的切换原理,留有一个问题,就是linux跳过了分段,逻辑地址总是等于线性地址那么是如何对进程进行隔离的?
再说这个之前有几个概念
1.物理内存--你可以直接理解为你的内存条。
2.虚拟内存--假设你的电脑是32位的那么他的寻址空间为4G,但假设你的内存只有2G,如果有的程序分配到了超出2G的数据段怎么办?实际上x86体系会使用虚拟内存技术,他会将系统最用不到的内存数据读出来放在外设比如磁盘中,然后把你这个超出的内容再放入内存,你看似是递增的但实际上他不是,他是利用的其他的空间。你实际拥有的内存就成了4G你感觉是连续线性增长的但实际上是被做了手脚的,我们不用关心系统如何做到只要用这4G就可以了。(这只是感观说法,下面会官方化一下)
3.逻辑地址。程序中经过gcc编译的基本就是逻辑地址,选择子+偏移地址组成。
4.线性地址(又叫虚拟地址)。线性地址是段基址+偏移地址,在linux由于各个段基址都是0所以虚拟地址就是逻辑地址。
5.线性地址到物理地址还有一次转化就是分页转化。
linux将虚拟地址和物理地址都按照4k一个单位大小分成若干块,虚拟地址与物理地址又是一一对应的,虚拟内存的块叫做页,物理地址块叫做页帧。那么问题来了,虚拟地址大于物理地址啊这个就是2中的情况,linux是这么处理的,linux有一个页面失效功能,linux找到物理内存最少使用的那个页帧,让他失效并将之写入磁盘,然后把要访问的页放入这个页帧,最后修改页表中的映射。
每一个任务都会维护一个自己的页表,这个页表就是虚拟地址向物理地址的映射关系,不同的任务相同的虚拟地址会被映射到不同的物理地址,这个过程系统会为我们去做我们无需关心。这么看来分页机制才是linux保护模式的核心。
参考
http://www.cnblogs.com/curtful/archive/2012/02/16/2354496.html