进程与内存

本文详细探讨了进程中的内存管理,包括栈帧的工作原理、虚拟存储器的概念及其工作方式。同时,重点阐述了C语言中static关键字的用法,包括静态全局变量、静态局部变量和静态函数的特性及其在程序设计中的作用,如统计函数调用次数、限制作用域等。
摘要由CSDN通过智能技术生成

文章摘抄并总结自很多网络文章!!!!!!

函数调用与栈帧:

栈是向下生长的(高地址->低地址,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

常量字符串存放在文字常量区中,程序结束后由系统释放

大部分函数的形参,局部变量存储在栈区,还有一部分位于寄存器中

堆:向高地址进发

共享库

栈:向低地址进发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值