接语言学习篇
5、函数调用栈空间的分配与释放
1、函数执行的时候有自己的临时栈。
2、函数的参数就在临时栈中。如果函数传递实参,则用来初始化临时的参数变量。
3、通过寄存器返回值。(使用返回值返回数据)
4、通过参数返回值。(参数必须是指针)指针指向的区域必须事先分配。
5、如果参数返回指针,参数就是双指针。
_stdcall _cdecl _fastcall
决定函数栈压栈的参数顺序(从右向左)。
决定函数栈的清空方式,告诉谁来清空栈
决定了函数的名字转换方式
far near huge指针
near 16
far 32
huge 综合
虚拟内存
一个程序不能访问另外一个程序的地址指向的空间。
理解:
1、每个程序开始地址相同
2、程序中使用的地址不是物理地址,而是逻辑地址(虚拟内存)逻辑地址仅仅是编号。
编号使用int4字节整数表示。每个程序提供了4G的访问能力。
逻辑地址与物理地址关联才有意义;过程称为内存映射。
虚拟内存的提出:禁止用户直接访问物理存储地址,有助于系统的稳定。
虚拟地址与物理地址映射的时候有一个基本映射单位:内存页 段错误:无效访问
合法访问:比如malloc分配的空间之外可以访问,但是非法。
虚拟内存的分配
栈:编译器自动生成代码负责维护
堆:地址是否映射,映射的空间是否被管理
1、brk/sbrk 内存映射函数 man 节 关键字 1-8节 1:Linux系统指令(shell) 2:系统函数 3:标准C函数 7:系统编程帮助
分配释放空间:
int brk(void *end) ; // 分配空间,释放空间
void *sbrk(int size); // 返回空间地址
应用
使用sbrk分配空间 sbrk(int) 如果是第一次运行,则返回没有映射的空闲空间的首地址。同时产生一个数据:指向地址。
使用sbrk得到没有映射的虚拟地址
使用brk分配空间
使用brk释放空间
sbrk与brk后台系统维护一个指针,指针默认是null,调用sbrk,判定指针是否是0,是:得到大块空闲的首地址初始化指针,返回空闲指针,同时修改指针为指针+size
否:直接返回当前的指针,并且把指针位置+size