首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux 内核 内存管理】Linux 内核内存布局 ③ ( Linux 内核 动态分配内存 系统接口函数 | 统计输出 vmalloc 分配内存 )

文章目录 一、Linux 内核 动态分配内存 系统接口函数 二、统计输出 vmalloc 分配内存 一、Linux 内核 动态分配内存 系统接口函数 ---- Linux 内核 " 动态分配内存 "...是通过 " 系统接口 " 实现 , 下面介绍几个重要 接口函数 ; ① 以 " 页 " 为单位分配内存 : alloc_pages , __get_free_page ; ② 以 " 字节 " 为单位分配..." 虚拟地址连续内存块 " : vmalloc ; ③ 以 " 字节 " 为单位分配 " 物理地址连续内存块 " : kmalloc ; 注意 该 " 物理地址连续内存块 " 是以 Slab 为中心...; 二、统计输出 vmalloc 分配内存 ---- 执行 grep vmalloc /proc/vmallocinfo 命令 , 可以统计输出 通过 vmalloc 函数分配 " 虚拟地址连续内存

5.2K30

Linux内核高端内存

Linux内核地址映射模型 x86 CPU采用了段页式地址映射模型。进程代码中地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。 段页式机制如下图。 ?...Linux内核地址空间划分 通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同。 ?...Linux内核高端内存由来 当内核模块代码或线程访问内存时,代码中内存地址都为逻辑地址,而对应到真正物理内存地址,需要地址一对一映射,如逻辑地址0xc0000003对应物理地址为0x3,0xc0000004...Linux内核高端内存理解 前面我们解释了高端内存由来。...2、64位内核中有高端内存吗? 目前现实中,64位Linux内核不存在高端内存,因为64位内核可以支持超过512GB内存。若机器安装物理内存超过内核地址空间范围,就会存在高端内存

4.4K31
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    聊聊Linux内核内存回收上篇

    概述 内存回收是把已经使用过物理页帧重新放回到内核buddy系统(buddy系统用于申请空闲物理页帧子系统)管理中,解决内存紧张问题;内存回收页帧包括未修改文件页帧、修改且完成同步文件页帧...内核对所有用户态进程消耗RAW内存总量不做严格约束,当系统负载相对较低时候,内存大部分被磁盘高速缓存使用,随着系统负载增大,系统进程使用内存越来越多,磁盘高速缓存占用内存就会被缩小,内存页帧回收必须在消耗所有空闲页帧之前进行...内核中同时存在slab allocation,它用于内核数据结构申请。slab分配器频繁申请和释放情况下效率比较高 基于LRU页帧链表 内存页帧是有映射,映射到一个或者多个进程虚拟空间。...内核一般用内存页帧引用次数来表示页帧活跃程度。一个内存区zone将空闲页帧和已经使用页帧分别用buddy系统和 zoneLRU链表管理。...LRU链表类型种类定义enum lru_list(最大是NR_LRU_LISTS).内核将文件页帧和匿名页帧各自分别形成2个LRU链表。

    1.8K30

    Linux内核编程--内存映射和共享内存

    一,内存映射 对于磁盘文件和进程: 将一个文件或其它对象映射到进程地址空间,实现文件磁盘存储地址和进程地址空间中一段虚拟地址映射关系。...文件内存映射示意图: 对于用户进程和内核进程: 将用户进程一段内存区域映射到内核进程,映射成功后,用户进程对这段内存区域修改直接反映到内核空间,同样,内核进程对这段内存区域修改也直接反映到用户空间...没有内存映射I/O操作示意图: 磁盘->内核空间->用户空间 有内存映射I/O操作示意图:少了一个copy操作 内存映射优点: 减少了拷贝次数,节省I/O操作开支 用户空间和内核空间可以直接高效交互...一般用信号量来同步共享内存访问。 共享内存系统存储中位置: 为什么要用共享内存: 对于涉及到内核操作内核和进程之间,经历了四次复制操作,开销很大。..., int shmflg) --shmid:共享内存标识id,shmget返回值 --shmaddr:共享内存附加到本进程后本进程地址空间内存地址,若为NULL,由内核分配地址。

    6K10

    Linux 内核 VS 内存碎片 (下)

    Linux 内核 VS 内存碎片 (上) 我们可以看到根据迁移类型进行分组只是延缓了内存碎片,而并不是从根本解决,所以随着时间推移,当内存碎片过多,无法满足连续物理内存需求时,将会引起性能问题。...对于 3.10 版本内核内存规整时机如下: 分配高阶内存失败后 kswapd 线程平衡 zone; 直接内存回收来满足高阶内存需求,包括 THP 缺页异常处理路径; khugepaged 内核线程尝试...,为了降低 BPF 引入开销,这里抓取每一次对应事件延迟,因此和申请内存事件相比,可能存在多对一关系,对于 3.10 这样内核一次慢速内存分配过程中会重试多少次是不确定, 导致 oom...描述内存规整时候捎带提到了直接内存回收原因是,直接内存回收不仅会出现在内存严重不足情况,真正场景中也会内存碎片原因导致触发内存直接回收,二者一段时间内可能是混合出现。...对于如何减少直接内存回收出现频率以及出现碎片问题后如何缓解,我想法是对于需要大量操作 IO workload 场景,由于内核设计上照顾慢速后端设备,比如在 lru 算法基础上实现二次机会法、

    3.6K30

    Linux 内核 VS 内存碎片 (上)

    (外部)内存碎片是一个历史悠久 Linux 内核编程问题,随着系统运行,页面被分配给各种任务,随着时间推移内存会逐步碎片化,最终正常运行时间较长繁忙系统可能只有很少物理页面是连续。...由于 Linux 内核支持虚拟内存管理,物理内存碎片通常不是问题,因为页表帮助下,物理上分散内存在虚拟地址空间仍然是连续 (除非使用大页),但对于需要从内核线性映射区分配连续物理内存需求来说就会变非常困难...如果内核编程不再依赖线性地址空间高阶物理内存分配,那么内存碎片问题就从根本上解决了,但对于 Linux kernel 这样庞大工程来说,这样修改显然是不可能,所以从 Linux 2.x 版本至今...反碎片简史 开始正题前,先为大家汇总了部分 Linux 内核开发史上为改善高阶内存分配而做出所有努力。这里每一篇文章都非常值得细细读一读,期望这个表格能为对反碎片细节感兴趣读者带来便利。...Linux 经典算法基础上做了一些个扩展: 分区伙伴分配器; Per-CPU pageset; 根据迁移类型进行分组; 我们以前介绍过 Linux 内核使用 node, zone, page 来描述物理内存

    3.5K40

    详解Linux内核内存管理架构

    内存管理子系统可能是linux内核中最为复杂一个子系统,其支持功能需求众多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等,而且对性能也有很高要求...linux内存映射管理是通过页表来实现,但是页表是放在内存,如果每次地址转换过程都需要访问一次内存,其效率是十分低下。这里CPU通过TLB硬件单元来加速地址转换。...无法直接映射地址空间部分,即highmem zone。DMA zone和highmem zone中间区域即normal zone,主要用于内核动态内存分配。...不同CPU体系架构地址空间划分上不尽相同,但为了保证CPU体系差异对外部模块不可见,内存地址空间分配接口语义是一致。...因为64位CPU一般都不需要高端内存(当然也可以支持),地址空间划分上与32位CPU差异较大,下图是一个MIPS64 CPU内核地址空间划分图。 ?

    3.1K42

    Linux 内核 内存管理】内存管理架构 ① ( 内存管理架构组成 | 用户空间 | 内核空间 | MMU 硬件 | Linux 内核架构层次 | Linux 系统调用接口 )

    文章目录 一、内存管理架构组成 ( 用户空间 | 内核空间 | MMU 硬件 ) 二、Linux 内核架构层次 三、Linux 系统调用接口 一、内存管理架构组成 ( 用户空间 | 内核空间 | MMU...硬件 ) ---- 内存管理架构 由 3 部分组成 : ① 用户空间 : " 用户空间 " 中 , 使用 malloc 函数 申请 " 堆内存 " , 使用 free 函数 释放 " 堆内存..." ; ② 内核空间 : Linux 内核启动后 , 一直 驻留在内存 中 , 应用程序 不能 读写 内核空间数据 , 不能直接调用 内核源码 中函数 ; 只能通过 " 系统调用 " 间接调用 内核函数...组成 ; 层次架构如下 : Linux 内核 需要 " 管理硬件 " , 如 : CPU 处理器 , 内存 , I/O 设备 , 网络设备 等 ; Linux 内核 还需要 向上层 " 应用程序...⑤ 网络管理 : 内核 调用 网络接口 , 实现 网络管理 ; " 设备管理 " 对用户是透明 , 用户不直到 Linux 内核是如何管理设备 , 系统调用接口没有关于 " 设备管理 " 调用接口

    9.6K40

    ECMPLinux内核实现

    ECMP(Equal Cost Multi Path),中文名叫等价多路径,是路由里一项技术,作用是,IP交换网络中存在到达同一目的地址多条不同路径,而且每条路径消耗资源(Cost...ECMP不同版本Linux内核实现方式不一样,总体上可分为4个阶段。 内核版本ECMP功能< Pre kernel v2.2无ECMP。...kernel 3.5.7 图1是内核里L3(网络层)核心流程框架,展示了接收IP报文、发送IP报文、选取IP报文转发下一跳和转发IP报文流程。...这个变更破坏了ECMP历史版本默认行为,因此遭到了社区反对,4.4版本中Per-flow类型ECMP又回来了,下一节我们再分析。.... */ res->nh_sel = 0; } ``` ECMPLinux内核实现关键变更历史。

    7.7K51

    Kasan - Linux 内核内存检测工具

    Kasan 集成 Linux 内核中,随 Linux 内核代码一起发布,并由内核社区维护和发展。...了解 Linux 内存管理读者知道,内存每个物理页在内存中都会有一个 struct page 这样结构体来表示,即每 4KB 页需要 40B 结构体,大约 1% 内存用来表示内存本身。...Kasan Linux 内核 4.0 版本时被引入内核,所以选择内核代码需要高于 4.0 版本。...然后重新编译并安装内核即可,除了通用编译和安装命令, Fedora 这种发行版本中,还需要更新 grub。 清单 4. Linux 内核编译、安装命令 ? 清单 5. Grub 配置命令 ?...幸运Linux 内核源码中已经包含了针对 Kasan 测试代码,其位置 linux/lib/test_kasan.c。

    5.5K11

    Linux Used内存到底哪里去了?

    内存多少 2. buffer/cache内存可以释放。 3. used内存概率。 即使是这样我们还是要继续追查下used空间(7637M)到底用到哪里去了?...使用内存去向我们很自然就想到操作系统系统上各种进程需要消耗各种内存,我们透过top工具来看下: 通常我们会看进程RES这一项,这项到底是什么意思呢?这个数字从哪里出来呢?...由于linux系统采用是虚拟内存,进程代码,库,堆和栈使用内存都会消耗内存,但是申请出来内存,只要没真正touch过,是不算,因为没有真正为之分配物理页面。.../RSS.sh 7024692KB 从数字来看,我们进程使用了大概7024M内存,距离7637M还有几百M内存哪里去了?哪里去了?猫吃掉了? 我们再回头来仔细看下nmon内存统计表。...(32bytes),也就是说内存大小2.3%(96/4096)会被内核固定使用 含黛: struct page是系统boot时候就会根据内存大小算出来分配出去,18内核是1.56%左右,32内核由于

    3.2K20

    Linux内核内存检测工具KASAN

    KASAN 是 Kernel Address Sanitizer 缩写,它是一个动态检测内存错误工具,主要功能是检查内存越界访问和使用已释放内存等问题。...KASAN 集成 Linux 内核中,随 Linux 内核代码一起发布,并由内核社区维护和发展。本文简要介绍 KASAN 原理及使用方法。 一、KASAN原理和使用方法 1....KASAN原理概述 KASAN利用额外内存标记可用内存状态,这部分额外内存被称作shadow memory(影子区),KASAN将1/8内存用作shadow memory。...使用特殊magic num填充shadow memory,每一次load/store内存时候检测对应shadow memory确定操作是否valid。...二、总结 KASAN通过建立影子内存来管理内存访问合法性,可以有效检测内存越界等问题,但无法发现因逻辑问题导致合法内存内容改写问题。

    8.3K21

    Linux内核理解 Memory barrier(内存屏障)

    本文例子均在 Linux(g++)下验证通过,CPU 为 X86-64 处理器架构。所有罗列 Linux 内核代码也均在(或只)X86-64 下有效。...腾讯T6-9首发“Linux内核源码嵌入式开发进阶笔记”,差距不止一点点哦Memory barrier 简介程序在运行时内存实际访问顺序和程序代码编写访问顺序不一定一致,这就是内存乱序访问。...【文章福利】小编推荐自己Linux内核技术交流群:【865977150】整理了一些个人觉得比较好学习书籍、视频资料共享群文件里面,有需要可以自行添加哦!!!...避免编译时内存乱序访问办法就是使用编译器 barrier(又叫优化 barrier)。Linux 内核提供函数 barrier() 用于让编译器保证其之前内存访问先于其之后完成。... Linux 内核中,提供了一个宏 ACCESS_ONCE 来避免编译器对于连续 ACCESS_ONCE 实例进行指令重排。

    2K00

    Linux内核内存泄漏怎么办?

    Linux内核内存泄漏怎么搞? 1、Kmemleak介绍 Linux内核开发中,Kmemleak是一种用于检测内核内存泄漏工具。...内存泄漏指的是程序中已经不再使用内存没有被妥善地释放,导致内存浪费。内核内存泄漏同样会导致系统性能下降、系统崩溃等问题。...Kmemleak能够检测内核内存泄漏,通过检测内核中未被释放但又无法找到其使用位置内存,进一步定位、修复内存泄漏问题。...CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF 配置来控制,当然也可以通过向Linux内核启动参数中加入kmemleak=off来控制。...通过kmalloc()、vmalloc()、kmem_cache_alloc()等函数分配内存时,会跟踪指针,堆栈等信息,将其存储一个红黑树中。

    67420

    Linux内核内存管理与漏洞利用

    前言 网上已经有很多关于Linux内核内存管理分析和介绍了,但是不影响我再写一篇:一方面是作为其他文章补充,另一方面则是自己学习记录、总结和沉淀。...只有彼此buddy才能够进行合并。 使用Buddy算法应用有很多,其中Linux内核就是一个,此外jemalloc也是使用Buddy技术一个现代内存分配器。...【文章福利】【Linux内核内存管理专题训练营】火热开营!!...最新Linux内核技术详解 独家Linux内核内存管理干货分享 入营地址:inux内核内存管理专题训练营 两天持续技术输出: -------------------- 第一天: 1.物理内存映射及空间划分...其中partial是Linux内核中可插拔式通用双链表结构,使用内核中双链表接口进行操作。nr_partial表示partial双链表中元素个数,即slab个数。

    2.4K00

    精致全景图 | linux内核输出日志去哪里

    熟悉linux内核,或者看过linux内核源码同学就会知道,在内核中,有一个类似于c语言输出函数,叫做printk,使用它,我们可以打印各种我们想要信息,比如内核当前运行状态,又或者是我们自己调试日志等...那当我们调用printk函数后,这些输出信息到哪里去了呢?我们又如何在linux用户态,查看这些信息呢?...比如,当我们应用需要内存时,会向操作系统申请,操作系统此时给我们,其实是虚拟内存,只有当我们进程真正使用这些内存时,比如读/写,操作系统才会为其分配物理内存。...对于linux内核来说,它会选择一个使用内存最多进程,然后将其kill掉,以此来释放内存,保证后续内存分配操作能够成功,这个我之前文章 为什么我进程被kill掉了 有详细讲过。...比如,linux内核kill掉进程时,会用pr_err记录一行日志: 如果我们发现一个进程跑着跑着就没有了,就可以通过dmesg命令,查看是否有这个日志,如果有,说明该进程因为系统内存不足,被操作系统

    2.8K30

    Linux内存被吃掉了,它去哪里了?

    Windows下资源管理器查看内存使用情况,如果使用率达到80%以上,再运行大程序就能感觉到系统不流畅了,因为在内存紧缺情况下使用交换分区,频繁地从磁盘上换入换出页会极大地影响系统性能。...而当我们使用free命令查看Linux系统内存使用情况时,会发现内存使用一直处于较高水平,即使此时系统并没有运行多少软件。...这正是Windows和Linux内存管理上区别,乍一看,Linux系统吃掉我们内存Linux ate my ram),但其实这也正是其内存管理特点。 ?...其实不然,Linux并没有吃掉你内存,只要还未使用到交换分区,你内存所剩无几时,你应该感到庆幸,因为Linux缓存了大量数据,也许下一次你就从中受益。.../ 前两天Hacker News看到”Linux ate my ram”这个网页,写通俗易懂,也顺藤摸瓜解决心中很多疑惑 http://www.linuxatemyram.com/play.html

    1.5K30

    Linux 内核 内存管理】Linux 内核内存布局 ① ( 查看 Linux 操作系统位数 | 查看 Linux 操作系统软硬件信息 )

    文章目录 一、查看 Linux 操作系统位数 二、查看 Linux 操作系统软硬件信息 一、查看 Linux 操作系统位数 ---- 64 位 Linux 中 , 使用 48 位 表示 "..." Linux 内核位数 “ 和 ” 系统软硬件信息 " ; 输出内容解析 : vendor_id : GenuineIntel CPU 制造商 GenuineIntel cpu family :...id : 0 单个 CPU 标号 siblings : 1 单个 CPU 逻辑物理核心数量 core id : 0 当前 物理核心 CPU 中编号 cpu cores : 1 逻辑核心 所在...物理核心数 apicid : 0 区分不同逻辑核心编号 , 该编号不一定连续 ; bogomips : 5807.99 Linux 内核启动时测量 CPU 速度 clflush size : 64...size : 64 cache_alignment : 64 address sizes : 42 bits physical, 48 bits virtual power management: 虚拟机中

    31.9K20

    Linux内核27-优化和内存屏障

    比如说,对于Linux内核barrier()宏,展开后就是asm volatile("":::"memory"),就是一个优化屏障。...ARM系统中,使用ldrex和strex汇编指令实现内存屏障。 3. Linux内核使用内存屏障原语 Linux内核中使用内存屏障原语如下,如表5-6所示。...当然了,这些原语完全可以作为优化屏障,阻止编译器优化该屏障前后汇编指令。读内存屏障只对内存读操作指令有效;写内存屏障只对内存写操作指令有效。...表5-6 Linux内存屏障 macro 描述 mb() MP和UP内存屏障 rmb() MP和UP内存屏障 wmb() MP和UP内存屏障 smp_mb() MP内存屏障 smp_rmb()...X86系统上,如果支持lfence汇编指令,则rmb()实现为: asm volatile("lfence":::"memory") 如不支持lfence汇编指令,则rmb()实现为: asm volatile

    1.4K10

    Linux 内核 内存管理】Linux 内核内存布局 ④ ( ARM64 架构体系内存分布 | 内核启动源码 start_kernel | 内存初始化 mm_init | mem_init )

    文章目录 一、ARM64 架构体系内存分布 二、Linux 内核启动源码 start_kernel 三、内存初始化源码 mm_init 四、内存初始化源码 mem_init 一、ARM64 架构体系内存分布..." 不规范地址空间 " 是不允许使用 内存空间 ; 二、Linux 内核启动源码 start_kernel ---- Linux 内核初始化完成后 , 会在 " 初始化内存 " 时 , 输出 内存布局...; Linux 内核启动源码是定义 linux-5.6.18\init\main.c 源码中 asmlinkage __visible void __init start_kernel(void)...-5.6.18\init\main.c#795 四、内存初始化源码 mem_init ---- linux-5.6.18\init\main.c#795 定义 mm_init 方法 中 , 调用了...mem_init 方法初始化内存 , 该方法定义 arch\x86\mm\init_32.c#766 位置 ; 在内存初始化时 , 会打印如下格式 " 内核空间 内存分布 " 日志 : printk

    7K20
    领券