聊聊 Linux 内核
文章平均质量分 97
一起探秘 Linux 内核
bin的技术小屋
专注源码解析系列原创技术文章,分享自己的技术感悟
展开
-
MappedByteBuffer VS FileChannel:从内核层面对比两者的性能差异
本文基于 Linux 内核 5.4 版本进行讨论自上篇文章发布之后,很多读者朋友私信我说,文章的信息量太大了,其中很多章节介绍的内容都是大家非常想要了解,并且是频繁被搜索的内容,所以根据读者朋友的建议,笔者决定将一些重要的章节内容独立出来,更好的方便大家检索。原创 2024-03-28 12:43:40 · 1104 阅读 · 0 评论 -
从 Linux 内核角度探秘 JDK MappedByteBuffer
在之前的文章《一步一图带你深入剖析 JDK NIO ByteBuffer 在不同字节序下的设计与实现》 中,笔者为大家详细剖析了 JDK Buffer 的整个设计体系,从总体上来讲,JDK NIO 为每一种 Java 基本类型定义了对应的 Buffer 类(boolean 类型除外)。而 Buffer 本质上其实是 JDK 对 OS 中某一段内存在 Java 语言层面上的封装,当然了,这里的内存指的是虚拟内存,我们需要从之前文章中的内核空间视角切换到用户空间上来,所以本文提到的内存如无特殊说明均是指虚拟原创 2024-03-19 19:21:45 · 745 阅读 · 1 评论 -
一文聊透 Linux 缺页异常的处理 —— 图解 Page Faults
在前面两篇介绍 mmap 的文章中,笔者分别从原理角度以及源码实现角度带着大家深入到内核世界深度揭秘了 mmap 内存映射的本质。从整个 mmap 映射的过程可以看出,内核只是在进程的虚拟地址空间中寻找出一段空闲的虚拟内存区域 vma 然后分配给本次映射而已。如果是文件映射的话,内核还会额外做一项工作,就是将分配出来的这段虚拟内存区域 vma 与映射文件关联映射起来。映射的核心就是将虚拟内存区域 vm_area_struct 相关的内存操作 设置为文件系统的相关操作 。这样一来,进程后续对这段虚拟内存原创 2023-12-23 11:51:47 · 1896 阅读 · 2 评论 -
从内核世界透视 mmap 内存映射的本质(源码实现篇)
到现在为止,笔者通过两篇文章,一篇原理,一篇源码,深入到内核世界中,将 mmap 内存映射的本质给大家呈现了出来,知识点比较密集且比较烧脑,因此笔者又画了一副 mmap 内存映射的整体思维导图方便大家回顾。在原理篇中笔者首先通过五个角度为大家详细介绍了 mmap 的使用方法及其在内核中的实现原理,这五个角度分别是:私有匿名映射,其主要用于进程申请虚拟内存,以及初始化进程虚拟内存空间中的 BSS 段,堆,栈这些虚拟内存区域。原创 2023-10-10 11:29:10 · 431 阅读 · 1 评论 -
从内核世界透视 mmap 内存映射的本质(原理篇)
本文笔者从五个角度为大家详细介绍了 mmap 的使用方法及其在内核中的实现原理,这五个角度分别是:私有匿名映射,其主要用于进程申请虚拟内存,以及初始化进程虚拟内存空间中的 BSS 段,堆,栈这些虚拟内存区域。私有文件映射,其核心特点是背后映射的文件页在多进程之间是读共享的,多个进程对各自虚拟内存区的修改只能反应到各自对应的文件页上,而且各自的修改在进程之间是互不可见的,最重要的一点是这些修改均不会回写到磁盘文件中。原创 2023-09-18 18:33:10 · 496 阅读 · 0 评论 -
一步一图带你构建 Linux 页表体系 —— 详解虚拟内存如何与物理内存进行映射
本文笔者通过页表体系这条主线脉络,为大家串讲了一下之前介绍的虚拟内存管理以及物理内存管理的相关内容,在我们回顾完虚拟内存管理和物理内存管理之后,随后我们引出了虚拟内存如何与物理内存进行映射这个问题,并在这个过程中为大家揭露了页表的本质。在我们清楚了页表的本质之后,笔者又沿着页表体系的演进这条主线,对单级页表,二级页表,四级页表展开了介绍,其中花了一定的篇幅为大家详细的介绍了 32 位和 64 位页表项以及页目录想的比特位布局,让大家真真实实的看到了页表项和页目录项到底长什么样子。原创 2023-07-21 17:11:12 · 1273 阅读 · 1 评论 -
深度解读 Linux 内核级通用内存池 —— kmalloc 体系
整个 kmalloc 通用内存池体系的核心是围绕着 kmalloc_caches 这个二维数组召开的。其中一维数组中定义的是 kmalloc 内存池中的内存来源,在内核中使用。原创 2023-06-21 11:35:54 · 838 阅读 · 0 评论 -
深度解析 slab 内存池回收内存以及销毁全流程
整个 slab cache 系列篇幅非常庞大,涉及到的细节非常丰富,为了方便大家回顾,笔者这里将 slab cache 系列涉及到的重点内容再次梳理总结一下。原创 2023-05-26 11:44:06 · 430 阅读 · 5 评论 -
深入理解 slab cache 内存分配全链路实现
本文我们基于 slab cache 的完整的架构,近一步深入到内核源码中详细介绍了 slab cache 关于内存分配的完整流程:我们可以看到 slab cache 内存分配的整个流程分为 fastpath 快速路径和 slowpath 慢速路径。其中在 fastpath 路径下,内核会直接从 slab cache 的本地 cpu 缓存中获取内存块,这是最快的一种方式。从本地 cpu 缓存 partial 列表中分配从 NUMA 节点缓存中分配,其中涉及到了对本地 cpu 缓存的填充。原创 2023-05-05 11:50:14 · 301 阅读 · 0 评论 -
从内核源码看 slab 内存池的创建初始化流程
本文笔者基于内核 5.4 版本,从源码角度详细讨论了 slab cache 的创建初始化过程,创建流程如下图所示:经过该流程的创建之后,我们得到了如下图所示的 slab cache 架构:在这个过程中,笔者又近一步从源码角度介绍了内核具体是如何对 slab 对象进行内存布局的。在这个内存布局的基础上,笔者又近一步展开了内核如何计算一个 slab 到底需要多少个物理内存页,以及一个 slab 到底能够容纳多少内存块的相关逻辑。原创 2023-04-12 10:22:52 · 347 阅读 · 2 评论 -
细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现
本文在伙伴系统的基础上又为大家详细介绍了一款内核专门应对小内存块管理的 slab 内存池,并列举了 slab 内存池在内核中的几种应用场景。原创 2023-04-05 11:33:56 · 611 阅读 · 0 评论 -
深度剖析 Linux 伙伴系统的设计与实现
我们前面一直在谈伙伴系统,那么伙伴这个概念到底在内核中是什么意思呢?其实下面这张伙伴系统的结构图已经把伙伴的概念很清晰的表达出来了。伙伴在我们日常生活中含义就是形影不离的好朋友,在内核中也是如此,内核中的伙伴指的是大小相同并且在物理内存上是连续的两个或者多个 page。比如在上图中,free_area[1] 中组织的是分配阶 order = 1 的内存块,内存块中包含了两个连续的空闲 page。这两个空闲 page 就是伙伴。原创 2023-02-04 09:17:26 · 608 阅读 · 3 评论 -
深入理解 Linux 物理内存分配全链路实现
本文首先从 Linux 内核中常见的几个物理内存分配接口开始,介绍了这些内存分配接口的各自的使用场景,以及接口函数中参数的含义。并以此为起点,结合 Linux 内核 5.19 版本源码详细讨论了物理内存分配在内核中的整个链路实现。在整个链路中,内存的分配整体分为了两个路径:快速路径 fast path:该路径的下,内存分配的逻辑比较简单,主要是在 WMARK_LOW 水位线之上快速的扫描一下各个内存区域中是否有足够的空闲内存能够满足本次内存分配,如果有则立马从伙伴系统中申请,如果没有立即返回。原创 2023-01-02 12:33:44 · 661 阅读 · 3 评论 -
一步一图带你深入理解 Linux 物理内存管理
图解 Linux 物理内存管理原创 2022-11-22 12:27:50 · 912 阅读 · 7 评论 -
一步一图带你深入理解 Linux 虚拟内存管理
图解 Linux 虚拟内存管理原创 2022-10-25 13:22:08 · 1256 阅读 · 16 评论 -
从 Linux 内核角度探秘 JDK NIO 文件读写本质
带你彻底打通 Linux 文件 IO 相关的知识系统脉络原创 2022-09-06 19:05:46 · 435 阅读 · 0 评论