内存管理技术
虚拟内存管理技术中最常见的就是依靠硬件实现的分页技术(MMU,现代MMU一般被集成在CPU内部)。
如果CPU在访问某个虚拟页时,发现该虚拟页所对应的物理页没有被加载进入内存。就会触发一个缺页异常(page fault)。
程序的内容模型
(1)代码段
(2)只读数据段(rodata)
(3)已初始化的读写数据段(data)
(4)未初始化的数据段(BSS)
在程序一开始时会将所有的清零
(5)堆
(6)栈
int a = 0; //全局初始化区。 data段
static int b=20; //全局初始化区。 data段
char *p1; //全局未初始化区 bss段
const int A = 10; // rodata段
void main(void)
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
static int c = 0; //全局(静态)初始化区 .data段
char *p3 = "123456"; //123456\0在常量区,p3 在栈上。
p1 = (char*) malloc(10);//分配得来的10和20个字节的区域就在堆区
p2 = (char*) malloc(20);
strcpy(p1, "123456"); //123456\0 在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方
}
编译和运行时内存模型如下:
注意,上图中.out文件中只存储了BSS段的大小。并没有实际留出空间
在程序装载近内存时,对BSS段清零。
对于32位系统
对于64位系统