免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: javacool
打印 上一主题 下一主题

请教一个有关虚拟内存的问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2004-12-15 13:37 |只看该作者

请教一个有关虚拟内存的问题

原帖由 "converse" 发表:
>;>;1、见到局部变量后再分配。
我认为应该都是全部分配的吧,毕竟c不是解释执行的,编译器扫描代码的时候就会标记出哪些是局部变量然后一起分配好空间。


是编译器分配的吗?我看ELF文件中好像只有text、data,bss都是不占用磁盘空间的。觉得这里似乎应该是加载器分配的……

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
22 [报告]
发表于 2004-12-15 13:51 |只看该作者

请教一个有关虚拟内存的问题

呵呵,是编译器编译出的汇编代码,而这个程序代码在执行的时候分配的。说是分配也可以,不过是利用栈的空间。其实,到了底层,就要放的开了,不要刻意去追求什么分配了、保护了什么的,不过是指令对内存的操作。所以,葱这个角度来说,可以说既不是编译器分配的,也不是加载器分配的了。

论坛徽章:
0
23 [报告]
发表于 2004-12-15 13:59 |只看该作者

请教一个有关虚拟内存的问题

aero的意思没看明白:)

我的意思是说,象汇编中push 67这样的指令,在elf文件格式中,“67”这种立即数是存放在text段的吧?要是这样的话,那么即使栈空间一次性分配,也只能是加载并执行该文件时一次性分配,然后运行到push 67指令时,再将67写入到相应的栈空间。

说的对吗?朋友们说一下

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
24 [报告]
发表于 2004-12-15 14:11 |只看该作者

请教一个有关虚拟内存的问题

不了解elf文件格式。

不过push 67这样的指令,应该是直接反应在code中的。对编译出来的可执行文件用objdump反汇编就可以看出来。

论坛徽章:
0
25 [报告]
发表于 2004-12-15 14:29 |只看该作者

请教一个有关虚拟内存的问题

能不能详细解释一下函数调用
"调用参数压栈,然后才是返回地址,然后是局部变量。"这句话的意思
我看了VC编译下的EXE
他的栈结构是
|  调用参数  |
|  保存EBP   |
|  局部变量   | <- -新的EBP
|  局部变量  |
............
|  现场保存  |
"返回地址"在栈的什么地方?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
26 [报告]
发表于 2004-12-15 14:32 |只看该作者

请教一个有关虚拟内存的问题

调用参数下面,EBP上面。call指令隐含压栈的。

论坛徽章:
0
27 [报告]
发表于 2004-12-15 16:50 |只看该作者

请教一个有关虚拟内存的问题

原帖由 "albcamus" 发表:


是编译器分配的吗?我看ELF文件中好像只有text、data,bss都是不占用磁盘空间的。觉得这里似乎应该是加载器分配的……


说错了,以后会严谨一些。

论坛徽章:
0
28 [报告]
发表于 2004-12-15 17:17 |只看该作者

请教一个有关虚拟内存的问题

谢谢大家了 发现自己对C和计算机体系结构的认识还很浅薄

论坛徽章:
0
29 [报告]
发表于 2004-12-15 17:32 |只看该作者

请教一个有关虚拟内存的问题

我认为 albcamus 的说法并不正确。

看一段话应该结合上下文,不应割裂出来单独理解。我觉得在前面讨论的帖子中,“分配”的含义是很清楚的。如果 albcamus 觉得不严谨,我解释一下:进程的栈空间大小在运行时是固定的,各个函数在被调用的时候再从中支取所需空间,我们讲的是这个分配。这种分配主要通过减 esp 来实现。如果这不能称为分配,还有什么更好的词呢?

其实这个也算得上是标准术语

NAME
     alloca - memory allocator

SYNOPSIS
     #include <stdlib.h>;

     void *
     alloca(size_t size);

DESCRIPTION
     The alloca() function allocates size bytes of space in the stack frame of
     the caller
.  This temporary space is automatically freed on return.

RETURN VALUES
     The alloca() function returns a pointer to the beginning of the allocated
     space.
.......

论坛徽章:
0
30 [报告]
发表于 2004-12-15 17:53 |只看该作者

请教一个有关虚拟内存的问题

我明白win_hate版主的意思了,也为自己先前没仔细看就乱发议论道歉,盼望大家别介意:)

我想不太明白的一点是,如果程序中存在尾递归这种大量消耗栈空间的函数调用,编译器扫描源程序进行编译时就能准确判断出所需要的栈空间的大小吗?
--不行,感觉越想越糊涂:版主说:“进程的栈空间大小在运行时是固定的,各个函数在被调用的时候再从中支取所需空间,我们讲的是这个分配。”可我理解的栈空间大小是随着程序的运行(如函数调用等情况。alloc除外,因为它本来就是“动态的”)动态增减的啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP