linux驱动学习(十)之内存管理

一、linux内核启动过程中,关于内存信息

1、内核的内存的分区

[    0.000000] Memory: 1024MB = 1024MB total  ---> 1G
[    0.000000] Memory: 810820k/810820k available, 237756k reserved, 272384K highmem
[    0.000000] Virtual kernel memory layout: 内核虚拟内存分布
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB) ----> 存放中断向量表
[    0.000000]     fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB) --->固定的映射区
[    0.000000]     vmalloc : 0xef800000 - 0xfee00000   ( 246 MB) ---> vmalloc()对应的内存
[    0.000000]     lowmem  : 0xc0000000 - 0xef600000   ( 758 MB) ---->低端内存
[    0.000000]     pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB) ---->高端内存区
[    0.000000]     modules : 0xbf000000 - 0xbfe00000   (  14 MB) ----> 执行insmod ***.ko存放段
[    0.000000]       .text : 0xc0008000 - 0xc0a51044   (10533 kB) ----->代码段和只读数据段
[    0.000000]       .init : 0xc0a52000 - 0xc0a8f100   ( 245 kB)  ----->由__init修饰的函数存放段
[    0.000000]       .data : 0xc0a90000 - 0xc0b29f18   ( 616 kB) ----->可读写数据段
[    0.000000]        .bss : 0xc0b29f3c - 0xc0d09c48   (1920 kB) ---->未初始化数据段

[    0.000000] SLUB: Genslabs=11, HWalign=64, Order=0-3, MinObjects=0, CPUs=8, Nodes=1 ---->linux内核内存分配器

由__init修饰的函数存放段,该函数只会执行一次,之后所对应的内存会被释放:

[    4.475000] devtmpfs: mounted
[    4.478000] Freeing init memory: 244K

2、linux内存的分配器(SLUB,SLOB,SLAB)

kernel\mm  ---->关于SLUB、SLOB、SLAB对于源码位置
SLUB,SLOB,SLAB区别:
1) SLOB是针对嵌入式系统的,并且内存在32M以下.
2) SLAB是最早期的内存分配器.
3) SLUB是SLOB和SLAB的内存分配器的取代者.

3、在内核中如何分配内存---申请内存

1)申请内存:kmalloc
#include <linux/slab.h>
static __always_inline void *kmalloc(size_t size, gfp_t flags)
size_t size size_t ---> unsigned int  申请内存的大小
gfp_t flags ---->分配内存的标志
typedef enum {
GFP_KERNEL,--->正常分配内存,内存分配在lowmem区
GFP_ATOMIC,---->分配内存的过程是一个原子操作,该过程不能被打断,如果在申请内存的程序中,是一个原子过程
			则使用该标志,比如:中断服务程序中,申请内存
} gfp_t;
返回值:void *
	成功:返回该内存对应的基址,该申请的内存大小为:2 * PAGE_SIZE
	失败:返回NULL


2)释放内存
static inline void kfree(void *p) 

3)申请内存:vmalloc()
#include <linux/vmalloc.h>
void *vmalloc(unsigned long size)

4)释放内存:vfree
void vfree(const void *addr)

malloc、kmalloc与vmalloc的区别:

1)kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存
2)kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续
3)kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大
4)内存只有在要被DMA访问的时候才需要物理上连续
5)vmalloc比kmalloc要慢

二、MMU  

1、什么是MMU 

MMU,即Memory Manmager Unit(内存管理单元),是cpu核中的一个硬件模块,不是所有的CPU都有该模块。MMU的模块会使得CPU的处理速度加快。

2、MMU作用

1) MMU实现虚拟地址与物理地址的转换。嵌入式linux,WINCE,VxWorks操作系统只能运行在虚拟地址上,不能直接运行在物理地址上。

  物理地址:硬件平台上寄存器的地址,来自于原理图,cpu手册; 

  虚拟地址:操作系统的地址,方便内核保护(内核空间和用户空间),可以实现不同进程之间的切换,有利于进行的通信。

2)设置虚拟地址空间访问属性:只读,只写,禁止访问。

3、MMU做地址转换的单位

MMU做地址转换的时候,不是一个一个转换,而是一块一块转换的。

所对应的单位:
    1) section(段):1MB
    2) larger page(大页):64KB
    3) little page(小页):4KB ----->(linux page = 4KB)
    4) tiny page(极小页):1KB
    GPIO口每组大小为:4KB    

4、MMU工作原理

简单的来讲--->查表

1) 表(page table),页表是在使用MMU之前,就需要在内存中创建一个页表,页表的首地址叫TTB,该地址要保存到MMU中,当打开 MMU后,MMU会自动去查表,得到虚拟地址和物理地址的关系。

2) 表的索引--->虚拟地址的索引

3) 表的内容--->是虚拟地址与物理地址的转换关系和访问属性

5、MMU与ioremap的关系

虚拟地址 = ioremap(物理地址,物理地址的大小)。ioremap()实质上是一个改写页表的过程,重新定义了虚拟地址与物理地址的这种关系。

觉得有帮助的话,打赏一下呗。。

           

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UnityAPI学习之碰撞检测与触发检测

碰撞检测 发生碰撞检测的前提&#xff1a; 1. 碰撞的物体需要有Rigidbody组件和boxcllidder组件 2. 被碰撞的物体需要有boxcollider组件 示例1&#xff1a;被碰撞的物体拥有Rigidbody组件 两个物体会因为都具有刚体的组件而发生力的作用&#xff0c;如下图所示&#xff0c…

人工智能模型组合学习的理论和实验实践

组合学习&#xff0c;即掌握将基本概念结合起来构建更复杂概念的能力&#xff0c;对人类认知至关重要&#xff0c;特别是在人类语言理解和视觉感知方面。这一概念与在未观察到的情况下推广的能力紧密相关。尽管它在智能中扮演着核心角色&#xff0c;但缺乏系统化的理论及实验研…

Elasticsearch 8.1官网文档梳理 - 十一、Ingest pipelines(管道)

Ingest pipelines 管道&#xff08;Ingest pipelines&#xff09;可让让数据在写入前进行常见的转换。例如可以利用管道删除文档&#xff08;doc&#xff09;的字段、或从文本中提取数据、丰富文档&#xff08;doc&#xff09;的字段等其他操作。 管道&#xff08;Ingest pip…

【Mybatis-Plus】根据自定义注解实现自动加解密

背景 我们把数据存到数据库的时候&#xff0c;有些敏感字段是需要加密的&#xff0c;从数据库查出来再进行解密。如果存在多张表或者多个地方需要对部分字段进行加解密操作&#xff0c;每个地方都手写一次加解密的动作&#xff0c;显然不是最好的选择。如果我们使用的是Mybati…

Internet Download Manager(IDM6.41)软件安装包下载及安装教程

Internet Download Manager有一个智能下载逻辑加速器&#xff0c;具有智能动态文件分割和安全的多部分下载技术&#xff0c;可以加速下载。与其他下载加速器和管理器不同&#xff0c;Internet下载管理器在下载开始之前对文件进行分段&#xff0c;而Internet下载管理器在下载过程…

欧阳修,仕途波澜中的文坛巨匠

欧阳修&#xff0c;字永叔&#xff0c;号醉翁、六一居士&#xff0c;生于北宋真宗景德四年&#xff08;公元1007年&#xff09;&#xff0c;卒于北宋神宗熙宁五年&#xff08;公元1072年&#xff09;&#xff0c;享年65岁。他是北宋时期著名的文学家、史学家&#xff0c;也是唐…

SpringBoot 大文件基于md5实现分片上传、断点续传、秒传

SpringBoot 大文件基于md5实现分片上传、断点续传、秒传 SpringBoot 大文件基于md5实现分片上传、断点续传、秒传前言1. 基本概念1.1 分片上传1.2 断点续传1.3 秒传1.4 分片上传的实现 2. 分片上传前端实现2.1 什么是WebUploader&#xff1f;功能特点接口说明事件APIHook 机制 …

索引失效有效的11种情况

1全职匹配我最爱 是指 where 条件里 都是 &#xff0c;不是范围&#xff08;比如&#xff1e;,&#xff1c;&#xff09;&#xff0c;不是 不等于&#xff0c;不是 is not null&#xff0c;然后 这几个字段 建立了联合索引 &#xff0c;而且符合最左原则。 那么就要比 只建…

[C++] vector list 等容器的迭代器失效问题

标题&#xff1a;[C] 容器的迭代器失效问题 水墨不写bug 正文开始&#xff1a; 什么是迭代器&#xff1f; 迭代器是STL提供的六大组件之一&#xff0c;它允许我们访问容器&#xff08;如vector、list、set等&#xff09;中的元素&#xff0c;同时提供一个遍历容器的方法。然而…

【Perl】与【Excel】

引言 perl脚本语言对于文本的处理、转换很强大。对于一些信息量庞大的文本文件&#xff0c;看起来不直观&#xff0c;可以将信息提取至excel表格中&#xff0c;增加数据分析的可视化。perl语言的cpan提供了大量模块。对于excel文件的操作主要用到模块&#xff1a; Spreadshee…

Unity的三种Update方法

1、FixedUpdate 物理作用——处理物理引擎相关的计算和刚体的移动 (1) 调用时机&#xff1a;在固定的时间间隔内&#xff0c;而不是每一帧被调用 (2) 作用&#xff1a;用于处理物理引擎的计算&#xff0c;例如刚体的移动和碰撞检测 (3) 特点&#xff1a;能更准确地处理物理…

【算法】某赛车游戏中的组合计数问题及其扩展。推导思路:层层合并

文章目录 引言所有人都能完成可能有人未完成扩展问题参考资料 引言 在某款人称赛车界原神的赛车游戏中有组队竞速赛。共有n个人&#xff0c;n为偶数&#xff0c;分为人数相等的红队和蓝队进行比赛。结果按排名得分的数组为pts&#xff0c;单调递减且均为正整数。比如pts [10,…

算法day28

第一题 295. 数据流的中位数 本题我们是求解给定数组的中位数。且由于需要随时给数组添加元素&#xff0c;所以我们要求解该动态数组的中位数&#xff0c;所以本题最关键的就是维护数组在添加元素之后保持有序的排序&#xff0c;这样就能很快的求解中位数&#xff1b; 解法&am…

C++11完美转发(引用折叠、万能引用)

完美转发是指在函数模板中&#xff0c;完全依照模板的参数的类型&#xff0c;将参数传递给函数模板中调用的另外一个函数。 函数模板在向其他函数传递自身形参时&#xff0c;如果相应实参是左值&#xff0c;它就应该被转发为左值&#xff1b;如果相 应实参是右值&#xff0c;它…

web安全渗透测试十大常规项(一):web渗透测试之PHP反序列化

渗透测试之XSS跨站脚本攻击 1. PHP反序列化1.1 什么是反序列化操作? - 类型转换1.2 常见PHP魔术方法?- 对象逻辑(见图)1.2.1 construct和destruct1.2.2 construct和sleep1.2.2 construct和wakeup1.2.2 INVOKE1.2.2 toString1.2.2 CALL1.2.2 get()1.2.2 set()1.2.2 isset()1…

查看npm版本异常,更新nvm版本解决问题

首先说说遇见的问题&#xff0c;基本上把nvm&#xff0c;npm的坑都排了一遍 nvm版本导致npm install报错 Unexpected token ‘.‘install和查看node版本都正确&#xff0c;结果查看npm版本时候报错 首先就是降低node版本… 可以说基本没用&#xff0c;如果要降低版本的话&…

linxu-Ubuntu系统上卸载Kubernetes-k8s

如果您想从Ubuntu系统上卸载Kubernetes集群&#xff0c;您需要执行以下步骤&#xff1a; 1.关闭Kubernetes集群&#xff1a; 如果您的集群还在运行&#xff0c;首先您需要使用kubeadm命令来安全地关闭它&#xff1a; sudo kubeadm reset在执行该命令后&#xff0c;系统会提示…

【JavaEE进阶】——利用框架完成功能全面的图书管理系统

目录 &#x1f6a9;项目所需要的技术栈 &#x1f6a9;项目准备工作 &#x1f388;环境准备 &#x1f388;数据库准备 &#x1f6a9;前后端交互分析 &#x1f388;登录 &#x1f4dd;前后端交互 &#x1f4dd;实现服务器代码 &#x1f4dd;测试前后端代码是否正确 &am…

01 - matlab m_map地学绘图工具基础函数理解(一)

01 - matlab m_map地学绘图工具基础函数理解&#xff08;一&#xff09; 0. 引言1. m_demo2. 小结 0. 引言 上篇介绍了m_map的配置过程&#xff0c;本篇开始介绍下m_map中涉及到的所有可调用函数。如果配置的没有问题&#xff0c;执行">>help m_map"可以看到类…

【C++】C++入门的杂碎知识点

思维导图大纲&#xff1a; namespac命名空间 什么是namespace命名空间namespace命名空间有什么用 什么是命名空间 namespace命名空间是一种域&#xff0c;它可以将内部的成员隔绝起来。举个例子&#xff0c;我们都知道有全局变量和局部变量&#xff0c;全局变量存在于全局域…