《Linux内核设计与实现》读书笔记之内存管理

Unity与IOS交互,调用IOS系统相机和相册 与IOS的交互,在步骤上要比android简单许多,不会产生因为系统版本,或者包名导致的许多问题。过程中最头疼的一个问题是IOS回调Unity,很简单的一个问题,搞了半天。 阅读详情

1.页

       内核把物理页作为内存管理的基本单位,MMU(内存管理单元)以页为单位来管理系统中的页表,从虚拟内存的角度来看,页就是最小单位。

       内核用struct page结构来标识系统中的每一个物理页,它的定义如下:


       flag域用来存放页的状态(是不是脏的,是不是被锁定在内存中等等)。_count表示这一页被引用了多少次,当次数为0时,表示此页没有被引用,于是在新的分配中就可以使用它。virtual域是页的虚拟地址。


2.获得页

       内核提供了一种请求内核的底层机制,并提供了对它进行访问的几个接口。所有这些接口都以页为单位分配内存,其中最核心的函数是:

       该函数分配2的order次方个连续的物理页,并返回一个指针,该指针指向第一个页的page结构体。gfp_mask是一个标识,它可以分为三类:行为修饰符、区修饰符以及类型。它可取的值如下:




       获得填充为0的页:


     分配一个页,让其填充为0,并返回其逻辑地址。

     底层页的分配方法总结如下:


     

3.kmalloc()与vmalloc()

     kmalloc()函数与用户空间malloc()一族函数非常类似。它是一个简单的接口,分配以字节为单位的内存块。vmalloc()函数的工作方式类似于kmalloc()函数,只不过vmalloc()函数分配的内存是虚拟地址连续的,而物理地址无需连续。这也是用户空间的分配方式:由malloc()函数返回的页在进程的虚拟地址空间内是连续的,但是,这并不保证它们在物理RAM中也连续。而kmalloc()函数则确保分配的内存在物理地址上是连续的(在虚拟地址上自然也是连续的)。


4.slab层

      分配和释放数据结构是所有内核中最普遍的操作之一。为了便于数据的频繁分配和释放,通常实现一个空闲链表。当需要一个新的数据结构的实例时,就从空闲链表分配一个出来。当不在需要某个数据结构的实例时,则将它放入到空闲链表中,而不需释放它。

       这也带来的问题是内核无法全局控制空闲链表。当内核紧缺时,内核无法通知每一个空闲链表,让其收缩缓存的大小以释放一些内存出来。为了弥补这一缺陷,Linux提供了slab层,扮演数据结构缓存层的角色。

        slab层把不同的对象划分为高速缓存组中,其中每个高速缓存都存放不同类型的对象。每种对象类型对应一个高速缓存。例如,一个高速缓存用于存放进程描述符(task_struct结构),而另一个高速缓存存放索引节点对象(struct inode)。

        然后,这些高速缓存又被划分为slab。slab由一个或多个物理上连续的页组成。每一个slab都包含一些对象成员,这里的对象是指被缓存的数据结构。每个缓存都处于三种状态之一:满、部分、空。

        作为一个例子,让我们考察一下inode结构,该结构是次配索引节点在内存中的体现。这些数据结构会频繁地创建和释放。因此,struct inode就由inode_cachep高速缓存进行分配。这种高速缓存由一个或多个slab组成。每个slab包含尽可能多的对象。当内核请求分配一个新的inode结构时,内核就从部分满的slab或空slab中分配一个inode。下图小时了高速缓存、slab以及对象之间的关系。


       每个高速缓存都是用kmem_cache_s结构来标识的。这个结构包含三个链表slabs_full、slabs_partial、slabs_empty,均放在kmem_list3结构内。链表包含了高速缓存中的所有slab。slab描述符struct slab用来描述每个slab:





【SMPL简介】SMPL: A Skinned Multi-Person Linear Model【源码复现】 SMPL是一种3D人体建模方法.在数字人或者人物角色三维重建领域有着广泛应用支持人体的各种形状及动作可以简单理解为通过训练获取的人物模型SMPL 输入是:姿态shape vectorβ\betaβ+ 影响动作Pose的参数θ\thetaθ输出是: 各种变化后vertex顶点的数据作者:Loper, Matthew and Mahmood, Naureen and Romero, Javier and Pons-Moll, Gerard and Black, Michael J. 阅读详情

相关推荐

自适应陷波器的原理与实现

x(t)是叠加有两个频率干扰信号的输入信号,s(t)是需要保留的有用信号,在输入信号中,我们只知道频率w1和w2,但不知道信号的幅度A和相位θ,自适应陷波器可以估计两个未知的幅度和相位值,这需要我们提供两路相互正交的单频信号,如cos(w1t)、sin(w1t),通过调整其权值,从而合成出与干扰信号完全相同的信号A1cos(w1t+θ1),从而实现干扰信号的滤除。采用LMS算法,在保证不损失其他有用信号的情况下,有效地抑制输入信号中某一频率的干扰,如需滤除多个频率,只需要增加相应的输入信号。

Melkiades2333的博客 6883

Linux内核设计与实现读书笔记十二——内存管理(内附思维导图)

yangcs2009的专栏 928

STM32L452与FPGA通信翻车?手把手教你关闭I2C时钟延展避坑(附OVR错误解决方案)

本文深入解析STM32L452与FPGA在I2C通信中因时钟延展功能导致的常见问题,提供关闭I2C时钟延展的详细配置方法(NOSTRETCH模式),并针对可能出现的OVR错误给出Combined模式解决方案。通过实战案例和波形分析,帮助工程师快速排查和解决嵌入式系统中的I2C兼容性问题。

e3f4g5的博客 214

linux内核设计与实现读书笔记——内存管理

一、页 内存管理的基本单位;页。 内核中用struct page表示物理页,位于,属性包括flag页状态、count页的引用计数,virtual页虚拟地址。目的在于描述物理内存本身。?? 1)获得页   核心:alloc_pages(gft_t gft_mask,order),连续分配2n个连续物理页,返回至向第一个页page结构体的指针;也有函数返回逻辑地址get_free_page;也

cleo321的专栏 542

QMT中ContextInfo的使用注意

QMT中ContextInfo下声明的全局变量的使用注意事项

路在何方 2805

80MHz~100MHz频谱分析仪设计

由理论分析可知,经过乘法器后输出的信号为频率为w1+w2的高频信号和w1-w2的低频信号,除了想要采样的直流信号外,最小的信号频率为100kHz。因此,经过一系列推导可以得到该滤波器的元件C1,C2,C3,R1,R2的近似值分别为:C1=2.36nF,C2=32.1nF,C3=1.07nF,R1=1.39k,R2=2.84k。AK,此时的频率w2即为被测信号的频率,待测信号源电压幅度为,因此为了能达到直流采样的设计,我们将本振源的频率输出范围做成80~110 MHz,提高了题目的频率要求。

qq_48771816的博客 5242

《Linux内核设计与实现》读书笔记—内存管理

页 页表查询的过程由硬件完成,但是页表的维护需要软件完成,处理器的MMU单元负责把虚拟地址转换成物理地址 当处理器发现虚拟地址无法通过页表映射到对应的物理地址时,就会触发一个缺页异常,挂起出错的进程,操作系统软件需要处理这个缺页异常。 一个页表可以由页缓存使用,可以作为私有数据,也可以作为进程页表中的映射 page结构是和物理页相关联的,而不是和虚拟页相关联的。内核用这一数据结构来知道一个页是否空闲,如果页被分配的话,谁拥有这个页,是用户空间进程、动态分配的内核数据还是静态内核代码或页高速缓存。 区

breakfei11的博客 569

Ubuntu系统全盘备份——TimeShift的安装与使用

所以如果有那天你不小心作了个大死,并且幸运到还能打开GNOME桌面和Timeshift(只要不是执行sudo rm -f /*这样的自杀程序)的时候,点击你要恢复的那个备份文件再点击Restore,经过短暂的重启后你的系统就成功恢复了。打开软件后,会有一些初始化设置,只需要一直点击 Next。根据自己电脑的内存大小决定是自动备份还是手动备份。当然,对于虚拟机用户来说,没有比在客户机直接拷贝虚拟磁盘文件更棒的方式了。点击左上角的 Create,就会执行备份操作。最下面的意思就是说不会自动备份需要手动操作。

琉璃轻纱的博客 4703

Linux内核设计与实现——读书笔记(9)内存管理

内存管理1、页2、区3、页操作函数3.1、分配页3.2、释放页4、kmalloc()4.1、gfp_mask标志4.1.1行为修饰符4.1.2、区修饰符4.1.3、类型标志 1、页   内核把物理页作为内存管理的基本单位。内存管理单元(MMU,管理内存并把虚拟地址转换为物理地址的硬件)通常以页为单位进行处理,按照页大小的单位来管理系统中的页表。   内核用struct page结构表示系统中的每个物理页,结构定义在 **<linux/mm_types.h>**中: /* page部分的部分成员

Mr_zhangsq的博客 1356

MVDR算法: 自适应波束形成在信号处理领域中扮演着重要的角色。本文将介绍MVDR(最小方差无失真响应)算法,并提供相应的Matlab源代码实现。

MVDR算法是一种用于抑制干扰信号并增强感兴趣信号的自适应波束形成算法。它的基本思想是通过对干扰信号进行空间滤波,使其在感兴趣信号方向上的输出功率最小化。这种方法可以提高信号的质量和可辨识度,特别是在存在多个干扰源的复杂环境中。本文将介绍MVDR(最小方差无失真响应)算法,并提供相应的Matlab源代码实现。使用MVDR算法,我们可以通过对观测信号进行波束形成来抑制干扰信号并增强感兴趣信号。以上是MVDR算法的Matlab实现。的每一列代表一个阵列元素的观测信号。表示期望的波束指向,即感兴趣信号的方向。

HackWhisper的博客 1244

【23】C++实战篇——C++报错:LNK2001:无法解析的外部符号 ,LNK2019: 无法解析的外部符号,原因分析及解决方法

该文分析了VS项目中出现的"无法解析的外部符号"LNK2001/LNK2019错误。问题表现为跨项目共享变量时,Projector项目无法解析Line项目中声明的外部变量ImgSavePath和ImgFormat。原因在于头文件声明了变量但未包含实现的源文件。解决方法是将getLine.cpp文件添加到Projector项目中。文章还总结了两种错误代码的区别:LNK2001通常对应变量缺失,LNK2019对应函数缺失。最后列出了具体的报错信息,包括无法解析的变量和函数符号。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 2004

《Linux内核设计与实现》读书笔记(十二)- 内存管理

内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己来解决(用户空间的内存错误可以抛给内核来解决)。 所有内核的内存管理必须要简洁而且高效。 主要内容: 内存的管理单元 获取内存的方法 获取高端内存 内核内存的分配方式 总结 1. 内存的管理单元 内存最基本的管理单元是页,同时按照内存地址的大小,大致分为3个区。 1.1 页 页的大小与体系结构有关,在 x86 结构中一般是 4KB或者8KB。 可以通过 getconf 命令来查看系统的page的大小: ..

hhd1988的专栏 228

Python 神经计算实训 实训答案分享

【代码】Python 神经计算实训 实训答案分享。

2403_89314916的博客 343

《Linux内核设计与实现》读书笔记 - 目录 (完结)

http://www.cnblogs.com/wang_yb/p/3514730.html 读完这本书回过头才发现, 第一篇笔记居然是 2012年8月发的, 将近一年半的时间才看完这本书(汗!!!). 为了方便以后查看, 做个《Linux内核设计与实现》读书笔记 的目录:   《Linux内核设计与实现》读书笔记(一)-内核简介《Linux内核设计与实现》读书笔记(二)

larryliuqing的专栏-xxx 917

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: 《Linux内核设计与实现》之中断与中断处理程序
下一篇: 《Linux内核设计与实现》读书笔记之进程地址空间
yao_hust_iAC
博客等级 码龄15年 27粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值