LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3900|回复: 6

页式内存管理的问题:程序的合法地址范围

[复制链接]
发表于 2009-9-28 21:10:44 | 显示全部楼层 |阅读模式
比较初级的内存管理使用的一种实现机制是:基址与极限。
基址与极限的工作原理是将程序发出的虚拟地址加上基址而获得物理地址。如果地址超过指定的极限,则视为地址出界而禁止访问,否则正常访问。

对于页式管理,当程序需要增长空间时,需要分配额外的虚拟页面,并找到闲置的物理页面存放。
问题是,此时程序的虚拟地址空间不连续了(难道还是连续的,如何做到的?),也就不能用基址加极限的机制来限制访问了。这种情况下,如何判断程序发出的虚拟地址是否合法?
发表于 2009-9-28 21:37:28 | 显示全部楼层
在页式管理中,程序所用的地址是虚拟地址空间的地址,不是真正的物理地址。在虚拟地址管理机制中,跟物理地址管理一样,也将地址空间分成相等大小的若干块,其中每一块就叫做页,而且虚拟页的大小跟物理页的大小是一样的。既然程序的所用的地址是虚拟地址,那么它是如何找到物理地址的呢?这在虚拟地址空间和物理地址空间中间就存在一个转换(就是一张表),表中的内容是虚拟地址空间到物理地址空间的映射(其实只要始地址映射上就行了)。

在虚拟存储管理机制中,如果程序的地址空间不超过一页,那么就把一整页分给它,这时程序的虚拟地址空间就是连续的了;如果其地址空间超过一页,就分多页存放,多页之间不一定非得是连续的,只要能保证它们之间的链接就行。然后在程序运行时,就去查表找对应的物理地址就行了。

还有那个“基址与极限”是不是应该是”基址与偏移量“啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-28 21:40:59 | 显示全部楼层
问题是,程序发出一个地址(此时是虚拟地址),如何判断它是否合法呢?
btw,基址加极限的意思就是基址加偏移址极限。
Post by openware;2031332
在页式管理中,程序所用的地址是虚拟地址空间的地址,不是真正的物理地址。在虚拟地址管理机制中,跟物理地址管理一样,也将地址空间分成相等大小的若干块,其中每一块就叫做页,而且虚拟页的大小跟物理页的大小是一样的。既然程序的所用的地址是虚拟地址,那么它是如何找到物理地址的呢?这在虚拟地址空间和物理地址空间中间就存在一个转换(就是一张表),表中的内容是虚拟地址空间到物理地址空间的映射(其实只要始地址映射上就行了)。

在虚拟存储管理机制中,如果程序的地址空间不超过一页,那么就把一整页分给它,这时程序的虚拟地址空间就是连续的了;如果其地址空间超过一页,就分多页存放,多页之间不一定非得是连续的,只要能保证它们之间的链接就行。然后在程序运行时,就去查表找对应的物理地址就行了。

还有那个“基址与极限”是不是应该是”基址与偏移量“啊?
回复 支持 反对

使用道具 举报

发表于 2009-9-28 21:46:13 | 显示全部楼层
Post by qzchenwl;2031336
问题是,程序发出一个地址(此时是虚拟地址),如何判断它是否合法呢?
btw,基址加极限的意思就是基址加偏移址极限。

程序的虚拟地址不是程序发出的,而是在编译时形成的,以后程序执行时,操作系统的程序加载器就将其载入内存,并完成相应的地址转换工作,所以就不存在你说的这个问题了。具体的细节还是比较复杂滴,那本OS书里有,去看看吧:-)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-28 21:50:26 | 显示全部楼层
恩,我再看看
Post by openware;2031339
程序的虚拟地址不是程序发出的,而是在编译时形成的,以后程序执行时,操作系统的程序加载器就将其载入内存,并完成相应的地址转换工作,所以就不存在你说的这个问题了。具体的细节还是比较复杂滴,那本OS书里有,去看看吧:-)
回复 支持 反对

使用道具 举报

发表于 2009-10-11 14:01:53 | 显示全部楼层
Post by qzchenwl;2031326
比较初级的内存管理使用的一种实现机制是:基址与极限。
基址与极限的工作原理是将程序发出的虚拟地址加上基址而获得物理地址。如果地址超过指定的极限,则视为地址出界而禁止访问,否则正常访问。

对于页式管理,当程序需要增长空间时,需要分配额外的虚拟页面,并找到闲置的物理页面存放。
问题是,此时程序的虚拟地址空间不连续了(难道还是连续的,如何做到的?),也就不能用基址加极限的机制来限制访问了。这种情况下,如何判断程序发出的虚拟地址是否合法?


虚拟地址没有什么连续不连续的, 每个进程都有4G地址空间,理论上对于这4G的空间,都是这个进程可以用的的虚拟地址,取决编译器和链接器在编译的时会对虚拟地址的分配

在一个进程里对任何一个虚拟地址访问都是可以的, 如果虚拟地址映射到物理地址了,不会有什么问题(如果不考虑访问权限之类的限制),如果没有映射,就出错。每个进程都有自已映射表, 这个是进程切换时要处理的
回复 支持 反对

使用道具 举报

发表于 2010-1-4 00:19:38 | 显示全部楼层
虚址加上基址叫基址寻址吧
分页的话有个东西叫页表 要查表找内存块滴 虚地址是逻辑地址连续与否看程序方面
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表