简介:范文网小编为你整理了多篇相关的《2024全面解析虚拟内存》,但愿对你工作学习有帮助,当然你在范文网还可以找到更多《2024全面解析虚拟内存》。
一个系统中的进程是与其他进程共享CPU和主存资源的。随着对CPU需求的增长,进程以某种合理的平滑的方式慢了下来。这里给大家分享一些关于全面解析虚拟内存,希望对大家能有所帮助。
虚拟内存空间
1.保留区(受保护的地址)
保留区即为受保护的地址,大小为128M,位于虚拟地址空间的最低部分,未赋予物理地址。任何对它的引用都是非法的,用于捕捉使用空指针和小整型值指针引用内存的异常情况。
它并不是一个单一的内存区域,而是对地址空间中受到操作系统保护而禁止用户进程访问的地址区域的总称。大多数操作系统中,极小的地址通常都是不允许访问的,如NULL。C语言将无效指针赋值为0也是出于这种考虑,因为0地址上正常情况下不会存放有效的可访问数据。。
2.代码段
代码段也称正文段或文本段,通常用于存放程序执行代码(即CPU执行的机器指令)。一般C语言执行语句都编译成机器代码保存在代码段。通常代码段是可共享的,因此频繁执行的程序只需要在内存中拥有一份拷贝即可。代码段通常属于只读,以防止其他程序意外地修改其指令(对该段的写操作将导致段错误)。某些架构也允许代码段为可写,即允许修改程序。
3.数据段(.data段)
数据段通常用于存放程序中已初始化的全局变量和静态局部变量。数据段属于静态内存分配(静态存储区),可读可写。由于全局变量未初始化时,其默认值为0,因此值为0的全局变量位于.bbs段(不位于数据段)。对于未初始化的局部变量,其值是不可预测的。注意:在代码段和数据段之间还包括其它段:只读数据段和符号段等。
4. .bbs段
该段用于存放未初始化的全局变量和静态局部变量,包括值为0的全局变量。 数据段和.bbs段又称为全局数据区,前者初始化,后者未初始化。
ELF段包括:代码段、其它段(在.data段和.text段之间,包括只读数据段和符号段等)、.data段(数据段)和.bbs段,都属于可执行程序部分。
5.堆空间
new( )和malloc( )函数分配的空间就属于堆空间。
分配的堆内存是经过字节对齐的空间,以适合原子操作。堆管理器通过链表管理每个申请的内存,由于堆申请和释放是无序的,最终会产生内存碎片。堆内存一般由应用程序分配释放,回收的内存可供重新使用。若程序员不释放,程序结束时操作系统可能会自动回收。
堆的末端由break指针标识,当堆管理器需要更多内存时,可通过系统调用brk()和sbrk()来移动break指针以扩张堆,一般由系统自动调用。
6.内存映射段(共享库)
7.栈空间
用于存放局部变量(非静态局部变量,C语言称为自动变量),分配存储空间时从上往下。
虚拟内存实现方式
页面和页框
我们来打个比方,假设你现在有一台32KB内存的电脑,虚拟内存是64KB。首先我们先将64KB的虚拟内存切个片,一个片大小为4KB,所以总共切了16片。同时,把32KB的物理内存也按4KB的切片,总共切了8片。那么我们就称虚拟内存的一个片叫做页面,物理内存的一个片叫做页框。
页表
同学们可能已经猜到了,没错,虚拟内存和物理内存之间是有一个映射关系的。这个映射该怎么实现呢,这就需要我们页表的登场啦!页表中维护着页表和页框的对应关系。举个栗子,一个地址为0x0010000000000100的16位地址。16位地址可拆分为两部分,前4位和后12位。前4位对应着16个虚拟页表的号牌用于在页表中寻找对应的页框号,后12位用于页内偏址。0010即是2号,我们在页表中查找2号选手对应的页框,假设是100。那么我们虚拟地址所对应的物理地址即可得出,为100+之前的后12位页内偏移地址,即0x100000000000100。
不过毕竟页面比页框为16:8,那么肯定会有一部分的页面没有所对应的页框,如果我们的虚拟地址就在这些页面中我们该怎么办呢?
缺页中断
…… 此处隐藏1087字,全部文档请下载后查看。喜欢就下载吧 ……
2024全面解析虚拟内存




该篇《2024全面解析虚拟内存》范文为DOC格式,范文网为全国知名范文网站,下载本文后稍作修改便可使用,即刻完成写稿任务。网址:https://www.zhsm.net/a/23d6h6b.shtml
上一篇:2024操作系统内存管理知识
下一篇:2024操作系统内存管理