程序员自我修养6-库与运行库

01 栈

一个栈的实例:

程序员自我修养6-库与运行库_第1张图片
图片.png

图中栈底的地址是0xbfffffff,而exp寄存器标明了栈顶,地址为0xbffffff4。在栈上压入数据会导致esp减小,弹出数据使得esp增大。

一个活动记录图:

程序员自我修养6-库与运行库_第2张图片
图片.png

图中ebp固定在图中所示的位置,不随这个函数的执行而变化,相反地,esp始终指向栈顶,因此随着函数的执行,esp会不断变化。固定不变的ebp可以用来定位函数活动记录中的各个数据。在ebp之前首先是这个函数的返回地址,它的地址是ebp-4,再往前是压入栈中的参数。

栈的标准开头和结尾:
开头:

push ebp
mov ebp,esp

结尾:

mov esp,ebp
pop ebp
ret

02堆

linux堆进程管理的两个系统调用:一个是brk()系统调用,另外一个是mmap()。
brk()的作用是设置进程数据段的结束地址,mmap()向操作系统申请一段虚拟地址空间

03运行库

glibc入口函数:_lib_start_main
msvc入口函数:posvi分配内存不使用malloc而使用alloca,是因为在程序的一开始堆还没有被初始化,而alloca是唯一可以不使用堆的动态分配机制。alloca可以在栈上分配任意大小 的空间(只要栈的大小允许),并且在函数返回的时候会自动释放,就好像

你可能感兴趣的:(程序员自我修养6-库与运行库)