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

详解Linux内核内存管理架构

内存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等,而且对性能也有很高的要求...本文从内存管理硬件架构、地址空间划分和内存管理软件架构三个方面入手,尝试对内存管理的软硬件架构做一些宏观上的分析总结。...内存管理硬件架构 因为内存管理内核最为核心的一个功能,针对内存管理性能优化,除了软件优化,硬件架构也做了很多的优化设计。下图是一个目前主流处理器上的存储器层次结构设计方案。 ?...linux内存映射管理是通过页表来实现的,但是页表是放在内存中的,如果每次地址转换过程都需要访问一次内存,其效率是十分低下的。这里CPU通过TLB硬件单元来加速地址转换。...内存管理软件架构 内核内存管理的核心工作就是内存的分配回收管理,其内部分为2个体系:页管理和对象管理

3K42

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

文章目录 一、内存管理架构组成 ( 用户空间 | 内核空间 | MMU 硬件 ) 二、Linux 内核架构层次 三、Linux 系统调用接口 一、内存管理架构组成 ( 用户空间 | 内核空间 | MMU..." ; ② 内核空间 : Linux 内核启动后 , 一直 驻留在内存 中 , 应用程序 不能 读写 内核空间数据 , 不能直接调用 内核源码 中的函数 ; 只能通过 " 系统调用 " 间接调用 内核函数...组成 ; 层次架构如下 : Linux 内核 需要 " 管理硬件 " , 如 : CPU 处理器 , 内存 , I/O 设备 , 网络设备 等 ; Linux 内核 还需要 向上层的 " 应用程序...中的如下功能 : ① 进程调度 : 内核 调用 CPU 处理器 实现 进程调度 ; ② 内存管理 : 内核 调用 物理内存 实现 内存管理 ; ③ IPC 跨进程通信 ④ VFS 虚拟文件系统...⑤ 网络管理 : 内核 调用 网络接口 , 实现 网络管理 ; " 设备管理 " 对用户是透明的 , 用户不直到 Linux 内核是如何管理设备的 , 系统调用接口没有关于 " 设备管理 " 的调用接口

9.4K40
您找到你想要的搜索结果了吗?
是的
没有找到

Linux 内核 内存管理Linux 内核内存管理 ③ ( CPU 计数器瓶颈 | per-CPU 计数器 | Linux 内核 percpu_counter 结构体源码 )

文章目录 一、CPU 计数器瓶颈 二、per-CPU 计数器及 percpu_counter 结构体源码 一、CPU 计数器瓶颈 ---- 如果 操作系统 中有 多个 CPU , 假设只有一个 CPU...正在访问计数器 , 其它 CPU 需要等待计数器释放 , 才能访问 CPU 计数器 , 这里 CPU 计数器会出现瓶颈 , 影响系统性能 ; 二、per-CPU 计数器及 percpu_counter 结构体源码...---- Linux 内核中 , 引入了 " per-CPU 计数器 “ , 用于加速 ” SMP 系统 " 的计数器操作 ; " per-CPU 计数器 " 在 Linux 内核中被定义为 percpu_counter...结构体 , 该 结构体 定义在 Linux 内核源码linux-5.6.18\include\linux\percpu_counter.h#20 中 ; raw_spinlock_t lock...: linux-5.6.18\include\linux\percpu_counter.h#20

1K10

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

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

5.1K30

Linux 内核 内存管理Linux 内核内存管理 ② ( 动态分配堆内存方式 | brk 系统调用 | mmap 系统调用 | brk 系统调用源码介绍 )

文章目录 一、Linux 系统 动态分配堆内存 方式 二、brk 系统调用 动态分配堆内存 一、Linux 系统 动态分配堆内存 方式 ---- Linux 系统中 , 提供了 2 种方式 进行 "...系统调用 : 向 Linux 操作系统 申请 " 虚拟地址空间 " 内存 , 并且将某个文件 " 映射 “ 到该申请的内存中 ; 如果 不需要映射文件 到该空间中 , 则该空间就是 ” 匿名空间 "...扩张 " 堆内存 , 可以将 结束地址 " 大于当前值 " , 如果要 " 收缩 " 堆内存 , 可以将 结束地址 " 小于当前值 " ; brk 系统调用 源码Linux 源码中的 linux-5.6.18...\mm\mmap.c#187 源码中定义 ; SYSCALL_DEFINE1(brk, unsigned long, brk) { unsigned long retval; unsigned long...: linux-5.6.18\mm\mmap.c#187

5K20

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

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

2.3K00

Linux 内核Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )

文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的...Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本的内核源码 ; 5.x 内核源码下载地址.../pub/linux/kernel/v5.x/linux-5.6.18.tar.gz 下载完 Linux 源码后 , 如果在 Windows 系统中解压 , 需要使用管理员权限在 命令行终端 中解压 ,...Code ) 博客 , 安装 VSCode 软件 ; 打开 VSCode , 选择 ” 菜单栏 / 文件 / 打开文件夹 ” 选项 , 选择 Linux 内核源码目录 , 点击 ” 选择文件夹 ”...按钮 , 此时就可以在 VSCode 中阅读 Linux 内核源码 ; 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163620.html原文链接:https

23.1K32

Linux 内核Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )

文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的...Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本的内核源码 ; 5.x 内核源码下载地址.../pub/linux/kernel/v5.x/linux-5.6.18.tar.gz 下载完 Linux 源码后 , 如果在 Windows 系统中解压 , 需要使用管理员权限在 命令行终端 中解压 ,...Code ) 博客 , 安装 VSCode 软件 ; 打开 VSCode , 选择 " 菜单栏 / 文件 / 打开文件夹 " 选项 , 选择 Linux 内核源码目录 , 点击 " 选择文件夹 "...按钮 , 此时就可以在 VSCode 中阅读 Linux 内核源码 ;

21.2K30

DPDK巨页地址管理Linux内核内存管理内存映射pagemaprdma内存注册

DPDK巨页地址管理/Linux内核内存管理/内存映射/pagemap/rdma内存/注册术语PFN: 物理地址对应的页帧号:pfn = pte_pfn(*pte)INFINIBAND_USER_MEM...主机内存缓存 (HMC) 负责缓存和管理这些上下文对象。...HMC 在每个 PCI 功能的基础上管理主机内存,并进一步将每个 PCI 功能的 HMC 内存空间分解为用于管理用于给定 PCI 功能的每个上下文对象的内存。...保留默认大小的大页的最简单方法是使用 procfs 接口: echo 20 > /proc/sys/vm/nr_hugepagesHugetlbfs  本文的例子摘自 Linux 内核源码中提供的有关说明文档...Linux Hugetlbfs内核源码简析-Hugetlbfs初始化: https://zhuanlan.zhihu.com/p/549072447, https://www.cnblogs.com/MerlinJ

16510

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 内核启动方法 中 ,...: linux-5.6.18\init\main.c#822 三、内存初始化源码 mm_init ---- mm_init 方法在 linux-5.6.18\init\main.c#795 定义 ,...: linux-5.6.18\init\main.c#795 四、内存初始化源码 mem_init ---- 在 linux-5.6.18\init\main.c#795 定义的 mm_init 方法

6.7K20

Linux 内核 内存管理】物理内存组织结构 ④ ( 内存区域 zone 简介 | zone 结构体源码分析 | zone 结构体源码 )

文章目录 一、内存区域 zone 简介 二、zone 结构体源码分析 1、watermark 成员 2、lowmem_reserve 成员 3、zone_pgdat 成员 4、pageset 成员 5...内存管理系统 3 级结构 : ① 内存节点 Node , ② 内存区域 Zone , ③ 内存页 Page , Linux 内核中 , 使用 上述 3 级结构 描述 和 管理 " 物理内存 "...; 一、内存区域 zone 简介 ---- " 内存节点 " 是内存管理的 最顶层结构 , " 内存节点 " 再向下划分 , 就是 " 内存区域 " zone , " 内存区域 " 在 Linux 内核中使用...struct zone 结构体类型进行描述 , zone 枚举定义在 Linux 内核源码linux-4.12\include\linux\mmzone.h#350 位置 ; 每个 " 内存区域...: linux-4.12\include\linux\mmzone.h#350

4.4K30

Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )

文章目录 一、禁止 / 开启内核抢占 与 方法保护临界区 二、编译器优化屏障 三、preempt_disable 禁止内核抢占 源码 四、preempt_enable 开启内核抢占 源码 一、禁止 /...开启内核抢占 与 方法保护临界区 ---- 如果要使用 " 内存屏障 " , 如 : 禁止 内核 抢占 " 方法保护临界区 " : 首先 , 声明 preempt_disable(); 宏 , 表示下面的代码就是...preempt_disable(); // 方法保护临界区 preempt_enable(); 二、编译器优化屏障 ---- gcc 编译器优化屏障 参考 【Linux 内核 内存管理】优化内存屏障...-5.6.18\include\linux\compiler-gcc.h#20 三、preempt_disable 禁止内核抢占 源码 ---- 在 Linux 内核源码 linux-5.6.18\include...四、preempt_enable 开启内核抢占 源码 ---- 在 Linux 内核源码 linux-5.6.18\include\linux\preempt.h 中 , 定义了 preempt_enable

1.3K20

Linux内核设备驱动之内存管理笔记整理

/********************** * linux内存管理 **********************/ 到目前为止,内存管理是unix内核中最复杂的活动。...我们简单介绍一下内存管理,并通过实例说明如何在内核态获得内存。 (1)各种地址 对于x86处理器,需要区分以下三种地址: *逻辑地址(logical address) 只有x86支持。...(1)内核中的内存管理 内核把物理页作为内存管理的基本单位。这主要是因为内存管理单元(MMU)是以页为单位进行虚拟地址和物理地址转换的,从虚拟内存的角度来看,页就是最小单位。...结构的目的再于描述物理内存本身,而不是其中的数据。 内核根据page结构来管理系统中所有的页,内核通过page可以知道一个页是否空闲(也就是页有没有被分配)。...(2)页分配 内核是使用页进行内存管理的,因此,我们在内核中也可以要求系统以页为单位给我们分配内存。当然,以页为单位分配可能造成内存浪费,因此,只有在我们确定需要整页内存时才调用他们。

1.6K20

Linux 内核Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )

包括 进程创建 , 销毁 , 线程组管理 , 内核线程管理 , 队列等待 ; 进程调度 位于 下图 Linux 内核整体架构图 中的 内核空间 ; 二、内存管理 ---- 内存管理 涉及到 物理内存管理...和 虚拟内存管理 , 是 Linux 内核中 最复杂的模块 ; 虚拟内存管理 包括 : 反向映射 , KSM , MMAP 映射 , 缺页中断 , 共享内存 , 进程虚拟地址空间管理 , 页面回收 ;...物理内存管理 包括 : 页面分配器 等 ; 内存管理 位于 下图 Linux 内核整体架构图 中的 内核空间 ; 三、中断管理 ---- 中断管理 包括 : 处理器异常处理 , 中断处理 ; 异常指的是...处理器执行时 , 检测 异常条件 , 处理器需要停止当前执行的栈 , 处理异常 ; 中断管理 位于 下图 Linux 内核整体架构图 中的 内核空间 ; 四、设备管理 ---- Linux 内核 支持的外设类型...是最多的 , 设备树 PCI 总线设备 设备模型 Kobject ACPI 网络设备驱动 块设备驱动 字符设备驱动 设备管理 位于 下图 Linux 内核整体架构图 中的 内核空间 ; 五、文件系统

1.8K30

Linux 内核 内存管理】mmap 系统调用源码分析 ① ( mmap 与 mmap2 系统调用 | Linux 内核中的 mmap 系统调用源码 )

文章目录 一、mmap 与 mmap2 系统调用 二、Linux 内核中的 mmap 系统调用源码 一、mmap 与 mmap2 系统调用 ---- mmap 创建 " 内存映射 " 的 系统调用 有...者区别是 : mmap 偏移单位是 " 字节 " , mmap2 偏移单位是 " 页 " , 但是在 arm 64 体系架构中 , 没有实现 mmap2 , 只实现了 mmap 系统调用 ; 二、Linux...内核中的 mmap 系统调用源码 ---- arm64 架构体系中 , 使用 mmap 系统调用 创建 " 内存映射 " , 调用 mmap 系统调用函数 , 执行如下操作 : 先检查 " 偏移 "...是否是 " 内存页大小 " 的 " 整数倍 " , 如果偏移不是内存页大小的整数倍 , 返回 -EINVAL 错误 ; 如果偏移是内存页大小的整数倍 , 则调用 sys_mmap_pgoff 函数 ,...return sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT); } 参考路径 : linux

10.4K40

Linux内核内存管理算法Buddy和Slab

有了前两节的学习相信读者已经知道CPU所有的操作都是建立在虚拟地址上处理(这里的虚拟地址分为内核态虚拟地址和用户态虚拟地址),CPU看到的内存管理都是对page的管理,接下来我们看一下用来管理page的经典算法...为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。...这也是Buddy算法管理空闲页表的本质。 空闲内存的信息我们可以通过以下命令获取: ?...当然这对应用程序是不影响的(前面我们讲过用页表可以把不连续的物理地址在虚拟地址上连续起来),但是内核态就没有办法获取大块连续的内存(比如DMA, Camera, GPU都需要大块物理地址连续的内存)。...而当驱动需要使用时,就将进程占用的内存通过回收或者迁移的方式将之前占用的预留内存腾出来,供驱动使用。 Slab 在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存

3.4K73

Linux内核内存管理算法Buddy和Slab

有了前两节的学习相信读者已经知道CPU所有的操作都是建立在虚拟地址上处理(这里的虚拟地址分为内核态虚拟地址和用户态虚拟地址),CPU看到的内存管理都是对page的管理,接下来我们看一下用来管理page的经典算法...为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。...这也是Buddy算法管理空闲页表的本质。 空闲内存的信息我们可以通过以下命令获取: ?...当然这对应用程序是不影响的(前面我们讲过用页表可以把不连续的物理地址在虚拟地址上连续起来),但是内核态就没有办法获取大块连续的内存(比如DMA, Camera, GPU都需要大块物理地址连续的内存)。...而当驱动需要使用时,就将进程占用的内存通过回收或者迁移的方式将之前占用的预留内存腾出来,供驱动使用。 Slab 在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存

2K30

Linux 内核 内存管理内存管理架构 ② ( 用户空间内存管理 | malloc | ptmalloc | 内核空间内存管理 | sys_brk | sys_mmap | sys_munmap)

文章目录 一、用户空间内存管理 ( malloc / free / ptmalloc / jemalloc / tcmalloc ) 二、内核空间内存管理 1、内核内存管理系统调用 ( sys_brk...函数提供 内存操作接口 ; glibc 库提供的 ptmalloc 函数 的原理是 , 调用 Linux 内核 提供的 brk / mmap 系统调用接口 , 以 " 内存页 “ 为单位 , 申请内存..., 然后将申请的内存 分成 ” 内存块 “ 分配给 用户空间 的 ” 应用程序 " 二、内核空间内存管理 ---- 1、内核内存管理系统调用 ( sys_brk | sys_mmap | sys_munmap...) 在 " 内核空间 " 中 , 调用 Linux 内核中的 sys_brk / sys_mmap / sys_munmap 函数 , 管理 " 堆内存 " ; sys_brk 通过修改 堆内存 的..., 虚拟内存管理 从 ” 进程虚拟地址空间 “ 分配 / 释放 ” 虚拟内存页 " ; 2、sys_brk、sys_mmap 系统调用 可参考 【Linux 内核 内存管理Linux 内核内存管理

90410

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.3K31
领券