首页
学习
活动
专区
工具
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
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Windows内核内存管理

    内存管理要点 内核内存是在虚拟地址空间高2GB位置,且由所有进程所共享,进程进行切换时改变只是进程用户分区内存 驱动程序就像一个特殊DLL,这个DLL被加载到内核地址空间中,DriverEntry...,只在debug版本中生效,用于判断当前中断请求级别,当级别高于DISPATCH_LEVEL(包含这个级别)时会产生一个断言 内核堆申请函数 PVOID ExAllocatePool(...,这个时候即使内存仍有剩余,但是我们也申请不了内存,一般在操作系统空闲时候会进行内存整理,将空洞内存进行合并,如果驱动需要频繁内存申请释放相同大小内存块,DDK提供了Lookaside内存容器...结构内存不够时,他会自动向操作系统申请更多内存,如果lookaside内部有大量未使用内存时,他会自动释放一部分,总之它是一个智能自动调整内存大小一个容器。...在内核,对于内存读写要相当谨慎,稍不注意就可能产生一个新漏洞或者造成系统蓝屏崩溃,有时在读写内存前需要判断该内存是否合法可供读写,DDK提供了两个函数来判断内存是否可读可写 VOID ProbeForRead

    1.4K20

    聊聊Linux内核内存回收上篇

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

    1.8K30

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

    文件内存映射示意图: 对于用户进程和内核进程: 将用户进程一段内存区域映射到内核进程,映射成功后,用户进程对这段内存区域修改直接反映到内核空间,同样,内核进程对这段内存区域修改也直接反映到用户空间...没有内存映射I/O操作示意图: 磁盘->内核空间->用户空间 有内存映射I/O操作示意图:少了一个copy操作 内存映射优点: 减少了拷贝次数,节省I/O操作开支 用户空间和内核空间可以直接高效交互...offset); start:用户进程要映射某段内存区域起始地址,通常为NULL(由内核来指定) length:要映射内存区域大小 prot:期望内存保护标志 flags:指定映射对象类型...fd:要映射文件描述符 offset:要映射用户空间内存区域在内核空间中已经分配好了内存区域中偏移 --prot参数取值: PROT_READ:映射区可读 PROT_WRITE:映射区可写...一般用信号量来同步共享内存访问。 共享内存区在系统存储位置: 为什么要用共享内存: 对于涉及到内核操作内核和进程之间,经历了四次复制操作,开销很大。

    6.1K10

    Linux 内核 VS 内存碎片 (下)

    Linux 内核 VS 内存碎片 (上) 我们可以看到根据迁移类型进行分组只是延缓了内存碎片,而并不是从根本解决,所以随着时间推移,当内存碎片过多,无法满足连续物理内存需求时,将会引起性能问题。...内存规整 在内存规整引入之前,内核还使用过 lumpy reclaim 来进行反碎片化,但在我们当前最常用 3.10 版本内核上已经不存在了,所以不做介绍,感兴趣朋友请从文章开头整理列表自取,我们来看内存规整...对于 3.10 版本内核内存规整时机如下: 在分配高阶内存失败后 kswapd 线程平衡 zone; 直接内存回收来满足高阶内存需求,包括 THP 缺页异常处理路径; khugepaged 内核线程尝试...,主要关注内存分配路径: [up-38369217a56524682afabccb202a52c5187.png] 基本流程:当申请分配页时候,如果无法从伙伴系统 freelist 获得页面,则进入慢速内存分配路径...在描述内存规整时候捎带提到了直接内存回收原因是,直接内存回收不仅会出现在内存严重不足情况,在真正场景也会内存碎片原因导致触发内存直接回收,二者在一段时间内可能是混合出现

    3.7K30

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

    文章目录 一、内存管理架构组成 ( 用户空间 | 内核空间 | MMU 硬件 ) 二、Linux 内核架构层次 三、Linux 系统调用接口 一、内存管理架构组成 ( 用户空间 | 内核空间 | MMU..." ; ② 内核空间 : Linux 内核启动后 , 一直 驻留在内存 , 应用程序 不能 读写 内核空间数据 , 不能直接调用 内核源码 函数 ; 只能通过 " 系统调用 " 间接调用 内核函数...; ③ 硬件 : 硬件主要是指 处理器 " 内存管理单元 “ , 该 内存管理单元 主要作用是 将 ” 虚拟内存地址 " 转为 " 物理内存地址 " ; " 内存管理单元 " , 英文名称是 "...组成 ; 层次架构如下 : Linux 内核 需要 " 管理硬件 " , 如 : CPU 处理器 , 内存 , I/O 设备 , 网络设备 等 ; Linux 内核 还需要 向上层 " 应用程序...⑤ 网络管理 : 内核 调用 网络接口 , 实现 网络管理 ; " 设备管理 " 对用户是透明 , 用户不直到 Linux 内核是如何管理设备 , 系统调用接口没有关于 " 设备管理 " 调用接口

    9.6K40

    详解Linux内核内存管理架构

    内存管理子系统可能是linux内核中最为复杂一个子系统,其支持功能需求众多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等,而且对性能也有很高要求...linux内存映射管理是通过页表来实现,但是页表是放在内存,如果每次地址转换过程都需要访问一次内存,其效率是十分低下。这里CPU通过TLB硬件单元来加速地址转换。...直接内存动态分配地址空间:因为访问效率等原因,内核内存采用简单线性映射,但是因为32位CPU寻址能力(4G大小)和内核地址空间起始设置(3G开始),会导致内核地址空间资源不足,当内存大于1GB...kmap主要用于fs、net等对高端内存访问有较高性能要求模块。 固定映射地址空间:持久映射问题是可能会休眠,在中断上下文、自旋锁临界区等不能阻塞场景不可用。...kmap_atomic使用场景与kmap较为相似,主要用于mm、fs、net等对高端内存访问有较高性能要求而且不能休眠模块

    3.1K42

    Linux 内核 VS 内存碎片 (上)

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

    3.5K40

    Kasan - Linux 内核内存检测工具

    Kasan 集成在 Linux 内核,随 Linux 内核代码一起发布,并由内核社区维护和发展。...了解 Linux 内存管理读者知道,内存每个物理页在内存中都会有一个 struct page 这样结构体来表示,即每 4KB 页需要 40B 结构体,大约 1% 内存用来表示内存本身。...然后重新编译并安装内核即可,除了通用编译和安装命令,在 Fedora 这种发行版本,还需要更新 grub。 清单 4. Linux 内核编译、安装命令 ? 清单 5. Grub 配置命令 ?...幸运Linux 内核源码已经包含了针对 Kasan 测试代码,其位置在 linux/lib/test_kasan.c。...结束语 本文介绍了 Kasan 配置及使用方法,并通过运行 Kasan 测试用例说明了 Kasan 原理。对于内核开发者来说,该工具不仅可以用来检测自己代码。

    5.6K11

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

    前言 网上已经有很多关于Linux内核内存管理分析和介绍了,但是不影响我再写一篇:一方面是作为其他文章补充,另一方面则是自己学习记录、总结和沉淀。...Linux内核伙伴系统块大小为一页,通常是4096字节。最大order一般是10,即MAX_ORDER为11。...【文章福利】【Linux内核内存管理专题训练营】火热开营!!...最新Linux内核技术详解 独家Linux内核内存管理干货分享 入营地址:inux内核内存管理专题训练营 两天持续技术输出: -------------------- 第一天: 1.物理内存映射及空间划分...其中partial是Linux内核可插拔式通用双链表结构,使用内核双链表接口进行操作。nr_partial表示partial双链表元素个数,即slab个数。

    2.4K00

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

    本文例子均在 Linux(g++)下验证通过,CPU 为 X86-64 处理器架构。所有罗列 Linux 内核代码也均在(或只在)X86-64 下有效。...腾讯T6-9首发“Linux内核源码嵌入式开发进阶笔记”,差距不止一点点哦Memory barrier 简介程序在运行时内存实际访问顺序和程序代码编写访问顺序不一定一致,这就是内存乱序访问。...避免编译时内存乱序访问办法就是使用编译器 barrier(又叫优化 barrier)。Linux 内核提供函数 barrier() 用于让编译器保证其之前内存访问先于其之后完成。...在 Linux 内核,提供了一个宏 ACCESS_ONCE 来避免编译器对于连续 ACCESS_ONCE 实例进行指令重排。...在 Linux 内核,除了前面说到编译器 barrier — barrier() 和 ACCESS_ONCE(),还有 CPU Memory barrier:通用 barrier,保证读写操作有序

    2.1K00

    Linux内核内存泄漏怎么办?

    Linux内核内存泄漏怎么搞? 1、Kmemleak介绍 在Linux内核开发,Kmemleak是一种用于检测内核内存泄漏工具。...内存泄漏指的是程序已经不再使用内存没有被妥善地释放,导致内存浪费。内核内存泄漏同样会导致系统性能下降、系统崩溃等问题。...Kmemleak能够检测内核内存泄漏,通过检测内核未被释放但又无法找到其使用位置内存,进一步定位、修复内存泄漏问题。...3、Kmemleak原理 Kmemleak提供了一种跟踪垃圾回收器tracing garbage collector原理,来检测内核存在内存泄露,其不同之处在于:孤立对象并没有被释放掉,而是通过...我们通过查看相关内核文档可知,内存泄露检测扫描算法步骤如下: 将所有对象标记为白色(最后剩余白色对象将被视为孤立对象) 从数据段和堆栈开始扫描内存,根据红黑树存储地址信息来检查值,如果找到指向白色对象指针

    71520

    Linux内核内存检测工具KASAN

    KASAN 是 Kernel Address Sanitizer 缩写,它是一个动态检测内存错误工具,主要功能是检查内存越界访问和使用已释放内存等问题。...KASAN 集成在 Linux 内核,随 Linux 内核代码一起发布,并由内核社区维护和发展。本文简要介绍 KASAN 原理及使用方法。 一、KASAN原理和使用方法 1....KASAN原理概述 KASAN利用额外内存标记可用内存状态,这部分额外内存被称作shadow memory(影子区),KASAN将1/8内存用作shadow memory。...Step1:假如从buddy system分配4 pages,系统首先从order=2链表摘下一块内存; Step2:然后根据shadow memory address和memory address...Step1:从buddy system order = 2链表释放4 pages; Step2:根据shadow memory addr和memory addr对应关系,找到shadow memory

    8.6K21

    Linux 内核 内存管理】Linux 内核内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体 start_brk、brk 成员 )

    文章目录 一、堆内存管理 二、内存描述符 mm_struct 结构体 三、mm_struct 结构体 start_brk、brk 成员 一、堆内存管理 ---- Linux 操作系统 " 堆内存...Linux 内核实现 , 开发者 不知道 堆管理细节 , 只通过 " 系统调用 " 调用相关函数 ; " brk 系统调用 " 负责 扩展 和 收缩 堆内存 ; 在 " 内存描述符结构体 " mm_struct...结构体 , start_brk 是 " 堆内存 “ 在 ” 虚拟地址空间 " 起始地址 , brk 是 " 堆内存 " 在 " 虚拟地址空间 " 结束地址 , 二、内存描述符 mm_struct...结构体 ---- mm_struct 结构体 定义在 Linux 内核源码 include\linux\mm_types.h#375 源码 ; mm_struct 结构体 源码 : struct mm_struct...、brk 成员 , 分别是 " 堆内存 " 在 " 虚拟地址空间 " 开始 和 结束 地址 , 其定义在 Linux 内核源码 linux-5.6.18\include\linux\mm_types.h

    93131

    Linuxxargs使用方法

    背景 xargs可以高效对文件批量处理: 比如你要在不同文件夹下创建同一个文件 比如你想根据某个查询条件, 批量删除符合条件文件 比如你想对不同文件夹文件进行更新 笨笨方法, 是一个一个进行复制..., 比如cd xxx;ls;cp xxx yyy; cd ../; 其实, xargs可以非常优雅进行批量操作....下面用几个例子, 演示一下xargs用法. 一个坑就是使用echo和ls问题, 这里进行了测试. 2....将文件批量copy到六个文件夹 命令: 这里使用ls -d仅仅打印文件夹名称, 而不打印文件夹里面的内容 xargs -i是定义对象位置, 匹配是{}, 它会将前面的对象, 放到{}位置 ls...@localhost xargs]$ ls hello_world.txt y1 y1: y2 y2: y3 y3: y4 y4: y5 y5: y6 y6: 这是因为, 对象返回是文件夹还有

    1.9K20

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

    文章目录 一、查看 Linux 操作系统位数 二、查看 Linux 操作系统软硬件信息 一、查看 Linux 操作系统位数 ---- 在 64 位 Linux , 使用 48 位 表示 "..." Linux 内核位数 “ 和 ” 系统软硬件信息 " ; 输出内容解析 : vendor_id : GenuineIntel CPU 制造商 GenuineIntel cpu family :...6 CPU 产品系列代号 model : 165 CPU 属于系列代号 model name : Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz CPU 名称 ,...id : 0 单个 CPU 标号 siblings : 1 单个 CPU 逻辑物理核心数量 core id : 0 当前 物理核心 在 CPU 编号 cpu cores : 1 逻辑核心 所在...物理核心数 apicid : 0 区分不同逻辑核心编号 , 该编号不一定连续 ; bogomips : 5807.99 Linux 内核启动时测量 CPU 速度 clflush size : 64

    32K20

    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)...函数 ; 在 Linux 内核启动方法 , 调用了 mm_init(); 方法 , 参考路径 : linux-5.6.18\init\main.c#878 asmlinkage __visible...-5.6.18\init\main.c#795 四、内存初始化源码 mem_init ---- 在 linux-5.6.18\init\main.c#795 定义 mm_init 方法 , 调用了

    7.1K20

    Linux 内核 内存管理】Linux 内核内存布局 ② ( x86_64 架构体系内存分布 | 查看 procmeminfo 文件 | procmeminfo 重要字段解析 )

    可以查看 " x86_64 架构体系内存分布 " ; 执行结果参考 : root@ubuntu:~/kernel/linux-5.6.14# cat /proc/meminfo MemTotal:...DirectMap4k: 159552 kB DirectMap2M: 2985984 kB DirectMap1G: 3145728 kB root@ubuntu:~/kernel/linux...(anon): 493520 kB 活跃 " 匿名内存 " Inactive(anon): 17780 kB 不活跃 " 匿名内存 " Active(file): 527844 kB 活跃文件使用内存...kB 正在被写内存大小 AnonPages: 492572 kB " 未映射页 " 内存 映射到 " 用户空间 " 后 页表大小 Mapped: 191348 kB " 映射文件 " 内存大小 Shmem..." 总量大小 VmallocUsed: 21440 kB 已经使用 " 虚拟内存 " VmallocChunk: 0 kB 可分配 最大 " 逻辑地址连续 " " 虚拟内存 "

    1.6K30
    领券