0%

这是<Linux内核内存管理>系列的第八篇:

第一篇为内核内存管理过程知识点的的简单梳理

第二篇介绍了内核的数据结构

第三篇介绍了从内核第一行代码加载到跳转到C代码前的内存处理。

第四篇概览了初始化C代码中的内存处理

第五篇(上)第五篇(下)介绍了Memblock和伙伴系统分配器

第六篇介绍了内存检测工具KFence工作原理

第七篇介绍了进程内存分配malloc的原理

Read more »

这是<Linux内核内存管理>系列的第七篇:

第一篇为内核内存管理过程知识点的的简单梳理

第二篇介绍了内核的数据结构

第三篇介绍了从内核第一行代码加载到跳转到C代码前的内存处理。

第四篇概览了初始化C代码中的内存处理

第五篇(上)第五篇(下)介绍了Memblock和伙伴系统分配器

第六篇介绍了内存检测工具KFence工作原理

Read more »

注意:这只是一个Work Around方法,并非完全解决方案

背景

MAC升级Big Sur后,每次运行Virtual Box都会有如下报错:

1
2
3
4
5
Kernel driver not installed (rc=-1908)

Make sure the kernel module has been loaded successfully.

where: suplibOsInit what: 3 VERR_VM_DRIVER_NOT_INSTALLED (-1908) - The support driver is not installed. On linux, open returned ENOENT.
Read more »

这是<Linux内核内存管理>系列的第六篇

第一篇为内核内存管理过程知识点的的简单梳理

第二篇介绍了内核的数据结构

第三篇介绍了从内核第一行代码加载到跳转到C代码前的内存处理。

第四篇概览了初始化C代码中的内存处理

第五篇(上)第五篇(下)介绍了Memblock和伙伴系统分配器

前言

Read more »

前言

PlantUML可以算是最成功最知名的开源绘图工具了,它可以方便地将您输入文字型描述,转化成您想要的各种图(当然,要遵循其语法)。近日,在做流程图的时候,到网站上去翻语法,赫然发现其增加了一个新的主题功能。

用法

用法也很简单, 在文件头部增加如下配置即可:

1
!theme 主题名

例如,如下图采用内置的spacelab主题:

Read more »

这是<Linux内核内存管理>系列的第六篇

第一篇为内核内存管理过程知识点的的简单梳理

第二篇介绍了内核的数据结构

第三篇介绍了从内核第一行代码加载到跳转到C代码前的内存处理。

第四篇概览了初始化C代码中的内存处理

第五篇(上)第五篇(下)介绍了Memblock和伙伴系统分配器

为了避免晦涩难懂,本文及之后均主要使用图表+文字描述,尽量避免涉及过多代码。专注点会在:

  1. 背景
  2. 架构及其思想
  3. 流程
  4. 特殊处理及其原因
Read more »

书接前文,本文介绍《Memblock和Buddy System》的第二篇,第一篇见前文

伙伴系统

Mem Block向Buddy System过渡

伙伴系统便是使用页为单位对内存进行管理的方法。伙伴系统接管前,处理建立mem_section结构,也必须先从Mem Block中释放出不再使用的内存交给伙伴系统管理。本文Figure 2中略有体现,实现这个过渡的函数是memblock_free_all:

Read more »

这是<Linux内核内存管理>系列的第四篇

第一篇为内核内存管理过程知识点的的简单梳理

第二篇介绍了内核的数据结构

第三篇介绍了从内核第一行代码加载到跳转到C代码前的内存处理。

第四篇概览了初始化C代码中的内存处理

概述

参考内核文档,系统初始化早期是不能使用我们常用的 kmallocvmalloc 等函数,这是因为此时对应的功能还没初始化好。

Read more »

这是<Linux内核内存管理>系列的第四篇

第一篇为内核内存管理过程知识点的的简单梳理

第二篇介绍了内核的数据结构

第三篇介绍了从内核第一行代码加载到跳转到C代码前的内存处理。

x86_64体系结构C代码处理

前文我们从汇编代码跳转到了x86_64_start_kernel,该函数代码如下:

Read more »

内存管理是Linux内核最为复杂且最为重要的部分,本文从原理及代码角度对Linux内存管理机制进行分析。

内存的划分

Linux将内存从大到小依次划分为Node(节点)->Zone(内存域)->Page(页):

  • 节点:在大型结算及系统中,内存有不同的簇,依据对处理器距离的不同,访问这些簇有不同的代价。而这些簇就可以成为节点。例:在PC系统中可以理解为实际挂载的物理内存;在嵌入式系统中,有两块内存芯片A和B,分别代表一个节点。
  • 内存域:内存域并不是物理存在的概念,是Linux系统对每个内存节点进行管理的单位,每个节点的内存域表示的是对该节点不同地址范围的划分。一般内存域有三种,分别为Normal、DMA和HighMem。
  • 页:在每个内存域中,内存被划分为大小固定的块(32位系统一般为4K大小),为内核进行内存分配的基本单位(当然内核内存管理机制其实更为复杂,“基本单位”不代表每次分配内存最小就要分到4K。后边可以看到,当需要获取小于4K大小的内存时,内核有Slab分配器来满足要求)
Read more »