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

news2024/11/15 11:56:40

一、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.coloradmin.cn/o/1814102.html

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

相关文章

鸿蒙元服务未来是能一“通”多端的前端形态?

2024年&#xff0c;华为鸿蒙的热度只增不减。 在2023年底就有业内人士透露&#xff0c;华为明年将推出不兼容安卓的鸿蒙版本&#xff0c;未来IOS、鸿蒙、安卓将成为三个各自独立的系统。 果不其然&#xff0c;执行力超强的华为&#xff0c;与2024年1月18日的开发者&#xff0…

Pixi.js学习 (六)数组

目录 前言 一、数组 1.1 定义数组 1.2 数组存取与删除 1.3 使用数组统一操作敌机 二、实战 例题一&#xff1a;使用数组统一操作敌机 例题一代码&#xff1a; 总结 前言 为了提高作者的代码编辑水品&#xff0c;作者在使用博客的时候使用的集成工具为 HBuilderX。 下文所有截…

LabVIEW故障预测

在LabVIEW故障预测中&#xff0c;振动信号特征提取的关键技术主要包括以下几个方面&#xff1a; 时域特征提取&#xff1a;时域特征是直接从振动信号的时间序列中提取的特征。常见的时域特征包括振动信号的均值、方差、峰值、峰-峰值、均方根、脉冲指数等。这些特征能够反映振动…

如何在Python中向Word文档插入图片

如何在Python中向Word文档插入图片 向Word文档插入图片添加前和添加后 在这篇博客文章中&#xff0c;我们使用Python向Word文档插入图片。通过本文&#xff0c;您将学习如何在文档中插入图片&#xff0c;并调整其大小和位置。 向Word文档插入图片 from docx import Document …

Redis脑裂问题详解及解决方案

Redis脑裂问题 Redis脑裂问题是指在主从集群中同时存在两个主节点&#xff0c;这会导致不同客户端往不同的主节点写入数据&#xff0c;最终导致数据不一致&#xff0c;甚至数据丢失。 哨兵主从集群脑裂 场景描述 假设有三台服务器&#xff1a;一台主服务器&#xff0c;两台…

据阿谱尔统计显示,2023年全球电动汽车充电设备市场价值为62.1亿美元

根据阿谱尔 (APO Research&#xff09;的统计及预测&#xff0c;2023 年全球电动汽车充电设备市场价值为 62.1 亿美元&#xff0c;预计到 2030 年将达到 391.1 亿美元&#xff0c;预测期内&#xff08;2024-2030 年&#xff09;复合年增长率为 31.47%。 电动汽车 (EV) 充电设备…

如何有效处理服务器后台密码暴露

服务器后台密码的暴露是信息安全领域中的严重事件&#xff0c;它可能引发未经授权的数据访问、恶意软件植入或系统功能滥用等一系列问题。本文将探讨几种处理服务器后台密码暴露的有效策略&#xff0c;包括紧急响应步骤、密码安全增强措施及长期预防机制&#xff0c;并提供实际…

Unity射击游戏开发教程:(27)创建带有百分比的状态栏

创建带有弹药数和推进器百分比的状态栏 在本文中,我将介绍如何创建带有分数和百分比文本的常规状态栏。 由于 Ammo Bar 将成为 UI 的一部分,因此我们需要向 Canvas 添加一个空的 GameObject 并将其重命名为 AmmoBar。我们需要一个文本和两个图像对象,它们是 AmmoBar 的父级。…

如何使用 Vue.js 和 Java 开发一个完整的 Web 应用

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

测试基础12:测试用例设计方法-边界值分析

课程大纲 1、定义 经验发现&#xff0c;较多的错误往往发生在输入或输出范围的边界上&#xff0c;因为边界值是代码判断语句的点&#xff0c;一般容易出问题&#xff08;数值写错、多加或丢失等号、写错不等号方向…&#xff09;。所以增加对取值范围的边界数据的测试&#xff…

使引用作为函数参数将变量i和j的值互换

C之所以增加引用机制&#xff0c;主要是把它作为函数参数&#xff0c;以扩充函数传递数据的功能。 解题思路&#xff1a; 传递变量的地址。形参是指针变量&#xff0c;实参是一个变量的地址&#xff0c;调用函数时&#xff0c;形参&#xff08;指针变量&#xff09;得到实参变…

AI大模型时代:程序员如何面对“焦虑”并抓住“风口”

前言 最近&#xff0c;我和不少程序员朋友聊起了全网都在热议的大模型&#xff0c;如ChatGPT、GPT-4、文心一言等。大家的反应出乎我意料&#xff0c;普遍感到焦虑和迷茫。 这些大模型的出现&#xff0c;确实令人兴奋&#xff0c;仿佛一夜之间&#xff0c;AI就能做很多事情&…

专家解读 | NIST网络安全框架(3):层级配置

NIST CSF在核心部分提供了六个类别的关键功能和子功能&#xff0c;并围绕CSF的使用提供了层级&#xff08;Tier&#xff09;和配置&#xff08;Profile&#xff09;两种工具&#xff0c;使不同组织和用户更方便有效地使用CSF&#xff0c;本文将深入探讨CSF层级和配置的主要内容…

【deepin 产品面对面】玲珑入门教程:从源代码开始构建玲珑格式应用

内容来源&#xff1a;deepin&#xff08;深度&#xff09;社区 请首先阅读玲珑官方文档 ll-builder 简介 | 玲珑&#xff0c;本文以构建 desktop-entry-editor 为例&#xff0c;该项目依赖较为简单&#xff0c;仅需玲珑官方文档中默认提供的基础运行环境即可成功构建运行。 第一…

web基础htTP协议

web基础 域名概述&#xff1a; 域名空间结构 网页的概念 HTML概述 DNS解析的三种方式 /etc/hosts 在Linux系统中&#xff0c;/etc/hosts 文件负责快速解析&#xff0c;它包含了IP地址与主机名的映射关系。在没有DNS服务器的情况下&#xff0c;可以使用本地/etc/hosts 文件完成…

用户管理与服务器远程管理

用户管理 服务器系统版本介绍 windows服务器系统&#xff1a;win2000 win2003 win2008 win2012 linux服务器系统&#xff1a;Redhat Centos 用户管理 用户概述 &#xff08;1&#xff09;每一个用户登录系统后&#xff0c;拥有不同的操作权限。 &#xff08;2&#xff09;…

【实例分享】访问后端服务超时,银河麒麟服务器操作系统分析及处理建议

1.服务器环境以及配置 【机型】 处理器&#xff1a; Intel 32核 内存&#xff1a; 128G 整机类型/架构&#xff1a; x86_64虚拟机 【内核版本】 4.19.90-25.22.v2101.kylin.x86_64 【OS镜像版本】 kylin server V10 SP2 【第三方软件】 开阳k8s 2.问题现象描述 …

三十二、 数据跨境传输场景下的 PIA 与数据出境风险自评估是一回事吗?

PIA 与数据出境风险自评估并不相同。PIA 是《个人信息保护法》第五十五条明确提出要求企业在向境外提供个人信息前应当开展的自评估工作&#xff0c;而数据出境风险自评估则是《评估办法》第五条提出的要求符合数据出境安全评估申报情形的企业在申报前应当开展的自评估工作。 换…

使用 SPICE 模型模拟 MOSFET 电流-电压特性

绘制漏极电流与漏极电压的关系图 我们首先绘制漏极电流 ( I D ) 与漏源电压 ( V DS ) 的基本图。为此&#xff0c;我们将栅极电压设置为远高于阈值电压的固定值&#xff0c;然后执行直流扫描模拟&#xff0c;其中V DD的值逐渐增加。图 1 显示了我们将使用的原理图。 LTspice N…

❎35岁程序员,转行了么?

新职业 在Boss直聘、智联等招聘网站中&#xff0c;您是否遇见过这样的职位邀请&#xff1f;它的名字叫做LORA模型训练师。 从图上我们可以看出其需要的技能大致是下面的样子&#xff1a; Stable Diffusion: 机器学习、神经网络、模型训练的知识&#xff1b;Lora: 训练Lora模型…