关于虚拟地址空间
来源:互联网 发布:淘宝劲舞团 编辑:程序博客网 时间:2024/05/21 08:30
http://blog.chinaunix.net/uid-26606708-id-3073559.html
很不错的代码解析和栈分析:http://blog.csdn.net/iterzebra/article/details/6206420
栈的结构:http://www.cnblogs.com/bugman/archive/2011/09/29/2195879.html
关于栈的结构
栈结构(参数入栈顺序跟调用方式有关,这里以C语言默认的CDECL为例(参数由右向左进入堆栈)):
| ....................| (栈底方向,高位地址)
| 参数3 |
| 参数2 |
| 参数1 |
| 返回地址 |
-| 上一层[EBP] |
| 局部变量2 |
| 局部变量1 |
|.....................| (栈顶方向,低位地址)
栈一直随着函数调用的深入,一直想栈顶方向压下去。每次调用函数时候,先压函数参数(从右往左顺序压),再压入函数调用下条指令的地址(由call完成)。接着进入调用函数体中先执行pushq %rbp; movq %rsp, %rbp(一般已经由编译器加入到函数头中了),接着就是吧函数体中的局部变量压入栈中。再遇到函数的调用的嵌套则依此类推。(added by smsong)
pushq %rbp; movq %rsp, %rbp这两条指令实在大有深意:首先将rbp入栈,然后将栈顶指针rsp赋值给rbp。movq %rsp, %rbp这条指令表面上看是用rsp把原来rbp的值覆盖了,其实不然——因为给rbp赋值之前,原rbp值已被压栈(位于栈顶),而新的rbp又恰恰指向栈顶
此时rbp寄存器就已处于一个很重要的地位,该寄存器中存储着栈中的一个地址(原rbp入栈后的栈顶),从该地址为基准,向上(栈底方向)能获取返回地址、参数值,向下(栈顶方向)能获取函数局部变量值,而该地址处又存储着上一层函数调用时的rbp值!
进程的虚拟地址空间
| ....................|
| ....................|
|内核虚拟存储器| (高位地址)
|用户栈(运行时创建)|
|共享库的存储器的映射区域|
|运行时堆|
|读/写数据|
|只读的代码和数据|
|未用| (低位地址)
| ....................|
| ....................|
- 关于虚拟地址空间
- 关于进程的虚拟地址空间
- Window虚拟地址空间
- 虚拟地址空间分配
- 虚拟地址空间
- 进程虚拟地址空间
- 虚拟地址空间
- 虚拟地址空间
- 虚拟地址空间
- 虚拟地址空间
- 进程虚拟地址空间
- 虚拟地址空间
- Windows虚拟地址空间
- 进程虚拟地址空间
- 虚拟地址空间、虚拟内存
- linux虚拟地址空间
- 虚拟地址空间
- 关于虚拟地址,虚拟地址空间,虚拟内存的分辨和理解
- Hibernate的HQL查询和工具类的增强
- csdn博客bug测试
- 八零后为什么比我们那时还艰难
- 分享功能
- IEEE参考文献格式
- 关于虚拟地址空间
- 【linux】ubuntu11.10下各种问题以及解决方案
- 有关游戏的部署方案总结
- 修改图片上的文字步骤
- 根据数据决定选择那个checkbox
- 有关游戏的部署方案总结(二)
- SWT对话框属性详解
- Hibernate 批量插入、更新与删除
- 程序常用日志文件写入函数