从底层原理出发,了解Linux内核之内存管理

Linux内核之 内存管理 前面几篇介绍了进程的一些知识,从这篇开始介绍内存、文件、IO等知识,发现更不好写哈哈。但还是有必要记录下自己的所学所思。供后续翻阅,同时写作也是一个巩固的过程。 这些知识以前有文档涉及过,但是角度不同,这个系列站的角度更底层,基本都是从Linux内核出发,会更深入。所以当你都读完,然后再次审视这些功能的实现和设计时,我相信你会有种豁然开朗的感觉。 1、页 内核把物理页作为内存管理的基本单元。 尽管处理器的最小处理单位是字(或者字节),但是MMU(内存管理单元,管理内存并把虚拟地址转换为物理地址的硬件)通常以 阅读详情

本文讲解更加底层,基本都是从Linux内核出发,会更深入。所以当你都读完,然后再次审视这些功能的实现和设计时,我相信你会有种豁然开朗的感觉。 

1、页

内核把物理页作为内存管理的基本单元。

尽管处理器的最小处理单位是字(或者字节),但是MMU(内存管理单元,管理内存并把虚拟地址转换为物理地址的硬件)通常以页为单位进行处理。所以从虚拟内存看,页也是最小单元。

体系不同,支持的页大小不同。大多数32位体系结构支持4KB的页,而64位体系结构一般会支持8KB的页。

内核用struct page结构体表示系统中的每个页,包含很多项比如页的状态(有没有脏,有没有被锁定)、引用计数(-1表示没有使用)等等。

page结构和物理页相关,和虚拟内存无关。所以它的描述是短暂的,仅仅记录当前的使用状况,当然也不会描述其中的数据。

内核用这个结构来管理系统中所有的页,所以内核知道哪些页是空闲的,如果在使用中拥有者又是谁。

这个拥有者有四种:用户空间进程、动态分配内存的内核数据、静态内核代码以及页高速缓存。

 2、区

有些页是有特定用途的。比如内存中有些页是专门用于DMA的。

内核使用区的概念将具有相似特性的页进行分组。区是一种逻辑上的分组的概念,而没有物理上的意义。

区的实际使用和分布是与体系结构相关的。在x86体系结构中主要分为3个区:ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM。

ZONE_DMA区中的页用来进行DMA(直接内存访问)时使用。

ZONE_HIGHMEM是高端内存,其中的页不能永久的映射到内核地址空间,也就是说,没有虚拟地址。

剩余的内存就属于ZONE_NORMAL区,叫低端内存。

不是所有体系都定义全部区,有些体系结构,比如x86-64可以映射和处理64位的内存空间,所以它没有ZONE_HIGHMEM区,所有的物理内存都都处于ZONE_DMA和ZONE_NORMAL区。

每个区都用结构体struct zone表示。

彻底掌握Linux内核内存管理,学习知识点内容:

第一天 剖析Linux内核内存管理(一)
1.1 内存泄漏/栈溢出
1.2 虚拟地址布局/内存映射
1.3 内存模型/页分配器
1.4 伙伴分配器/块分配器

第二天 剖析Linux内核内存管理(二)
2.1 kmalloc/vmalloc系统调用
2.2 高速缓存/内存屏障
2.3 页表缓存/页回收机制
2.4 缺页中断/反碎片技术

Linux内核内存管理直播训练营地址:Linux内核内存管理专题训练营-学习视频

 

3、接口

获得页

获得页使用的接口是alloc_pages函数与__get_free_page函数。后者也是调用了前者,只不过在获得了struct page结构体后使用page_address函数获得了虚拟地址。

我们在使用这些接口获取页的时候可能会面对一个问题,我们获得的这些页若是给用户态用,虽然这些页中的数据都是随机产生的垃圾数据,不过,虽然概率很低,但是也有可能会包含某些敏感信息。所以,更谨慎些,我们可以将获得的页都填充为0。这会用到get_zeroed_page函数。而这个函数又用到了__get_free_pages函数。

所以这三个函数最终都是使用了alloc_pages函数。

释放页

当我们不再需要某些页时可以使用下面的函数释放它们:
__free_pages(struct page *page, unsigned int order)
free_pages(unsigned long addr, unsigned int order)
free_page(unsigned long addr)

以上这些接口都是以页为单位进行内存分配与释放的。

kmalloc与vmalloc

在实际中内核需要的内存不一定是整个页,可能只是以字节为单位的一片区域。这两个函数就是实现这样的目的。

不同之处在于,kmalloc分配的是虚拟地址连续,物理地址也连续的一片区域,vmalloc分配的是虚拟地址连续,物理地址不一定连续的一片区域。

对应的释放内存的函数是kfree与vfree。

4、slab层

以页为最小单位分配内存对于内核管理系统中的物理内存来说的确比较方便,但内核自身最常使用的内存却往往是很小的内存块——比如存放文件描述符、进程描述符、虚拟内存区域描述符等行为所需的内存都远不及一页,一个整页中可以聚集多个这些小块内存。

为了满足内核对这种小内存块的需要,Linux系统采用了一种被称为slab分配器(也称作slab层)的技术。slab分配器的实现相当复杂,但原理不难,其核心思想就是“存储池”的运用。内存片段

Linux内核架构和基础概念 随着Linux内核在全球市场份额的持续扩大,其影响力已深深渗透至各行各业,尤其在服务器领域乃至我们所熟知的前沿行业,更是彰显出无可匹敌的重要性。因此,本系列文章旨在系统性地记录我深入探索与学习Linux内核过程中的心得体会与关键笔记。本文主要是描述一下内核学习过程中的一些常用的概念,宏内核和微内核,内核架构等等。 阅读详情

相关推荐

Linux内核源码分析之内存管理

本文站的角度更底层,基本都是从Linux内核出发,会更深入。所以当你都读完,然后再次审视这些功能的实现和设计时,我相信你会有种豁然开朗的感觉。 1、页 内核把物理页作为内存管理的基本单元。 尽管处理器的最小处理单位是字(或者字节),但是MMU(内存管理单元,管理内存并把虚拟地址转换为物理地址的硬件)通常以页为单位进行处理。所以从虚拟内存看,页也是最小单元。 体系不同,支持的页大小不同。大多数32位体系结构支持4KB的页,而64位体系结构一般会支持8KB的页。 内核用struct page结构体表示

Linuxhus的博客 820

Linux内核原理与作用分析

Linux内核是现代操作系统的核心部分,是系统运行与运作系统资源管理的核心。这篇文章将分析Linux内核的基础原理和作用,包括其主要构件,为何选择Linux内核作为一个优秀的平台,以及过程中的历史变迁。通过图示说明内核的构造,并依据经典书籍带来对其原理的进一步解析。Linux内核自1991年Linus Torvalds发布第一版以来,就带来了一场操作系统无声革命。相比于传统的商用操作系统,Linux的开源、可提供的高度调适性与可扩展性使它在中层应用中头角实称。

pengdott的专栏 1283

linux内核那些事之brk机制

内核向用户层提供申请用户虚拟空间的两种机制除了mmap之外,另外一个就是brk机制,mmap主要控制虚拟空间mmap区域管理,而brk机制主要管理的是一个进行的堆空间。 brk/sbrk brk 和sbrk是内核向用户提供的两个用于申请堆空间的系统调用,一般应用程序并不直接使用brk系统调用,而是通过glibc封装好的malloc接口间接调用brk系统调用。 #include <unistd.h> int brk(void *addr); void *sbrk(intptr_t in

weixin_42730667的博客 5868

C# : 计算并输出这一天是这一年的第几天

C#之输入某年,然后输入某月,再输入某日,计算并输出这一天是这一年的第几天的功能算法

saitoDeng的博客 973

ARTIX-7 GTP 3G-SDI 工程构建与调试实战

本文详细介绍了基于ARTIX-7 FPGA和GTP收发器的3G-SDI工程构建与调试实战。从基础概念解析到Vivado工程创建、GTP IP核配置、SDI IP核集成,再到系统集成与时钟域处理,提供了全面的技术指导。文章还分享了调试技巧、常见问题排查方法以及性能验证步骤,帮助开发者快速掌握3G-SDI视频传输技术的实现与优化。

weixin_30443813的博客 256

基于Gardner环的QPSK定时同步MATLAB仿真:四倍采样与多场景性能分析

本文详细介绍了基于Gardner环的QPSK定时同步MATLAB仿真方法,重点分析了四倍采样技术在定时同步中的应用与性能优化。通过MATLAB代码实例展示了Gardner环的实现原理、多场景性能分析及常见问题解决方案,为数字通信系统的定时同步设计提供实用参考。

weixin_29083475的博客 374

从.har文件到Postman集合:一键转换的完整教程(附避坑指南)

本文详细介绍了如何将.har文件高效转换为Postman集合的完整教程,涵盖基础操作到高级技巧,包括认证信息处理、环境变量提取等痛点问题的解决方案。通过抓包工具记录的.har文件,开发者可以快速生成Postman集合,提升API调试与测试效率,特别适合前后端分离开发模式下的团队协作。

weixin_26795617的博客 384

糖尿病预测(深度学习pytorch实现-最新)

本次做的项目是糖尿病的预测,也是来自kaggle上面的一个小项目。根据一个人的怀孕次数、血糖、血压、皮肤厚度、胰岛素指标、身体质量指数、糖尿病谱系指数、年龄等身体参数来预测一个人是否患有糖尿病。

NangoGreen的博客 5360

永磁同步电机矢量控制——电流内环前馈解耦策略

在采用永磁同步电机矢量控制时,ud和uq的指令值存在耦合项。需要对其进行解耦,目前,常用的解耦设计方法有前馈解耦、偏差解耦以及内模控制,本文主要分享电流内环前馈解耦控制策略。

a12312341ll的博客 8699

YOLOv8交通管理 详细解释及代码完整示例

YOLOv8在交通管理中的应用及代码实现 摘要:本文详细介绍了YOLOv8在交通管理领域的应用场景,包括车辆检测、违规行为识别和行人安全预警等。文章提供了完整的Python代码示例,展示了如何使用YOLOv8进行交通对象检测和车辆计数统计。代码包含模型加载、对象检测、结果可视化等功能模块,并给出了性能优化和功能扩展建议。该实现基于Ultralytics框架,支持多种YOLOv8模型选择,可根据实际需求调整模型大小和检测参数。

u010117029的博客 153

图像质量评估和点云质量评估

本文介绍了图像质量评估和点云质量评估的基本概念和常用方法,并提供了相应的源代码示例。图像质量评估关注图像的视觉质量,常用的评估指标包括均方误差(MSE)、结构相似性指标(SSIM)和峰值信噪比(PSNR)。点云质量评估关注点云数据的准确性和完整性,常用的评估方法包括点云配准质量评估、稠密重建质量评估和离群点检测质量评估。在计算机视觉和计算机图形学领域中,图像质量评估和点云质量评估是两个重要的任务。图像质量评估旨在量化图像的视觉质量,而点云质量评估则关注于点云数据的准确性和完整性。

XsupDatabase的博客 992

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: 内存泄漏的3个解决方案与原理实现,掌握一个轻松应对开发丨内存池|mtrace||API实现|框架封装|中间件|异步请求|连接池
下一篇: 图解 epoll 是如何工作的及epoll实现原理
Linux服务器开发
博客等级 码龄7年 610粉丝 589原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值