当前位置: 技术问答>linux和unix
x86上操作系统如何保证每个进程可以寻址4G空间且相互隔离?
来源: 互联网 发布时间:2016-08-21
本文导语: 在操作系统上,每个进程是可以寻址4G空间的而且相互隔离。但是分析CPU的寻址机制,有如下疑问: 对于 x86,考虑 CPU分段机制,寻址时先将逻辑地址转换为线性地址 1)逻辑地址为 段选择符:段内偏移. 段选择符对...
在操作系统上,每个进程是可以寻址4G空间的而且相互隔离。但是分析CPU的寻址机制,有如下疑问:
对于 x86,考虑 CPU分段机制,寻址时先将逻辑地址转换为线性地址
1)逻辑地址为 段选择符:段内偏移. 段选择符对应一个段描述符,对于每个段描述符而言,段限长最大可以设置为4G
考虑极端情况,也就是使用一个描述符就可以寻址4G空间。
2)x86上线性地址空间 为4G
这就意味着,使用一个描述符寻址,在最极端情况下可以映射满整个线性地址空间。 而一个任务如果想寻址4G空间的话,必定是段基址为0,段限长为4G
假设目前有3个任务,各自都使用自己的描述符来寻址。如果每个任务都能寻址4G空间的话,必定这三个任务的段基址都为0,段限长都为4G 这样的话,这3个任务映射的线性地址必定完全重合,无法隔离。
那如何保证每个任务可以寻址4G空间且相互隔离?
貌似不太可能,但是实际系统中比如windows上的确可以运行多个进程,而每个进程寻址4G空间且相互隔离。
是理解有误?还是操作系统的进程地址空间根本就不是使用CPU分段机制来实现的?
PS:不管有没有启用分页机制都无关紧要,因为分页机制只是将线性地址进行变化,此时已经与描述符无关,也就是与任务无关。也就是即使是不同的任务,只要线性地址相同,经分页机制映射到的物理地址必定也是相同的。
对于 x86,考虑 CPU分段机制,寻址时先将逻辑地址转换为线性地址
1)逻辑地址为 段选择符:段内偏移. 段选择符对应一个段描述符,对于每个段描述符而言,段限长最大可以设置为4G
考虑极端情况,也就是使用一个描述符就可以寻址4G空间。
2)x86上线性地址空间 为4G
这就意味着,使用一个描述符寻址,在最极端情况下可以映射满整个线性地址空间。 而一个任务如果想寻址4G空间的话,必定是段基址为0,段限长为4G
假设目前有3个任务,各自都使用自己的描述符来寻址。如果每个任务都能寻址4G空间的话,必定这三个任务的段基址都为0,段限长都为4G 这样的话,这3个任务映射的线性地址必定完全重合,无法隔离。
那如何保证每个任务可以寻址4G空间且相互隔离?
貌似不太可能,但是实际系统中比如windows上的确可以运行多个进程,而每个进程寻址4G空间且相互隔离。
是理解有误?还是操作系统的进程地址空间根本就不是使用CPU分段机制来实现的?
PS:不管有没有启用分页机制都无关紧要,因为分页机制只是将线性地址进行变化,此时已经与描述符无关,也就是与任务无关。也就是即使是不同的任务,只要线性地址相同,经分页机制映射到的物理地址必定也是相同的。
|
发觉您概念很混乱。请先弄懂什么是物理内存?什么是虚拟内存?什么是物理地址?什么是虚拟地址?什么是逻辑地址?什么是线性地址?进程的4G地址空间到底是指4G物理地址空间还是4G虚拟地址空间?
|
你试试不就行了,估计还没到 3G 程序就被 Kill 了。
|
都映射到同一个地址也没有关系,只要进程切换的时候把它换到硬盘上去就行了,切换回来的时候再换回来,这样就算是映射到同一个物理地址也没有关系
|
现在的理解也不对!
没搞懂4G是什么东东
物理内存有多大没啥关系