详解虚拟内存

本文探讨了虚拟内存的引入背景及其实现机制。在x86系统出现前,直接的物理内存分配方式导致资源冲突与安全问题。通过虚拟内存技术,每个进程获得独立的4GB虚拟地址空间,实现进程间隔离,提升系统安全性。文章详细解析了Linux系统下虚拟内存的布局,包括用户空间与内核空间的划分,以及各段如.text、.data、.bss、heap和stack的具体作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                在x86系统以前,没有虚拟地址空间这种说法。那么在X86系统没有发布之前,程序是这样运行的:假如我们有三个程序,程序A,B,C,程序A运行的过程中需要10M内存,程序B运行的过程中需要100M内存,而程序C运行的过程中需要20M内存。如果系统同时需要运行程序A和B,那么早期的内存管理过程大概是这样的,将物理内存的前10M分配给A,接下来的10M-110M分配给B。这种内存管理的方法比较直接,好了,假设我们这个时候想让程序C也运行,同时假设我们系统的内存只有128M,显然按照这种方法程序C由于内存不够是不能够运行的。大家知道可以使用虚拟内存的技术,内存空间不够的时候可以将程序不需要用到的数据交换到磁盘空间上去,已达到扩展内存空间的目的。

           并且这种程序的运行存在一定的风险,因为进程地址空间不能隔离。就拿上面举得类子来说,A的地址空间是0~10M之间,但是如果A中有一段代码是操作10M-128M这段地址空间内的数据,那么程序B和程序C就很可能会崩溃(每个程序都可以访问系统的整个地址空间)。这样很多恶意程序或者是木马程序可以轻而易举地破快其他的程序,系统的安全性也就得不到保障了,这对用户来说也是不能容忍的。

         那么为了解决这个问题,我们引入了虚拟内存地址。虚拟内存位于程序和物理内存之间,程序只能看见虚拟内存,再也不能直接访问物理内存。每个程序都有自己独立的进程地址空间,这样就做到了进程隔离。这里的进程地址空间是指虚拟地址。

          那么虚拟内存是怎么分配的?虚拟内存总共分配了4G空间大小,在Linux系统下,把虚拟内存分为两部分:3G的用户系统和1G的内核系统,分配如下图:

         

            在3G的用户内存中,在0X0000 0000 ~ 0x0804 8000区间,称为保留区,大约128M大小,是不可不可访问的,不可读不可写。在我们写代码的时候,我们会遇到这样一句代码 char * p = NULL;   其中p就是访问了保留区,导致程序崩溃。

           .text段是存放指令的;

           .data和.bss称为数据段,但是.data段存放已初始化且初始化不为了零的数据。 .bss段存放未初始化或者初始化为零的数据

            heap称为堆区间,堆数据是由低地址向高地址存放

            stack称为栈区间,栈数据是由高地址向低地址存放  

             在1G的内核空间中:ZONE_DAM  大约16M   加快内存访问

                                               ZONE_NORMAL 约892M

                                               ZONE_HIGHMEM  大约128M  处理大于1G的文件映射

    有不对的的地方,麻烦大家给我提出。我们共同学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值