免费注册 查看新帖 |

Chinaunix

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

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

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

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

win_hate在这一页最上面的那段代码我看过了,明白“一次性分配局部变量”的意思。

假如程序的执行点到了调用函数A,把当前环境保存后,需要为A做的事情有:一次性分配所有A中局部变量的空间、A的被调用参数所占空间。大家说的“一次性分配空间”指的就是这个意思吧?

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

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

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

我想不太明白的一点是,如果程序中存在尾递归这种大量消耗栈空间的函数调用,编译器扫描源程序进行编译时就能准确判断出所..........


尾递归,不是调用了一个函数吗?那就让call指令和ret指令来完成吧。

呵呵,不管递归不递归,一个函数内所需要的空间还是很容易计算出来的。

建议去http://blog.csdn.net/yayong这个blog看看,有两篇文章对C代码如何被编译成汇编代码有很详细的论述。

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

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

我懂得这个意思的,有时候编译器能自动消除尾递归,就是在扫描中要决定分配那些空间时,发现了很多没必要的浪费么。

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

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

呵呵,不是编译器的自动消除,而是尾递归不也是函数吗?那么就是如何编译另一个函数的问题了。

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

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

这么想吧,如果你要实现编译器,你如何实局部变量?
我觉得局部变量编译之后可能就是一条或多条PUSH指令.

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

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

原帖由 "javacool" 发表:
能不能详细解释一下函数调用
"调用参数压栈,然后才是返回地址,然后是局部变量。"这句话的意思
我看了VC编译下的EXE
他的栈结构是
|  调用参数  |
|  保存EBP   |
|  局部变量   | <- -新的EBP
|  局部变..........

现场保存之后,通常是应该有一条:mov ESP,EBP.这样就可以用EBP来寻址啦.

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

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

原帖由 "menp9999" 发表:
这么想吧,如果你要实现编译器,你如何实局部变量?
我觉得局部变量编译之后可能就是一条或多条PUSH指令.


一般是一条sub esp的指令。不是栈操作都要用push、pop的,add和sub也都很常用。

论坛徽章:
0
38 [报告]
发表于 2004-12-16 08:36 |只看该作者

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

原帖由 "menp9999" 发表:

现场保存之后,通常是应该有一条:mov ESP,EBP.这样就可以用EBP来寻址啦.


是啊,可是问题就这样出来了。比方说函数A调用函数B,到了A中“CALL B”这条指令的时候:
1>;首先把B的参数压栈
2>;然后保存返回地址
3>;然后保存EBP的值
4>;将ESP的值减少一个数字,这个数字就是B中自动变量所占用的空间总和。

我不明白的是,gcc(搞不清是C99还是gcc,反正gcc中能通过)支持"int a;"这种形式的声明,它怎样判断要分配多少自动变量空间呢?也就是,怎么判断执行到该语句时b的大小呢?

还有,alloc函数是动态调整栈的大小的吧?我在man中、/user/include/stdlib.h中都没有找到,不知道它用法是不是跟malloc一样。A的栈帧下面紧接着是B的栈帧,可是如果A中有动态调整栈的需要,那它是越过B的栈帧呢,还是在A的栈帧中再想办法?

PS.请教一下,缓冲区溢出攻击是要写自动变量到溢出,一直覆盖EBP、返回地址的吧?

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

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

原帖由 "albcamus" 发表:


PS.请教一下,缓冲区溢出攻击是要写自动变量到溢出,一直覆盖EBP、返回地址的吧?


1、在A调用B的时候,你说的4个步骤,在函数A中,只做了第一个步骤,也就是call B的指令。而其他的3个步骤是在B函数的开始完成的。
2、int b[a]这样的语句,因为开辟的空间决定于a,所以,一般a是作为参数传如B函数的,在B函数中,首先像获取其他参数一样,获取到a之后,sub出来一定数量的空间。
3、alloca是一个在栈中动态开辟空间的函数,在alloca.h中。man中有,你的少了一个a(^_^,和malloc是不一样的哦~)。man中介绍的很清楚,一般不推荐使用。估计也是通过sub一个参数大小的数值来获取的空间。
4、缓冲区溢出攻击一般来说就是栈缓冲的攻击,就是利用栈里面的内容,故意写数组溢出,覆盖EIP,等函数返回的时候,就可以控制它返回到哪里执行。一般的情况,在那个地方放置一个shellcode,就会启动一个有root权限的shell了。

论坛徽章:
0
40 [报告]
发表于 2004-12-16 09:05 |只看该作者

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

[quote="aero"] 2、int b[a]这样的语句,因为开辟的空间决定于a,所以,一般a是作为参数传如B函数的,在B函数中,首先像获取其他参数一样,获取到a之后,sub出来一定数量的空间。
3、alloca是一个在栈中动态开辟空间的函数,在alloca.h中。man中有,你的少了一个a(^_^,和malloc是不一样的哦~)。man中介绍的很清楚,一般不推荐使用。估计也是通过sub一个参数大小的数值来获取的空间。[quote]

to 2,明白了,谢谢.
to 3,这你都能猜出来??真的是少打了一个a哦。

to1,好像B参数压栈是在进入B之前做的,我看那本《C语言:设计与实现》是这么说的   :em11:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP