原来帧指针指向的也是栈,不过是一个故事的开始。
而栈指针是一个故事的当下。
那帧指针为啥叫ebp,难道b==base。因为帧指针也叫基址指针。
帧指针使得访问函数的参数很容易。
所以任何函数调用进来的第一件事都是保护调用者的帧指针,以使得返回时可以恢复调用者的帧指针。
------------------------------
函数调用的故事
1.各种参数入栈
2.返回地址入栈,这个是用当前指令地址++当作返回地址的
3.调用者的帧指针入栈保护(本次调用的基址指针就指向这里)
4.调用者的寄存器入栈保护
5.被调用的函数的局部变量的分配
依cpu不同会有细小的差别
函数调用时的内存布局:
|-----参数----------|
|---返回地址--------|
|----旧的ebp--------| 新的ebp就会指向这里
|---保存的寄存器状态|
|--本地变量---------|
所以当前ebp-4就是返回地址,当前ebp-8就是调用传来的参数。
堆是可以建立很多个的,但是每个堆是有最大尺寸限制的。
内存有5种,堆,栈,静态,常量,代码
全局变量和静态变量都在静态内存里。
常量字符串都在常量区里。
--------------------------------
缓冲区溢出对栈的破坏是显而易见的,栈上的缓冲区溢出可以覆盖返回地址,被恶意代码攻击,也就谁说栈的缓冲区溢出很容易被利用,那么堆上的缓冲区溢出危险不危险?