精华内容
下载资源
问答
  • Linux系统虚拟内存空间一般布局示意图 1.1 线性空间 线性地址空间:是指Linux系统中从0x00000000到0xFFFFFFFF整个4GB虚拟存储空间。线性空间又分为用户空间和内核空间。 1.1.1 用户空间(进程地址空间) 用户...

    首先借用网上一张图,感觉这个比较清晰:


    Linux系统虚拟内存空间一般布局示意图

    1.1 线性空间

    线性地址空间:是指Linux系统中从0x00000000到0xFFFFFFFF整个4GB虚拟存储空间。线性空间又分为用户空间和内核空间。

    1.1.1 用户空间(进程地址空间)

    用户空间是指0x000000000xBFFFFFFF3GB的线性地址空间,每个进程都有一个独立的3GB用户空间,所以用户空间由每个进程独有,但是内核线程没有用户空间,因为它不产生用户空间地址。另外子进程共享(继承)父进程的用户空间只是使用与父进程相同的用户线性地址到物理内存地址的映射关系,而不是共享父进程用户空间。运行在用户态和内核态的进程都可以访问用户空间。

        linux采用虚拟内存管理技术,每一个进程都有一个3G大小的独立的进程地址空间,这个地址空间就是用户空间。每个进程的用户空间都是完全独立、互不相干的。进程访问内核空间的方式:系统调用和中断。
        创建进程等进程相关操作都需要分配内存给进程。这时进程申请和获得的不是物理地址,仅仅是虚拟地址。 实际的物理内存只有当进程真的去访问新获取的虚拟地址时,才会由请页机制产生缺页异常,从而进入分配实际页框的程序。该异常是虚拟内存机制赖以存在的基本保证,它会告诉内核去为进程分配物理页,并建立对应的页表,这之后虚拟地址才实实在在的映射到了物理地址上。

     

     

    1.1.2 内核空间

    内核空间表示运行在处理器最高级别的超级用户模式(supervisor mode)下的代码或数据,内核空间占用0xC00000000xFFFFFFFF1GB线性地址空间内核线性地址空间由所有进程共享,但只有运行在内核态的进程才能访问,用户进程可以通过系统调用切换到内核态访问内核空间,进程运行在内核态时所产生的地址都属于内核空间。

    内核空间又可分为以下几个线性空间:

    1. 内核逻辑地址空间

    是指从PAGE_OFFSET(3G)3G+896)之间的线性地址空间,是系统物理内存映射区,它映射了全部或部分(如果系统包含高端内存)物理内存。内核逻辑地址空间中的地址与RAM内存物理地址空间中对应的地址只差一个固定偏移量(3G),如果RAM内存物理地址空间从0x00000000地址编址,那么这个偏移量就是PAGE_OFFSET

    2. 高端线性地址空间:从high_memory(3G+896M)0xFFFFFFFF之间的线性地址空间属于高端线性地址空间,其中VMALLOC_START~VMALLOC_END之间线性地址:(1)被vmalloc()函数用来分配物理上不连续但线性地址空间连续的高端物理内存,或者(2)被vmap()函数用来映射高端或低端物理内存,或者(3)由ioremap()函数来重新映射I/O物理空间。其中PKMAP_BASE开始的LAST_PKMAP(一般等于1024)页线性地址空间:kmap()函数用来永久映射高端物理内存。FIXADDR_START开始的KM_TYPE_NR*NR_CPUS页线性地址空间:kmap_atomic()函数用来临时映射高端物理内存,其他未用高端线性地址空间可以用来在系统初始化期间永久映射I/O地址空间。

     

    1.2 物理空间

    1.2.1 低端内存(物理内存)

    内核逻辑地址空间所映射物理内存就是低端内存(实际物理内存的大小,但是小于896),低端内存在Linux线性地址空间中始终有永久的一一对应的内核逻辑地址,系统初始化过程中将低端内存永久映射到了内核逻辑地址空间,为低端内存建立了虚拟映射页表。低端内存内物理内存的物理地址与线性地址之间的转换可以通过__pa(x)__va(x)两个宏来进行,#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) __pa(x)将内核逻辑地址空间的地址x转换成对应的物理地址,相当于__virt_to_phys((unsigned long)(x))__va(x)则相反,把低端物理内存空间的地址转换成对应的内核逻辑地址,相当于((void *)__phys_to_virt((unsigned long)(x)))

    1.2.2  高端内存(物理内存)

    低端内存地址之上的物理内存是高端内存(物理内存896之上),高端内存在Linux线性地址空间中没有没有固定的一一对应的内核逻辑地址,系统初始化过程中不会为这些内存建立映射页表将其固定映射到Linux线性地址空间,而是需要使用高端内存的时候才为分配的高端物理内存建立映射页表,使其能够被内核使用,否则不能被使用。高端内存的物理地址于线性地址之间的转换不能使用上面的__pa(x)__va(x)宏。

    高端内存概念的由来:如上所述,Linux4GB的线性地址空间划分成两部分,从0x000000000xBFFFFFFF3GB空间作为用户空间由用户进程独占,这部分线性地址空间并没有固定映射到物理内存空间上;从0xC00000000xFFFFFFFF的第4GB线性地址空间作为内核空间,在嵌入式系统中,这部分线性地址空间除了映射物理内存空间之外还要映射处理器内部外设寄存器空间等I/O空间0xC0000000~high_memory之间的内核逻辑地址空间专用来固定映射系统中的物理内存,也就是说0xC0000000~high_memory之间空间大小与系统的物理内存空间大小是相同的(当然在配置了CONFIG_DISCONTIGMEMD选项的非连续内存系统中,内核逻辑地址空间和物理内存空间一样可能存在内存孔洞),如果系统中的物理内存容量远小于1GB,那么内核线性地址空间中内核逻辑地址空间之上的high_memory~0xFFFFFFFF之间还有足够的空间来固定映射一些I/O空间。可是,如果系统中的物理内存容量(包括内存孔洞)大于1GB,那么就没有足够的内核线性地址空间来固定映射系统全部物理内存以及一些I/O空间了,为了解决这个问题,在x86处理器平台设置了一个经验值:896MB,就是说,如果系统中的物理内存(包括内存孔洞)大于896MB,那么将前896MB物理内存固定映射到内核逻辑地址空间0xC0000000~0xC0000000+896MB=high_memory)上,而896MB之后的物理内存则不建立到内核线性地址空间的固定映射,这部分内存就叫高端物理内存。此时内核线性地址空间high_memory~0xFFFFFFFF之间的128MB空间就称为高端内存线性地址空间用来映射高端物理内存和I/O空间896MBx86处理器平台的经验值,留了128MB线性地址空间来映射高端内存以及I/O地址空间,在嵌入式系统中可以根据具体情况修改这个阈值,比如,MIPS中将这个值设置为0x20000000B512MB,那么只有当系统中的物理内存空间容量大于0x20000000B时,内核才需要配置CONFIG_HIGHMEM选项,使能内核对高端内存的分配和映射功能。什么情况需要划分出高端物理内存以及高端物理内存阈值的设置原则见上面的内存页区(zone)概念说明。

     

    展开全文
  • Linux虚拟内存空间布局 Linux虚拟内存空间分为内核空间和用户空间两部分。Linux操作系统和驱动程序运行在内核空间,应用程序运行在用户空间。两者不能简单地使用指针传递数据,因为Linux使用虚拟内存机制,用户空间...

    Linux虚拟内存空间布局

    Linux虚拟内存空间分为内核空间和用户空间两部分。Linux操作系统和驱动程序运行在内核空间,应用程序运行在用户空间。两者不能简单地使用指针传递数据,因为Linux使用虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。

    32位Linux虚拟内存空间(线性地址空间)布局

    通常32位Linux内核虚拟地址空间划分0-3G为用户空间,3-4G为内核空间。

    在这里插入图片描述

    代码段:通常存放程序中的代码和常量。
    数据段:通常存放程序中的初始化后的全局变量和静态变量。
    BSS段:通常存放程序中的未初始化的全局变量和静态变量。
    堆:通常用来存放程序中进行运行时被动态分配的内存段。
    栈:通常用来存放程序运行时的栈帧,包含局部变量、函数形参、数组、函数返回值、返回地址等等。

    展开全文
  • Linux释放内存空间

    2019-07-04 18:22:51
    Linux释放内存空间  Linux服务器运行一段时间后,由于其内存管理机制,会将暂时不用的内存转为buff/cache,这样在程序使用到这一部分数据时,能够很快的取出,从而提高系统的运行效率,所以这也正是linux内存管理...

    Linux释放内存空间

      Linux服务器运行一段时间后,由于其内存管理机制,会将暂时不用的内存转为buff/cache,这样在程序使用到这一部分数据时,能够很快的取出,从而提高系统的运行效率,所以这也正是linux内存管理中非常出色的一点,所以乍一看内存剩余的非常少,但是在程序真正需要内存空间时,linux会将缓存让出给程序使用,这样达到对内存的最充分利用,所以真正剩余的内存是free+buff/cache

            但是有些时候大量的缓存占据空间,这时候应用程序回去使用swap交换空间,从而使系统变慢,这时候需要手动去释放内存,释放内存的时候,首先执行命令 sync 将所有正在内存中的缓冲区写到磁盘中,其中包括已经修改的文件inode、已延迟的块I/O以及读写映射文件,从而确保文件系统的完整性

           说到清理内存,那么不得不提到/proc这一个虚拟文件系统,这里面的数据和文件都是内存中的实时数据,很多参数的获取都可以从下面相应的文件中得到,比如查看某一进程占用的内存大小和各项参数,cpu和主板的详细信息,显卡的参数等等;相应的关于内存的管理方式是在/proc/sys/vm/drop_chches文件中,一定要注意这个文件中存放的并不是具体的内存内容,而是0-3这几个数字,通过文件大小只有1B也可以知道,而这些代号分别告诉系统代表不同的含义如下:

    0:0是系统默认值,默认情况下表示不释放内存,由操作系统自动管理
    1:释放页缓存
    2:释放dentries和inodes
    3:释放所有缓存

    所以根据上面的说明,分别将1,2,3这3个数字重定向到drop_caches中可以实现内存的释放,一般释放内存都是重定向3到文件中,释放所有的缓存
    那么下面举个例子,比如这里只释放页缓存,首先使用 free -h 查看当前内存剩余

    当前内存剩余1.1G左右,另外buff/cache是18G,根据上面说的现在真正的剩余内存应该是1.9G左右,首先写缓存到文件系统:

    sync

    然后执行下面命令释放内存(页缓存buff/cache):

    echo 1 > /proc/sys/vm/drop_caches

     释放全部缓存内存

    echo 3 > /proc/sys/vm/drop_caches

     

    可见 Free空闲内存为16G  由此可知,确实释放了

    到这里内存就释放完了,现在drop_caches中的值为1,如果现在想让操作系统重新分配内存,那么设置drop_caches的值为0即可:

    echo 0 > /proc/sys/vm/drop_caches

      另外需要注意的是,在生产环境中的服务器我们不要频繁的去释放内存,只在必要时候清理内存即可,更重要的是我们应该从应用程序层面去优化内存的利用和释放,经常清理内存可能只是暂时屏蔽的应用程序中的一些bug,所以更重要的是程序的调优,其他的交给操作系统来管理

    原文博客参考来源 :https://www.cnblogs.com/freeweb/p/5713513.html

    展开全文
  • Linux内存管理机制 linux内存管理机制【研究任务】linux内存管理机制——内核空间Linux内存管理机制 linux内存管理机制以及free命令详解inux内存管理机制 深入理解Linux内存管理机制
    展开全文
  • 深度好文:Linux系统内存知识 Linux 内存是后台开发人员,需要深入了解的计算机资源。合理的使用内存,有助于提升机器的性能和稳定性。本文主要介绍Linux 内存组织结构和页面布局,内存碎片产生原因和优化算法,...
  • Linux下每个进程都有一个虚拟内存空间,32系统下一般是 4G大小。 其中包括: 从高地址到低地址来讲分别有以下几种: 整体上可以分为两种,内核区以及用户区, 内核区中是一些用户代码不可见的区域,比如页表就存放...
  • Linux系统内存管理

    2017-06-21 21:49:48
    1、查看专门的/proc/meminfo文件来观察Linux系统上虚拟内存的当前状态。cat /proc/meminfo**其中MemTotal表示这个Linux服务器有4GB内存,MemFree表明大约有1.8MB的空闲空间。SwapTotal表明这个系统上大约有4GB的交换...
  • Linux系统虚拟内存空间一般布局示意图   说明:   1)线性地址空间:是指Linux系统中从0x00000000到0xFFFFFFFF整个4GB虚拟存储空间。   2)内核空间:内核空间表示运行在处理器最高级别的超级...
  • Linux 内存空间

    2017-07-21 16:43:18
    转载自: http://blog.csdn.net/freeelinux/article/details/53782986一:Linux虚拟地址空间布局(转自:Linux虚拟地址空间布局)在多任务操作系统中,每个进程都运行在属于自己的...在Linux系统中, 内核进程和用户进程
  • linux虚拟内存空间布局

    千次阅读 2014-01-15 09:29:13
    Linux系统虚拟内存空间一般布局示意图   说明:   1)线性地址空间:是指Linux系统中从0x00000000到0xFFFFFFFF整个4GB虚拟存储空间。   2)内核空间:内核空间表示运行在处理器最高级别的超级用户模式...
  • Linux系统虚拟内存空间一般布局示意图 说明:   1)线性地址空间:是指Linux系统中从0x00000000到0xFFFFFFFF整个4GB虚拟存储空间。   2)内核空间:内核空间表示运行在处理器最高级别的超级用户模式...
  • Linux系统的Swap分区,即交换区,Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么...
  • 二、 Linux 内存地址空间 三、 Linux 内存分配算法 四、 内存使用场景 五、 内存使用那些坑 Linux 内存是后台开发人员,需要深入了解的计算机资源。合理的使用内存,有助于提升机器的性能和稳定性。本文主要介绍...
  • linux系统内存缓冲和磁盘预留

    千次阅读 2020-07-07 10:08:11
    系统内存大,则缓冲区大,同步数据所需要的时间就越长,超时的概率就越大。 文件系统缓存的大小是由内核参数vm.dirty_ratio 和 vm.dirty_backgroud_ratio控制决定的。 vm.dirty_background_rat
  • Linux系统内存日志清理

    千次阅读 2018-01-29 11:56:39
    free -h/-m:可以查看空间使用的大小,可利用的空间还有多少; df -l: 发现可以分区硬盘是否爆满了,于是就知道内存使用问题; du -sh * :一路检查当前分区下的那些文件或者目录的内存占领太多了,过多不必要的代码...
  • Linux系统释放内存

    2019-12-29 10:38:21
    Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好。 但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空间,非常影响性能。例如当你在linux下频繁存取文件后,物理内存会...
  • GNU/Linux下如何清理系统内存空间

    千次阅读 2015-04-21 11:02:45
    在打开了很多会占用内存的程序后,关闭这些程序后,发现内存空间还是和没有关闭应用程序时的占用一样,以致使其它应用程序打开时内存不够或很卡,那么此时就想清理掉以前的程序打开时所占用的内存,而大部分都是缓存...
  • 相比之下,“虚拟内存”并不是什么稀缺资源,虽然每个进程可以拥有的虚拟内存空间也是有限的,但是一般情况,进程根本用不了那么大的虚拟地址空间。32位系统中每一个进程都有4G的虚拟地址空间,其中1G系统空间...
  • Linux内存空间的分配

    千次阅读 2016-07-11 11:00:23
    1、Linux内存空间 a. Linux内存空间有4G的进程地址空间,包括用户空间与内核空间。用户空间分配了3G,而内核空间分配了1G。用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址。只有用户...
  • 查看Linux系统内存的真实占用

    千次阅读 2018-07-21 13:17:59
    Linux启动新的进程的时候会优先使用物理内存,当物理内存还有空闲时,linux是不会释放内存的(只要还有空间,那么进程就在可用空间中启动,而不是先清理一下内存然后再启动新的进程),即使占用内存的程序已经被关闭...
  • Linux内存空间以及内存管理

    千次阅读 2013-04-01 18:13:15
    Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间,该空间是大小为4G的线性虚拟空间,用于看到和接触的都是虚拟地址(逻辑地址),无法看到实际的物理内存地址。利用这种虚拟地址...
  • 转载自:Linux进程空间和虚拟内存 一、虚拟内存 先来看一张图(来自《Linux内核完全剖析》),如下: 分段机制:即分成代码段,数据段,堆栈段。每个内存段都与一个特权级相关联,即0~3...
  • linux内存空间划分

    千次阅读 2016-11-02 19:56:14
    1. 32位系统空间划分  通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。  下图是32位线性地址空间划分: 注意kernel中两个...
  • Linux服务器运行一段时间后,由于其内存管理机制,会将暂时不用的...但是在程序真正需要内存空间时,Linux会将缓存让出给程序使用,这样达到对内存的最充分利用,所以真正剩余的内存是free+buff/cache。 但是有些...
  • proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息...
  • Linux——内存文件系统

    千次阅读 2019-06-03 14:55:50
    Linux内存文件系统:可满足高IO的要求 ramdisk: 基于虚拟在内存中的其他文件系统(ex2fs)。 挂载方式:mount /dev/ram /mnt/ramdisk ramfs: 物理内存文件系统,只存在于物理内存中。其大小也不是固定的,而是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,340
精华内容 4,136
关键字:

linux系统内存空间

linux 订阅