精华内容
下载资源
问答
  • 2022-03-06 17:10:31

    1.kmalloc

    原型:void *kmalloc(size_t size, gfp_t flags);
    ①申请连续的物理内存,这对于要进行 DMA 的设备十分重要,但大小不能超过 128KB,其中有 16B 是被页描述符占用了。
    ②较常用的 flag 有 GFP_ATOMIC(分配内存的过程是一个原子过程)、 GFP_KERNEL(正常分配内存)、GFP_DMA(给 DMA 控制器分配内存)。
    ③对应的内存释放函数为 void kfree(const void *objp)。

    2.vmalloc

    原型:void *vmalloc(unsigned long size);
    ①申请虚拟地址连续的内存空间,但其对应的物理内存不一定连续,带来的好处就是可以分配较大的内存块,因此对申请的内存大小没有限制。
    ②对应的内存释放函数为 void free(const void *addr)。
    ③注意:vmalloc()和 vfree()可以睡眠,因此不能在中断上下文调用。

    3.kzalloc

    原型:void *kzalloc(size_t size, gfp_t flags);
    ①kzalloc()相对 kmalloc()只是额外增加了__GFP_ZERO 标志,除了申请内存外, 还会对申请到的内存内容清零。
    ②对应的释放函数也是 kfree()。

    4.DMA

    DMA是一种硬件机制,允许外围硬件设备直接与主存之间传输IO数据,而不需要CPU的干预。使用DMA机制可以大幅度提高设备通信的吞吐量。

    5.ioremap

    原型:void * ioremap(unsigned long offset,unsigned long size);
    ioremap是一种更直接的内存”分配”方式,使用时直接指定物理起始地址和需要分配内存的大小,然后将该段物理地址映射到内核地址空间。ioremap用到的物理地址空间都是事先确定的,和上面的几种内存分配方式并不太一样,并且是分配一段新的物理内存。ioremap多用于设备驱动,可以让CPU直接访问外部设备的IO空间。ioremap能映射的内存由原有的物理内存空间决定,所以没有进行测试。

    6.kmalloc和vmalloc以及malloc的区别

    1.kmalloc和vmalloc都是分配的内核的内存,而malloc是分配的用户的内存
    2.kmalloc保证分配的内存在物理上是来连续的,vmalloc保证分配的内存在虚拟地址空间上是连续的
    3.kmalloc分配的大小是有限的,vmalloc和malloc分配的内存相对较大
    4.内存只有在要被DMA访问的时候才需要物理上连续
    5.vmalloc比kmalloc要慢

    7.malloc的底层实现

    1.malloc 函数的底层实现是操作系统有一个由可用内存块连接成的空闲链表。 调用 malloc 时,它将遍历该链表寻找足够大的内存空间,将该块一分为二(一块与用户申请的大小相等,另一块为剩下来的碎片,会返回链表),调用 free 函数时,内存块会重新连接回链表。
    2.若内存块过于琐碎无法满足用户需求,则操作系统会合并相邻的内存块。

    8.内核程序中申请内存和应用程序时申请内存有什么区别?

    答案:内核中申请内存空间用的是函数 kmalloc、kzalloc、vmalloc,应用程序申 请内存用的函数是 malloc。 解读: 157
    (1)kmalloc/kzalloc 直接分配连续的物理地址(虚拟地址也是连续的)。 (2)vmalloc 分配连续的虚拟地址,但物理地址不一定连续。分配时实际分配了 物理内存,不过这个物理内存页面是在公共的页表进行了映射,并没有在本进程的页表 进行映射,当访问这段内存时,触发 do_page_fault 异常(缺页中断)才完成页表的同 步工作。(4)malloc 是用户空间申请内存的方法,分配连续的虚拟地址,物理地址一般不 会连续。在分配时并没有做实际物理页的分配动作,实际分配物理页的动作是在 do_page_fault 异常(缺页中断)处理中完成的。

    更多相关内容
  • 应用开发过程,出现内存泄露一般的都可以使用第三方工具valgrind进行检查,确认内存泄露的点,但是内核内存泄漏又是怎么解决呢?下面一起来看一下。 如何判定内核内存泄漏? 内存泄漏,是系统可用内存持续的减少...

    应用开发过程,出现内存泄露一般的都可以使用第三方工具valgrind进行检查,确认内存泄露的点,但是内核的内存泄漏又是怎么解决呢?下面一起来看一下。

    如何判定内核有内存泄漏?

    内存泄漏,是系统可用内存持续的减少。系统运行阶段肯定会存在一定的波动,但是只要不是已使用内存持续增长的,都不算内存泄漏,而在系统层面,可以通过/proc/meminfo这个节点查看当前的系统内存信息。

    root@Linux:/# cat /proc/meminfo
    MemTotal:         239212 kB	//当前系统可使用的物理内存
    MemFree:          157576 kB //系统空闲内存
    MemAvailable:     176488 kB //MemFree+Buffers+Cached约等MemAvailable,该值为估值
    Buffers:            5288 kB //表示块设备(block device)所占用的缓存页
    Cached:            16316 kB //Page Cache里包括所有file-backed pages,Cached是”Mapped”的超集,就是说它不仅包括mapped,也包括unmapped的页面
    SwapCached:            0 kB //系统中有多少匿名页曾经被swap-out、现在又被swap-in并且swap-in之后页面中的内容一直没发生变化
    Active:            11288 kB //活动内存,Active = Active(anon) + Active(file)
    Inactive:          11832 kB //非活动内存,Inactive = Inactive(anon) + Inactive(file)
    Active(anon):       1524 kB //与文件无关的内存(比如进程的堆栈,用malloc申请的内存)
    Inactive(anon):       16 kB
    Active(file):       9764 kB //与文件关联的内存(比如程序文件、数据文件所对应的内存页)
    Inactive(file):    11816 kB
    Unevictable:           0 kB
    Mlocked:               0 kB //统计的是被mlock()系统调用锁定的内存大小
    SwapTotal:             0 kB
    SwapFree:              0 kB
    Dirty:                 0 kB
    Writeback:             0 kB
    AnonPages:          1592 kB //Anonymous pages(匿名页)的数量统计,Anonymous Pages是与用户进程共存的,一旦进程退出,则Anonymous pages也释放
    Mapped:             2484 kB //用户进程的file-backed pages
    Shmem:                24 kB //Shmem = shard memory + tmpfs + devtmpfs
    Slab:              12580 kB //Slab = SReclaimable+SUnreclaim
    SReclaimable:       3372 kB //slab中可回收部分,调用kmem_getpages()时加上SLAB_RECLAIM_ACCOUNT标记,表明是可回收的
    SUnreclaim:         9208 kB //slab中不可回收部分
    KernelStack:        1232 kB //每个用户线程都会分配一个kernel stack,该部分用户态代码不可访问
    PageTables:          208 kB //Page Table用于将内存的虚拟地址翻译成物理地址,随着内存地址分配得越多,Page Table随之增大
    NFS_Unstable:          0 kB //不稳定页表的大小
    Bounce:                0 kB
    WritebackTmp:          0 kB
    CommitLimit:      119604 kB
    Committed_AS:      44660 kB
    VmallocTotal:   263061440 kB //vmalloc内存区大小
    VmallocUsed:        1196 kB //已使用的vmalloc区大小
    VmallocChunk:          0 kB
    CmaTotal:          81920 kB //cma大小
    CmaFree:           40888 kB
    

    通过上面的信息,我们可以了解到当前系统的内存使用情况。当怀疑系统存在内存泄漏时,可通过一段时间内持续的查看/proc/meminfo中的内容信息,如果发现随着时间增长,slab或VmallocUsed一直增大,则说明slab泄漏或vmalloc泄漏。

    内核内存泄露排查可查看内核检查内存泄漏的工具 — kmemleakslub debug

    展开全文
  • 一、内核启动过程中,关于内存的信息 1. 内核分区 [ 0.000000] Memory: 1024MB = 1024MB total ---->内存的大小是1GB [ 0.000000] Memory: 810820k/810820k available, 237756k reserved, 272384K highmem [ 0....

    一、内核启动过程中,关于内存的信息

    1. 内核分区

    [ 0.000000] Memory: 1024MB = 1024MB total ---->内存的大小是1GB
    [ 0.000000] Memory: 810820k/810820k available, 237756k reserved, 272384K highmem
    [ 0.000000] Virtual kernel memory layout:
    [ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB) ---->存放中断向量表
    [ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB) ---->固定映射区
    [ 0.000000] vmalloc : 0xef800000 - 0xfee00000 ( 246 MB) ---->kmalloc()分配内存的区
    [ 0.000000] lowmem : 0xc0000000 - 0xef600000 ( 758 MB) ---->低端内存区,属于GFP_KERNEL标志
    [ 0.000000] pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB) ---->
    [ 0.000000] modules : 0xbf000000 - 0xbfe00000 ( 14 MB) ---->#insmod *.ko module存放段
    [ 0.000000] .text : 0xc0008000 - 0xc0a51018 (10533 kB) ---->代码段和只读的数据段
    [ 0.000000] .init : 0xc0a52000 - 0xc0a8f100 ( 245 kB) ---->初始化段,使用__init修饰初始化函数
    [ 0.000000] .data : 0xc0a90000 - 0xc0b297d8 ( 614 kB) ---->可读写的数据段
    [ 0.000000] .bss : 0xc0b297fc - 0xc0d09488 (1920 kB) ---->未初始化的数据段
    [ 0.000000] SLUB: Genslabs=11, HWalign=64, Order=0-3, MinObjects=0, CPUs=8, Nodes=1

    [ 4.341000] Freeing init memory: 244K

    2. 内核中,内存的分配器

    slab —>早期的内存分配器
    slob —>SLOB的目标是针对嵌入式系统的,主要是适用于那些内存非常有限的系统,比如32MB以下的内存
    slub —>SLUB被很认为是Slab和Slob的取代者,大概在2.6.24/2.6.25将会被同志们抛弃。而SLUB将是未来Linux Kernel中的首选。

    二、内核中如何分配内存

    例:

    struct template *tmp;
    tmp = (struct template *)kmalloc(sizeof(struct template), GFP_KERNEL)
    if(tmp == NULL)
    	return -1;
    

    1. 应用程序分配内存

    #include <stdlib.h> —>标准C库

    void *malloc(size_t size);
    void free(void *ptr);
    

    2. 驱动程序分配内存—kmalloc()

    1)malloc()

    static __always_inline void *kmalloc(size_t size, gfp_t flags)
    

    参数:
    size_t size —>分配内存的大小,字节数
    gfp_t flags —>分配内存的标志
    返回值:
    void * —>指向分配后的内存的指针

    2)分配内存的标志

    GFP_KERNEL ----> 正常的分配内存,分配的内存在lowmem区
    GFP_ATOMIC ----> 分配内存的过程是一个原子过程,该过程是不能被打断的,是一个连续的过程,不会产生阻塞。
    在中断服务程序中,需要分配内存,则需要使用GFP_ATOMIC关键字。
    GFP_DMA ----> 给DMA控制器分配内存。要求分配的内存,物理地址和虚拟地址都是连续的。
    注意:使用kmalloc分配内存的时候,内存的分配大小不能超过128KB。

    3)释放内存

    void kfree(const void *x)
    

    3. 驱动程序分配内存—vmalloc()

    void *vmalloc(unsigned long size)
    void vfree(const void *addr)
    

    三、kmalloc()和vmalloc()的区别

    1. 分配的大小:kmalloc不超过128kB,而vmalloc没有限制
    2. 分配的位置:kmalloc在lowmem区,vmalloc在vmalloc
    3. 原子性:kmalloc(size, GFP_ATOMIC),而vmalloc可能会产生阻塞的。
    4. 地址的连续性:kmalloc可以保证物理地址和虚拟地址是连续的,而vmalloc不能保证物理地址是连续的。
      虚拟地址到物理地址的映射,是以page为单位的。1page = 4kB

    四、MMU

    1. 什么是MMU?

    MMU — Memory Management Unit ---->内存管理单元
    MMU是CPU内核中的一个硬件模块。
    Cortex-M 没有MMU的 -----> uCOS-III ARM7
    Cortex-A 有MMU的 ---->嵌入式linux ARM9、ARM11

    2. MMU的作用?

    1)MMU实现虚拟地址到物理地址的转换

     嵌入式linux、WinCE、VxWorks操作系统只能运行在虚拟地址上,不能直接运行在物理地址上。
     物理地址:硬件平台的地址:原理图、CPU的使用手册、....
     虚拟地址:操作系统使用的地址:方便内核的保护(用户空间和内核空间)、可以实现不同进程之间的独立地址空间、有利于进程的切换。
    

    2)设置虚拟地址的访问属性

    只读、可读写、禁止访问
    

    3. MMU做地址转换的单位

    MMU转换地址的时候,不是一个个转换的,而是“一块块”转换的。
    1)section(段):1MB
    2)large page(大页):64KB
    3)little page(小页):4kB ------> linux(page=4kB)
    4)tiny page(极小页):1KB

    4. MMU的工作原理

    简单理解—>查表

    1)表

    page table(页表),页表是在使用MMU之前,就需要现在内存中创建一个页表,页表的首地址叫TTB,该地址要保存到MMU的寄存器中。
    当打开MMU后,MMU自动去查找页表,然后得到虚拟地址和物理地址的关系。

    2)表的索引

    表的索引是虚拟地址。

    3)表的内容

    是虚拟地址和物理地址的对应关系,和访问属性。

    5. MMU和ioremap之间的关系

    虚拟地址 = ioremap(物理地址的开始,物理地址的大小)
    ioremap()是一个改写页表的过程,重新定义了物理地址和虚拟地址的对应关系。

    6. MMU和cache的关系

    请添加图片描述

    展开全文
  • 想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过top命令查看进程占用了多少内存。这里我们可以看到VIRT、RES...

    概述

          想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过top命令查看进程占用了多少内存。这里我们可以看到VIRT、RES和SHR三个重要的指标,他们分别代表什么意思呢?这是本文需要跟大家一起探讨的问题。当然如果更加深入一点,你可能会问进程所占用的那些物理内存都用在了哪些地方?这时候top命令可能不能给到你你所想要的答案了,不过我们可以分析proc文件系统提供的smaps文件,这个文件详尽地列出了当前进程所占用物理内存的使用情况。

         这篇blog总共分为三个部分。第一部分简要阐述虚拟内存和驻留内存这两个重要的概念;第二部分解释top命令中VIRT、RES以及SHR三个参数的实际参考意义;最后一部分向大家介绍一下smaps文件的格式,通过分析smaps文件我们可以详细了解进程物理内存的使用情况,比如mmap文件占用了多少空间、动态内存开辟消耗了多少空间、函数调用栈消耗了多少空间等等。

    关于内存的两个概念

          要理解top命令关于内存使用情况的输出,我们必须首先搞清楚虚拟内存(Virtual Memory)和驻留内存(Resident Memory)两个概念。

    • 虚拟内存

       首先需要强调的是虚拟内存不同于物理内存,虽然两者都包含内存字眼但是它们属于两个不同层面的概念。进程占用虚拟内存空间大并非意味着程序的物理内存也一定占用很大。虚拟内存是操作系统内核为了对进程地址空间进行管理(process address space management)而精心设计的一个逻辑意义上的内存空间概念。我们程序中的指针其实都是这个虚拟内存空间中的地址。比如我们在写完一段C++程序之后都需要采用g++进行编译,这时候编译器采用的地址其实就是虚拟内存空间的地址。因为这时候程序还没有运行,何谈物理内存空间地址?凡是程序运行过程中可能需要用到的指令或者数据都必须在虚拟内存空间中。既然说虚拟内存是一个逻辑意义上(假象的)的内存空间,为了能够让程序在物理机器上运行,那么必须有一套机制可以让这些假象的虚拟内存空间映射到物理内存空间(实实在在的RAM内存条上的空间)。这其实就是操作系统中页映射表(page table)所做的事情了。内核会为系统中每一个进程维护一份相互独立的页映射表。。页映射表的基本原理是将程序运行过程中需要访问的一段虚拟内存空间通过页映射表映射到一段物理内存空间上,这样CPU访问对应虚拟内存地址的时候就可以通过这种查找页映射表的机制访问物理内存上的某个对应的地址。“页(page)”是虚拟内存空间向物理内存空间映射的基本单元。

            下图1演示了虚拟内存空间和物理内存空间的相互关系,它们通过Page Table关联起来。其中虚拟内存空间中着色的部分分别被映射到物理内存空间对应相同着色的部分。而虚拟内存空间中灰色的部分表示在物理内存空间中没有与之对应的部分,也就是说灰色部分没有被映射到物理内存空间中。这么做也是本着“按需映射”的指导思想,因为虚拟内存空间很大,可能其中很多部分在一次程序运行过程中根本不需要访问,所以也就没有必要将虚拟内存空间中的这些部分映射到物理内存空间上。

             到这里为止已经基本阐述了什么是虚拟内存了。总结一下就是,虚拟内存是一个假象的内存空间,在程序运行过程中虚拟内存空间中需要被访问的部分会被映射到物理内存空间中。虚拟内存空间大只能表示程序运行过程中可访问的空间比较大,不代表物理内存空间占用也大。

                       图1. 虚拟内存空间到物理内存空间映射

    • 驻留内存

      驻留内存,顾名思义是指那些被映射到进程虚拟内存空间的物理内存。上图1中,在系统物理内存空间中被着色的部分都是驻留内存。比如,A1、A2、A3和A4是进程A的驻留内存;B1、B2和B3是进程B的驻留内存。进程的驻留内存就是进程实实在在占用的物理内存。一般我们所讲的进程占用了多少内存,其实就是说的占用了多少驻留内存而不是多少虚拟内存。因为虚拟内存大并不意味着占用的物理内存大。

      关于虚拟内存和驻留内存这两个概念我们说到这里。下面一部分我们来看看top命令中VIRT、RES和SHR分别代表什么意思。

    top命令中VIRT、RES和SHR的含义

          搞清楚了虚拟内存的概念之后解释VIRT的含义就很简单了。VIRT表示的是进程虚拟内存空间大小。对应到图1中的进程A来说就是A1、A2、A3、A4以及灰色部分所有空间的总和。也就是说VIRT包含了在已经映射到物理内存空间的部分和尚未映射到物理内存空间的部分总和。

      RES的含义是指进程虚拟内存空间中已经映射到物理内存空间的那部分的大小。对应到图1中的进程A来说就是A1、A2、A3以及A4几个部分空间的总和。所以说,看进程在运行过程中占用了多少内存应该看RES的值而不是VIRT的值。

      最后来看看SHR所表示的含义。SHR是share(共享)的缩写,它表示的是进程占用的共享内存大小。在上图1中我们看到进程A虚拟内存空间中的A4和进程B虚拟内存空间中的B3都映射到了物理内存空间的A4/B3部分。咋一看很奇怪。为什么会出现这样的情况呢?其实我们写的程序会依赖于很多外部的动态库(.so),比如libc.so、libld.so等等。这些动态库在内存中仅仅会保存/映射一份,如果某个进程运行时需要这个动态库,那么动态加载器会将这块内存映射到对应进程的虚拟内存空间中。多个进展之间通过共享内存的方式相互通信也会出现这样的情况。这么一来,就会出现不同进程的虚拟内存空间会映射到相同的物理内存空间。这部分物理内存空间其实是被多个进程所共享的,所以我们将他们称为共享内存,用SHR来表示。某个进程占用的内存除了和别的进程共享的内存之外就是自己的独占内存了。所以要计算进程独占内存的大小只要用RES的值减去SHR值即可。 

    进程的smaps文件

      通过top命令我们已经能看出进程的虚拟空间大小(VIRT)、占用的物理内存(RES)以及和其他进程共享的内存(SHR)。但是仅此而已,如果我想知道如下问题:

    1. 进程的虚拟内存空间的分布情况,比如heap占用了多少空间、文件映射(mmap)占用了多少空间、stack占用了多少空间?
    2. 进程是否有被交换到swap空间的内存,如果有,被交换出去的大小?
    3. mmap方式打开的数据文件有多少页在内存中是脏页(dirty page)没有被写回到磁盘的?
    4. mmap方式打开的数据文件当前有多少页面已经在内存中,有多少页面还在磁盘中没有加载到page cahe中?
    5. 等等

      以上这些问题都无法通过top命令给出答案,但是有时候这些问题正是我们在对程序进行性能瓶颈分析和优化时所需要回答的问题。所幸的是,世界上解决问题的方法总比问题本身要多得多。linux通过proc文件系统为每个进程都提供了一个smaps文件,通过分析该文件我们就可以一一回答以上提出的问题。

      在smaps文件中,每一条记录(如下图2所示)表示进程虚拟内存空间中一块连续的区域。其中第一行从左到右依次表示地址范围、权限标识、映射文件偏移、设备号、inode、文件路径。详细解释可以参见understanding-linux-proc-id-maps

      接下来8个字段的含义分别如下:

    • Size:表示该映射区域在虚拟内存空间中的大小。
    • Rss:表示该映射区域当前在物理内存中占用了多少空间      
    • Shared_Clean:和其他进程共享的未被改写的page的大小
    • Shared_Dirty: 和其他进程共享的被改写的page的大小
    • Private_Clean:未被改写的私有页面的大小。
    • Private_Dirty: 已被改写的私有页面的大小。
    • Swap:表示非mmap内存(也叫anonymous memory,比如malloc动态分配出来的内存)由于物理内存不足被swap到交换空间的大小。
    • Pss:该虚拟内存区域平摊计算后使用的物理内存大小(有些内存会和其他进程共享,例如mmap进来的)。比如该区域所映射的物理内存部分同时也被另一个进程映射了,且该部分物理内存的大小为1000KB,那么该进程分摊其中一半的内存,即Pss=500KB。

                                 图2. smaps文件中的一条记录

      有了smap如此详细关于虚拟内存空间到物理内存空间的映射信息,相信大家已经能够通过分析该文件回答上面提出的4个问题。

       最后希望所有读者能够通过阅读本文对进程的虚拟内存和物理内存有一个更加清晰认识,并能更加准确理解top命令关于内存的输出,最后可以通过smaps文件更进一步分析进程使用内存的情况。

    (转自:http://www.cnblogs.com/bravery/archive/2012/06/27/2560611.html)

     

    展开全文
  • 一、mmap 创建内存映射 与 malloc 申请内存对比、 1、malloc 函数原型、 2、malloc 申请动态内存过程、 3、malloc 使用的系统调用判定 ( brk | mmap )、 4、mmap 创建内存映射、 二、mmap 创建内存映射 与 普通文件...
  • 常见的Linux内核内存分配

    千次阅读 2018-08-07 21:56:09
     Linux内核中采 用了一种同时适用于32位和64位系统的内 存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表,如图2-1所示四级页表分别为:  * 页全局目录(Page Global ...
  • Linux内核内存检测工具KASan

    千次阅读 2020-12-01 09:48:36
    KASan,全称Kernel Address Sanitizer,它是一个动态检测内存错误的工具,主要功能是检查内存越界访问和使用已释放的内存等问题。KASan 集成在 Linux 内核中,随 Linux 内核代码一起发布,并由内核社区维护和发展。...
  • Windows内核中的内存管理

    千次阅读 2016-11-26 19:46:04
    内核内存是在虚拟地址空间的高2GB位置,且由所有进程所共享,进程进行切换时改变的只是进程的用户分区的内存 驱动程序就像一个特殊的DLL,这个DLL被加载到内核的地址空间中,DriverEntry和AddDevice例程在系统的...
  • 内核中的内存管理,主要管理的是物理内存地址空间。而用户所谓的内存管理,指的是对其当前进程线性地址空间的管理 为什么要进行内存管理 内核中的内存管理,是为了在分页机制基础上,实现虚拟存储 用户中的内存...
  • 简单的内核内存查看方法 有时候需要调试内核内存,又不想搭建qemu调试环境的话,可以简单写一个内核模块,来测试一下。 直接看代码 注意:环境ub16 函数__get_free_page不要用get_free_page $ cat hello.c #...
  • 排查半天没有事,后来百度到相关帖子,记录一下,这是Linux内核机制,Linux与Windows不同,会存在缓存内存,通常叫做Cache Memory。有些时候你会发现没有什么程序在运行,但是使用top或free命令看到可用内存会很少。...
  • linux内存管理(一): arm64内核内存布局

    千次阅读 2020-03-03 23:19:57
    1. 内核内存配置 AArch64 Linux通常使用以下配置: 4KB页面, 使用3级或4级转换表,支持39位(512GB)或48位(256TB)的虚拟地址。 64KB页面,使用2级转换表,支持42位(4TB)虚拟地址。 他们的内存布局是一致的。...
  • 【Linux】Linux的内核空间(低端内存、高端内存

    万次阅读 多人点赞 2018-07-20 16:50:01
    内核也是程序,也应该具有自己的虚存空间,但是作为一种为用户程序服务的程序,内核空间有它自己的特点。   内核空间与用户空间的关系 在一个32位系统中,一个程序的虚拟空间最大可以是4GB,那么最直接的做法...
  • Linux内核内存管理

    2020-02-13 16:05:18
     内核把物理页作为内存管理的基本单位,尽管处理器的最小可寻址单位通常为字(或者字节),但是,内存管理单元(MMU,管理内存并把虚拟地址转换为物理地址的硬件)通常以页为单位进行处理。正因为如此,MMU以页(page)...
  • linux内存管理--linux内核高端内存

    千次阅读 2014-04-12 20:28:32
    Linux内核地址映射模型 x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。 段页式机制如下图。   Linux内核地址空间划分 ...Linux内核高端内存
  • Linux内核内存

    2018-02-09 14:57:16
    1.linux内核内存相关内容明确:用户空间占用4G虚拟内存的前3G 虚拟地址范围:0x00000000 ~ 0xBFFFFFFF 内核空间占用4G虚拟内存的后1G 虚拟地址范围:0xC0000000 ~ 0xFFFFFFFF明确: 不论在内核空间还是用户空间,...
  • Spark内核内存管理

    千次阅读 2020-09-17 22:36:30
    一、堆内内存和堆外内存 二、内存空间分配 2.1 早期内存管理(静态内存管理) 2.2 统一内存管理 2.3 同一管理内存的优点 三、存储内存管理 3.1 RDD的持久化机制 3.2RDD的缓存过程 3.3 淘汰与落盘 四、执行...
  • linux下查看内存使用情况方法总结

    千次阅读 2021-05-10 18:36:02
    这个动态更新的虚拟文件实际上是许多其他内存相关工具(如:free / ps / top)等的组合显示。/proc/meminfo列出了所有你想了解的内存的使用情况。进程的内存使用信息也可以通过/proc//statm 和 /proc//status 来查看。...
  • linux虚拟内存和物理内存 虚拟地址空间Linux整体架构图Linux虚拟内存系统内存管理分页式内存管理分段式内存管理段页式内存管理 虚拟地址空间 参考: ... 地址空间:非负整数地址的有序集合,如{0,1,2,...}\{0,1,2,...\...
  • 一、CPU过高分析1)使用TOP命令查看CPU、内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比。其中CPU状态中标示id的为空闲CPU百分比。当空闲CPU百分比...
  • Linux内核空间和用户空间的概念 内核空间和用户空间 32 位操作系统,它的寻址空间(虚拟地址空间,或叫线性地址空间)为 4G(2的...操作系统的核心是内核(kernel),它独立于普通的应用程序,可以访问受保护的内存空间,
  • GitHub - 0voice/kernel_memory_management: 总结整理linux内核内存管理的资料,包含论文,文章,视频,以及应用程序的内存泄露,内存池相关 有需要的可以前去下载,或者觉得还不错,请给我Star,感谢支持! ???...
  • 内存寻址 、硬件中的分段与分页 、Linux内存管理 页与内存管理区 、kmalloc()和vmalloc()
  • linux内核空间内存管理基本架构

    千次阅读 2017-04-27 00:26:27
    内核里分配内存还真不是件容易的事情,根本上是因为内核不能想用户空间那样奢侈的使用内存。  先来说说内存管理。内核把物理页作为内存管理的基本单位。尽管处理器的最小可寻址单位通常是字,但是,内存管理...
  • 摘要:Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据...
  • 稍有微机原理基础的人都知道Intel X86体系的CPU提供了四种特权模式ring0~ring3,其中ring0特权最高,ring3的特权最低,之所以要做这样的区分一个主要目的是保护资源,通俗来讲要保护的资源无非就是“内存、I/O端口...
  • Linux用户空间与内核空间内存映射

    千次阅读 2017-05-25 15:42:06
    Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在...
  • 内核内存拷贝策略

    千次阅读 2014-05-30 09:40:33
    Linux驱动和用户程序之间内存零拷贝实现
  • 1. 使用buddy系统管理ZONE 我的这两篇文章buddy系统和slab分配器已经分析过buddy和slab的...buddy的工作方式我就不说了,简单来说buddy就是用来管理内存的使用情况:一个页被申请了,别人就不能申请了。通过/proc/b...
  • 第十四章 Android 内核驱动内存管理 14.1 Low Memory Killer 基本原理 Android 的Low Memory Killer 是在标准linux kernel 的OOM 基础上修改而来的一种内存管理 机制当系统内存不足时杀死Bad 进程释放其内存Bad 进程...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 239,077
精华内容 95,630
关键字:

内核占用内存大