Linux内核学习(八)—— 内存管理(基于Linux 2.6内核)

news2024/11/26 0:29:44

目录

一、页(page)

二、区(zone)

三、页操作

四、kmalloc()

五、vmalloc() 

六、slab 分配器

七、在栈上的静态分配


一、页(page)

内核把物理页作为内存管理的基本单位。尽管处理器的最小可寻        址单位通常为字或字节,但是,内存管理单元(MMU,管理内存并把虚拟地址转换为物理地址的硬件)通常以页为单位进行处理。MMU 以页为单位来管理系统中的页表。从虚拟内存的角度来看,页就是最小单位。

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

内核用 struct page 结构表示系统中的每个物理页,位于 <linux/mm_types.h> 中,定义如下:

  • flags 用来存放页的状态,比如页是否是脏的(内存数据页和磁盘数据页内容不一致),是不是被锁定在内存中等。flags 每一位都可以表示一种状态,状态标志定义在 <linux/page-flags.h> 中。
  • _count 存放页的引用计数,也就是这一页被引用了多少次。当计数值为 -1 时,就说明当前内核并没有引用这一页,在新的分配中就可以使用它。内核代码不应该直接查看这个参数,而是调用 page_count() 函数进行检查,传入 page 结构,返回 0 表示空闲。
  • virtual 存放页的虚拟地址。 通常情况下,它就是页在虚拟内存中的地址。但有些内存(高端内存)并不永久地映射到内核地址空间上。这种情况下 virtual 的值为 NULL。

page 结构与物理页相关,而并非与虚拟页相关。内核用这一结构来管理系统中所有的页,因为内核需要知道一个页是否空闲。一个页的拥有者可能是用户空间进程、动态分配的内核数据、静态内核代码或页高速缓存。

二、区(zone)

由于硬件的限制,有些页位于内存中的特定的物理地址上,所以不能将其用于一些特定的任务,于是内核把页划分为不同的区(zone) ,由此对具有相似特性的页进行分组。Linux 必须处理如下两种由于硬件存在缺陷而引起的内存寻址问题:

  • 一些硬件只能用某些特定的内存地址来执行 DMA(直接内存访问)。
  • 一些体系结构的内存的物理地址寻址范围比虚拟寻址范围大得多,这样就有一些内存不能永久地映射到内核空间上。

因此,Linux 划分了四种区:

  • ZONE_DMA:这个区包含的页能用来执行 DMA 操作。
  • ZONE_DMA32:这个区包含的页能用来执行 DMA 操作,但这些页面只能被 32 位设备访问。
  • ZONE_NORMAL:这个区包含的都是能正常映射的页。
  • ZONE_HIGHEM:这个区包含高端内存(high memory),其中的页并不能永久地映射到内核地址空间。系统内其余内存就是所谓的低端内存(low memory)。

Linux 把系统的页划分为分区,形成不同的内存池,这样就可以根据用途进行分配了。区是内存为了管理页而采取的一种逻辑上的分组。

三、页操作

内核提供了几种请求页的接口,所有接口都以页为单位分配内存,定义于 <linux/gfp.h> 中,最核心的是:

struct page *alloc_pages(gfp_t gfp_mask, unsigned int order)

该函数分配 2^{order} 个连续的物理页,并返回一个指针,指向第一个页的 page 结构体。出错则返回 NULL。

可以用下面这个函数把给定的页的 page 转换成它的逻辑地址:

void *page_address(struct page *page)

该函数返回一个指针,指向给定物理页当前所在的逻辑地址。

当你不在需要页时可以用下面的函数释放它们:

void __free_pages(struct page *page, unsigned int order)
void free_pages(unsigned long addr, unsigned int order)
void free_page(unsigned long addr)

四、kmalloc()

kmalloc() 函数与用户空间的 malloc() 类似,不过它多了一个 flags 参数,这个函数可以获得以字节为单位的一块内核内存。其在 <linux/slab.h> 中声明:

void *kmalloc(size_t size, gfp_t flags)

这个函数返回一个指向 size 大小的内存块指针,并且所分配的内存区在物理地址上是连续的(虚拟地址自然也是连续的)。出错时则返回 NULL。

使用 kfree() 函数可以释放由 kmalloc() 分配出来的内存块:

void kfree(const void *ptr)

如果想要释放的内存不是由 kmalloc() 分配的,或者想要释放的内存早就被释放了,调用这个函数就会有很严重的后果。

五、vmalloc() 

vmalloc() 函数类似于 kmalloc(),但是 vmalloc() 函数分配的内存虚拟地址是连续的,而物理地址则无需连续。malloc() 函数也一样,其在虚拟地址空间内是连续的,但是并不保证它们在物理 RAM 中也是连续的。

void *vmalloc(unsigned long size)
void vfree(const void *addr)

大多数情况下,只有硬件设备用到的内存区必须是物理上连续的块。而供软件使用的内存块就可以使用只有虚拟地址连续的内存块。

六、slab 分配器

分配和释放数据结构是所有内核中最普遍的操作之一,空闲链表包含可供使用的、已分配好的数据结构块,当代码需要一个新的数据结构实例时,就可以从空闲链表中抓取一个,而不需要重新分配内存。空闲链表相当于对象高速缓存,可以快速存储频繁使用的对象类型。

但空闲链表无法全局控制,当可用内存紧缺时,内核无法通知每个空闲链表,让其释放一些内存。所以为了弥补这一缺陷,Linux 内核提供了 slab 层(slab 分配器)slab 分配器扮演了通用数据结构缓存层的角色

  • 下面是 slab 分配器的基本原则:
  • 频繁使用的数据结构应该缓存它们。
  • 频繁分配和回收会导致内存碎片化,为了避免这种情况,空闲链表的缓存会连续地存放,释放的数据结构又会放回空闲链表。
  • 回收的对象可以立即投入下一次分配。
  • 对存放对象进行着色(color),以防止多个对象映射到相同的高速缓存行(cache line)。

slab 分配器把不同的对象划分为不同的高速缓存组,每个高速缓存组都存放不同类型的对象。比如,一个高速缓存用于存放进程描述符(task_struct 结构的一个空闲链表),一个用于存放索引节点对象(struct inode)。

然后,这些高速缓存又被划分为多个 slab,slab由一个或多个物理上连续的页组成。每个 slab 都包含一些被缓存的数据结构,并且每个 slab 都处于三种状态之一:满、部分满或空(注意这里满的意思是所有的数据结构都被使用中,无法分配)。当内核的某一部分需要一个新的对象时,先从部分满的 slab 中进行分配,其次再从空的 slab 中进行分配,如果没有空的 slab,那么就需要创建一个新 slab了。

下面是三者之间的关系:

slab 负责内存紧缺情况下所有底层的对齐、着色、分配、释放和回收,如果要频繁的创建很多相同类型的对象,那么就应该考虑使用 slab 高速缓存。

七、在栈上的静态分配

用户空间能负担起非常大的栈,而且栈空间还能动态增长,但内核却不能这么奢侈,内核栈小而且固定。当给每个进程分配一个固定大小的栈后,不但可以减小内存的消耗,而且内核也无需负担太重的栈管理任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/922653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Crontab定时任务运行Docker容器(Ubuntu 20)

对于一些离线预测任务&#xff0c;或者D1天的预测任务&#xff0c;可以简单地采用Crontab做定时调用项目代码运行项目 Crontab简介&#xff1a; Linux crontab命令常见于Unix和类Unix的操作系统之中&#xff0c;用于设置周期性被执行的指令。该命令从标准输入设备读取指令&…

微信通过好友自动回复怎么设置?微信怎么设置自动回复?

当通过了很多客户之后&#xff0c;员工没有办法及时的给每位客户发送欢迎消息&#xff0c;并且发送欢迎消息时也是由员工一个一个去发送给客户&#xff0c;这样既浪费了大量的时间&#xff0c;又给员工增加工作负担&#xff0c;降低工作效率。 我们可以设置自动发欢迎语&#…

小猫爪:嵌入式小知识16-XCP协议简介

小猫爪&#xff1a;嵌入式小知识16-XCP协议简介 0 目录1 前言2 XCP协议简介2.1 各种包2.1 CMD2.2 RES2.3 ERR2.4 EV2.5 SERV2.6 DAQ2.7 STIM2.8 总结 2.2 错误处理2.2.1 Time-out Error Handling2.2.2 Error Code Error Handling END 0 目录 小猫爪&#xff1a;嵌入式小知识15…

More Effective C++学习笔记(4)

目录 条款16&#xff1a;谨记 80 - 20 法则条款17&#xff1a;考虑使用lazy evaluation&#xff08;缓式评估&#xff09;条款18&#xff1a;分期摊还预期的计算成本条款19&#xff1a;了解临时对象来源条款20&#xff1a;协助完成 “ 返回值优化 ”条款21&#xff1a;利用重载…

余压监控在建筑加压送风系统中的应用

安科瑞 华楠 摘 要&#xff1a;从风量、风管和风口的设计、防烟部位正压控制方式等角度&#xff0c;分析了加压送风系统设计中需要注意的几点问题&#xff1a;风量的确定需合理有据&#xff1b;楼梯间风管和风口的设计需考虑均匀送风要求&#xff0c;前室风口设计确保不同楼层…

【地理图库】晨昏线示意图

声明&#xff1a;本资料整理&#xff0c;仅供学习&#xff01;

JNPF快速开发平台:释放您的创造力,加速企业数字化转型

一、前言 在当今的数字化时代&#xff0c;企业需要快速响应市场变化&#xff0c;不断迭代和优化业务流程&#xff0c;以保持竞争力。然而&#xff0c;传统软件开发方式往往无法满足企业对于快速开发和灵活部署的需求。JNPF快速开发平台旨在解决这一问题&#xff0c;为企业提供高…

CCF HPC China2023 | 盛大开幕,邀您关注澎峰科技

2023年8月24日&#xff0c;以“算力互联智领未来”为主题的第十九届全国高性能计算学术年会&#xff08;CCF HPC China 2023&#xff09;在青岛红岛国际会议展览中心拉开帷幕。特邀嘉宾涵盖行业大咖&#xff0c;主持阵容同样是“重量级”——来自国家并行计算机工程技术研究中心…

如何快速打造线上展厅?线上展厅可以用在哪些行业?

引言&#xff1a; 随着科技的迅速发展&#xff0c;线上展厅作为一种创新的营销方式&#xff0c;正逐渐引领着不同行业的营销风潮。线上展厅以其独特的虚拟体验&#xff0c;为企业搭建了一个无界限的展示平台&#xff0c;让用户能够在虚拟空间中感受产品、服务与品牌文化。 一…

Java对象的初始化顺序

对象的初始化顺序(父类永远在子类前面&#xff0c;属性和方法谁写在上边谁先执行)&#xff1a; 静态(只执行一次)--->非静态--->构造方法 静态成员和static块-->普通成员和非static块-->构造函数。 存在继承&#xff1a; 父类静态成员和static块-->子类静态成…

Resnet模型详解

1、Resnet是什么&#xff1f; Resnet是一种深度神经网络架构&#xff0c;被广泛用于计算机视觉任务&#xff0c;特别是图像分类。它是由微软研究院的研究员于2015年提出的&#xff0c;是深度学习领域的重要里程碑之一。 2、网络退化问题 理论上来讲&#xff0c;随着网络的层…

干货分享:可证明安全的隐私计算

“隐语”是开源的可信隐私计算框架&#xff0c;内置 MPC、TEE、同态等多种密态计算虚拟设备供灵活选择&#xff0c;提供丰富的联邦学习算法和差分隐私机制 开源项目&#xff1a;github.com/secretflowgitee.com/secretflow 以下文章来源于DataFunTalk &#xff0c;作者洪澄 D…

【实训项目】易行APP设计(c2c二手交易平台)

1.设计摘要 1.1市场背景 随着经济的迅速发展与科技日新月异的进步&#xff0c;家庭内的各项物品更新换代频率越来越快&#xff0c;人们购买新商品后越来越多旧的商品积压需要处理&#xff1b;在互联网电商的各种营销刺激下&#xff0c;消费者非常容易形成“冲动”消费&#x…

【Spring】一次性打包学透 Spring | 阿Q送书第五期

文章目录 如何竭尽可能确保大家学透Spring1. 内容全面且细致2. 主题实用且本土化3. 案例系统且完善4. 知识有趣且深刻 关于作者丁雪丰业内专家推图书热卖留言提前获赠书 不知从何时开始&#xff0c;Spring 这个词开始频繁地出现在 Java 服务端开发者的日常工作中&#xff0c;很…

leetcode:只出现一次的数字Ⅲ(详解)

题目&#xff1a; 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。 示例 1&…

没消费?复购难?不如试试即拼七人拼团模式

在当今的社会环境下&#xff0c;快消品、大健康、美容等行业一直是人们生活中不可或缺的一部分。它们各具特色&#xff0c;不断满足大众的需求&#xff0c;因此受到广泛欢迎。但由于市场品种繁多、竞争激烈&#xff0c;消费者的选择也变得更加多样化。为了提高各行业的竞争性&a…

EPS导出为带cass属性的dwg文件

1、在EPS软件中打开一幅画好的地形图&#xff0c;如下&#xff1a; 2、点击菜单栏里面的工具--运行脚本--数据转换--cass10.具体操作如下&#xff1a; 3、设置输出模式&#xff0c;具体如下图。 4、输出结果如下&#xff0c;在cass中打开输出的dwg文件&#xff0c;结果如下&…

多核异构核间通信Mailbox vs rpmsg

目录 一、关键术语解释 二、Mailbox与rpmsg对比 三、rpmsg传输流程 异构核间数据通过共享内存实现数据传递&#xff0c;通过中断来触发发送、接收。 一、关键术语解释 IPC Inter-Processor Communication MailBox IP which provides queued interrupt mechanism for comm…

压力传感器模拟信号(频率)转数字信号的问题

压力传感器模拟信号&#xff08;频率&#xff09;转数字信号的问题 三河凡科科技飞讯教学篇&#xff1a;压力传感器模拟信号&#xff08;频率&#xff09;转数字信号是现代控制系统中十分重要的一个问题。在许多工业应用中&#xff0c;压力传感器模拟信号需要被准确地转换成数…

MyBatis进阶:告别SQL注入!MyBatis分页与特殊字符的正确使用方式

目录 引言 一、使用正确的方式实现分页 1.1.什么是分页 1.2.MyBatis中的分页实现方式 1.3.避免SQL注入的技巧 二、特殊字符的正确使用方式 2.1.什么是特殊字符 2.2.特殊字符在SQL查询中的作用 2.3.如何避免特殊字符引起的问题 2.3.1.使用CDATA区段 2.3.2.使用实体引…