实模式与保护模式、C语言程序的内存布局

在实模式中,程序可以自己定义一个段,使SS:SP指向这个段,从而将这个段作为栈来使用,之后的push,pop指令都是在操作这个段。但是在保护模式下,出于安全考虑,操作系统为应用程序安排好了所有的段(包括栈段),程序中的push,pop指令都是操作的由操作系统管理的栈内存,比如函数开始调用时需要入栈,函数调用结束时需要出栈等,这些操作的内存段都是操作系统管理的栈段,也就是说程序无法操作SS这样的段寄存器,这些已经由操作系统初始化好了。所以在C程序的内存布局上才有:数据段、代码段、栈段、常量区、堆,这些都指的是进程地址空间(线性地址)上的内存布局。

常量区是只读的,注意常量区并不等同于数据段,C语言中的静态数据是存放在数据段中的,且静态数据默认也是被初始化的,即要占用磁盘空间(而未初始化的非静态的全局变量不占用磁盘空间)。C语言中的static还有语义上的作用,即只能在当前源文件中被引用。

已初始化的数据段存在于可执行文件中,而未初始化的数据段不会存在于可执行文件中,执行时其内容被初始化为0。在C语言中如下定义一个全局数组:
char a[100* 1024* 1024]={99};//只初始化了第一个元素,但这也算是对数据段进行了初始化,所以编译出的可执行文件大小会大于100MB

但是不能定义这样大的局部数组,这样会导致栈溢出,进而程序崩溃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值