有关内存分布

来源:互联网 发布:淘宝开店怎么实名认证 编辑:程序博客网 时间:2024/06/05 17:58

linux下进程的内存分布:

内核空间
栈(栈的下面有预留空间,栈内存方向向低地址延伸)
动态链接映射区
堆(堆的上方有预留空间,堆内存方向向高地址延伸)
读写部分
只读部分
预留空间


实例:
栈顶:
0xbfffffff
0xbffffffb
0xbffffff8
0xbffffff4
esp寄存器标明栈顶
栈上压入数据会导致esp减小
弹出数据会导致esp增大

栈保存了一个函数调用所需要的维护信息
(1)函数的返回地址和参数
(2)临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量
(3)保存的上下文:包括在函数调用前后保持不变的寄存器

int foo(int n,float m)
{
int a = 0,b=0;
……
}
实际栈状态
m//先压入,地址大
n
返回地址

函数返回值传递:
eax寄存器是传递返回值的通道(只有四个字节),大于四个字节则采用eax和edx联合返回的方式进行


malloc申请的空间如果是指虚拟空间,那么是连续的,如果是指物理课龙剑,那么不一定连续,因为一块连续的虚拟地址空间有可能是若干个不连续的物理页拼凑而成的
堆分配算法:
(1)空闲链表法:将堆中各个空闲的块按照链表的方式连接起来,当用户请求一块空间时,可以遍历整个链表,直到找到合适大小的块将它划分;当用户释放空间时,将它合并到空闲链表中
(2)位图:将整个堆划分为大量的块,每个块的大小相同
(3)对象池:被分配对象的大小是较为固定的几个值

0 0
原创粉丝点击