文章摘抄并总结自很多网络文章!!!!!!
函数调用与栈帧:
栈是向下生长的(高地址->低地址,e.g., FFFFH->0000H)
ESP栈偏移指针:可移动
基底:栈开始的地方,不可以移动,对应的是EBP
举例1:
A:Caller B:Callee
1、把所有或者部分参数压入栈中
2、把当前B中调用指令的下一条指令地址压入栈中
3、跳转到被调用的函数A
当A调用B时:
1、A将EBP压入栈(保存调用前EBP值)
2、EBP=ESP
3、创建B的栈
4、当B返回时,ESP=EBP(收回局部空间占用的空间)
5、EBP=EBP,指向单元保存的值(原先A的EBP)
6、pop EBP
6、ret 栈中弹出返回地址,返回调用者
举例2:
启动进程时,OS会创建一个表,保存进程的虚拟地址空间以及对应的物理地址映射关系,这个表为分页表,可存于内存和后备存储器,如磁盘。
虚拟存储器:
以透明的方式给用户提供了比实际主存空间更大的程序地址空间,设CPU地址总线宽度为M,那么寻址能力为2^M。虚拟地址由编译程序生成,CPU将虚拟地址转化成物理地址。设虚拟字长N,则虚拟地址的空间大小为2^N。
因为虚拟存储器的内容保存在磁盘上,故虚拟地址空间大小实际上收到辅助存储器容量的限制。用时,将需要的页面调入内存。
当进程进行时,将虚拟地址映射到主存的物理地址。
地址 低-》高
程序代码:代码,只读,有固定大小
全局或静态变量都存储在静态数据区中
未初始化的全局变量和静态变量存放在BSS中,内核会初始为0
常量字符串存放在文字常量区中,程序结束后由系统释放
大部分函数的形参,局部变量存储在栈区,还有一部分位于寄存器中
堆:向高地址进发
共享库
栈:向低地址进发