LinuxSir.cn,穿越时空的Linuxsir!

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

问一个关于Linux上内存的问题

[复制链接]
发表于 2006-9-20 10:24:31 | 显示全部楼层 |阅读模式
在Linux上,程序的在编译时确定了代码段、数据段等除堆和栈部分的大小,堆和栈是在程序运行时确定的,但是不管怎样,都会给他们分配一个起始地址,栈是从高地址向低地址扩展,而堆是从低地址向高地址扩展的。那我有几个问题:
1. 是系统的哪一部分给他们分配了地址,各自分配多少呢,依据是什么?
2. 一个程序的虚拟内存区的地址和另外一个虚拟内存区的地址是独立的,还是统一的呢?如果是独立的,在进程切换时,是系统的哪一部分负责管理这么多种地址?而如果是统一的,在系统分配了确定的堆和栈的起始地址后,如果需要的空间超过了现在的容量,但是还远远没有达到32系统最大的4G大小时,系统又是如何处理的呢?

盼望高人指点!!any reply is appreciated!
发表于 2006-9-20 13:16:20 | 显示全部楼层
1.自然是OS的内存管理部分分的,分多少忘记了,
2.两个进程的虚地址当然是分开的,硬件/软件联合作用实现虚地址保护

超过什么容量? 内存?

看<LINUX内核源码分析>
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-22 09:00:42 | 显示全部楼层
后来又看了一些东西,明白了第2个问题,每个进程都有自己的虚拟内存地址,每个进程有自己的页表;在进程切换时,由OS的进程切换部分负责切换页表。故每个程序可用的内存空间都是3G的。但是对第一个问题还是不知道,不知道初始分配的大小和依据。因为栈和堆的增长方向是相向而行的,这样如何保证他们不会冲突呢?
回复 支持 反对

使用道具 举报

发表于 2006-9-24 16:00:42 | 显示全部楼层
:->栈和堆的增长方向是相向而行的,这样如何保证他们不会冲突呢?

这就是著名的缓冲区溢出利用的弱点所在. 看一下缓冲区溢出方面的文章有帮助
回复 支持 反对

使用道具 举报

发表于 2006-9-24 18:28:39 | 显示全部楼层
缓冲区溢出与此关系不大,或者说我所见过的缓冲区溢出的例子中还没有因为堆和栈的相遇引起的

每个进程的栈的大小是有限制的, os 作了限制
堆的起始地址是由编译器给出的, 栈的起始地址一般由内核给出
回复 支持 反对

使用道具 举报

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

本版积分规则

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