01 栈
一个栈的实例:
图片.png图中栈底的地址是0xbfffffff,而exp寄存器标明了栈顶,地址为0xbffffff4。在栈上压入数据会导致esp减小,弹出数据使得esp增大。
一个活动记录图:
图片.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可以在栈上分配任意大小 的空间(只要栈的大小允许),并且在函数返回的时候会自动释放,就好像
网友评论