linux 内存管理之五bootmem 分配器 2.4.22

news2024/11/27 8:42:08

内核的bootmem 分配器 又叫自举内存分配器,其内涵即 自己初始化自己的一个内存分配器
其初始化过程 已在 上篇[ARM 架构物理内存初始化],(https://blog.csdn.net/zsj1126/article/details/116430903)介绍

本文主要关注该分配器提供的主要接口和用途
在这里插入图片描述


static void * __init __alloc_bootmem_core (bootmem_data_t *bdata, 
	unsigned long size, unsigned long align, unsigned long goal)

bdata, 指向node的bootmem分配器j结构
size : 申请空间字节数
align: 申请地址对齐大小
goal: 目标起始位置

	offset = 0;
	if (align &&
	    (bdata->node_boot_start & (align - 1UL)) != 0)
		offset = (align - (bdata->node_boot_start & (align - 1UL)));
	offset >>= PAGE_SHIFT;

	/*
	 * We try to allocate bootmem pages above 'goal'
	 * first, then we try to allocate lower pages.
	 */
	if (goal && (goal >= bdata->node_boot_start) && 
			((goal >> PAGE_SHIFT) < bdata->node_low_pfn)) {
		preferred = goal - bdata->node_boot_start;
	} else
		preferred = 0;

	preferred = ((preferred + align - 1) & ~(align - 1)) >> PAGE_SHIFT;
	preferred += offset;
	areasize = (size+PAGE_SIZE-1)/PAGE_SIZE;
	incr = align >> PAGE_SHIFT ? : 1; // 步进对齐

以页为单位分配,起始地址对齐和计算,如goal 非0 ,则从goal 开始扫描。

restart_scan:
	for (i = preferred; i < eidx; i += incr) {
		unsigned long j;
		if (test_bit(i, bdata->node_bootmem_map))
			continue;
		for (j = i + 1; j < i + areasize; ++j) {
			if (j >= eidx)
				goto fail_block;
			if (test_bit (j, bdata->node_bootmem_map))
				goto fail_block;
		}
		start = i;
		goto found;
	fail_block:;
	}
	if (preferred) {
		preferred = offset;
		goto restart_scan;
	}
	return NULL;

扫描map, 找到合适位置,如有指定地址,未扫到,还需从头再扫
在这里插入图片描述

209-210 : 判断是否可以合并分配
last_pos: 上次分配的bootmem页结束id
last_offset: 上次分配的bootmem页内偏移
238-239:分配标志标记

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

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

相关文章

系统测试工程师的岗位职责描述(合集)

系统测试工程师的岗位职责描述1 职责&#xff1a; 1、评审产品或项目需求的测试性&#xff0c;评审产品或项目开发设计的合理性。 2、根据需求进行测试规划&#xff0c;制定测试方案&#xff0c;设计测试用例; 组织测试用例评审; 3、根据测试计划进行项目测试进度和测试质量的管…

Cesium 实战 - 自定义视频标签展示视频

Cesium 实战 - 自定义视频标签展示视频 视频材质核心代码气泡框视频核心代码在线示例 在封装 Cesium 工具的时候&#xff0c;偶然发现 Cesium 支持视频材质功能&#xff0c;虽然目前项目中还没有用到&#xff0c;但是提前做了功能封装&#xff0c;以后使用的时候会方便一些。 …

强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

Triton教程---模型设置

Triton教程—模型设置 这是您第一次编写配置文件吗&#xff1f; 查看本指南或本示例&#xff01; 文章目录 Triton教程---模型设置最小模型配置名称、平台和后端模型交互策略解耦 最大批量大小输入和输出PyTorch 后端的特殊约定命名约定&#xff1a;张量字典作为输入&#xf…

用CSS3实现边框流动,让你的网页更有创意和个性

前言 边框流动动画是一种非常常见的效果&#xff0c;能够让网页看起来更加生动有趣。通过使用 CSS3&#xff0c;我们可以轻松地实现这种动画效果。本文将介绍如何使用 CSS3 实现边框流动效果&#xff0c;下面一起来看看吧。 实现效果 实现思路 首先我们先创建一个盒子容器&…

ENVI软件的地表温度(LST)反演教程

前言 遥感图像处理平台&#xff08;The Environment for Visualizing Images&#xff09;的软件处理技术覆盖图像数据的输入/输出、图像定标、图像增强、纠正、正射校正、镶嵌、数据融合以及各种变换、信息提取、图像分类、基于知识的决策树分类、与GIS的整合、DEM及地形信息提…

【FPGA入门】第四篇、有限状态机

目录 第一部分、一个关于有限状态机的例子 第二部分、学会有限状态机的准备知识 1、什么是有限状态机&#xff1f; 2、为什么需要状态机&#xff1f; 3、什么是竞争冒险&#xff1f; 3.1、什么情况下会发生竞争冒险&#xff1f; 3.2、为什么组合逻辑电路会产生竞争和冒险…

HBase入门(一)

第1章 HBase简介 1.1 HBase定义 HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。 1.2 HBase数据模型 逻辑上&#xff0c;HBase的数据模型同关系型数据库很类似&#xff0c;数据存储在一张表中&#xff0c;有行有列。但从HBase的底层物理存储结构&#xff08;…

【C语言复习】第四篇、有关C语言数据类型的知识

目录 第一部分、前言 第二部分、初识数据类型 1、C语言为啥要这么多的数据类型&#xff1f; 2、表格中所占内存的大小是如何计算得到的&#xff1f; 2.1、计算机的内数据存储单位 2.2、关键字sizeof的使用说明&#xff08;具体后面会更详细的解释&#xff09; 3、为什么…

【Python 随练】求最大公约数和最小公倍数

题目&#xff1a; 输入两个正整数 m 和 n&#xff0c;求其最大公约数和最小公倍数。 简介&#xff1a; 在本篇博客中&#xff0c;我们将解决一个常见的数学问题&#xff1a;求两个正整数的最大公约数和最小公倍数。我们将提供问题的解析&#xff0c;并给出一个完整的代码示例…

【新星计划Linux】——Linux介绍与了解Linux与Windows系统区别

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 前言 一.Linux系统 1.Linux系统与Windows系统的区别 &#xff08;1&#xff09;性…

【JavaScript】ES6新特性(4)

14. Proxy 代理 Proxy 可以对目标对象的读取、函数调用等操作进行拦截&#xff0c;然后进行操作处理 它不直接操作对象&#xff0c;而是像代理模式&#xff0c;通过对象的代理对象进行操作&#xff0c;在进行这些操作时&#xff0c;可以添加一些需要的额外操作 14.1 Object.d…

2023年DAMA-CDGA/CDGP数据治理工程师认证这里报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

追梅西的少年

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在“刘教链Pro”发表了头条《鼠头和鸭脖——中心化验真的困境》&#xff0c;以及次条《内参&#xff1a;美SEC执法主管表示&#xff0c;DeFi是纯粹的欺诈&#xff01;&#xff1f;&#xff1f;》&#xff0c;欢迎关注…

云安全技术(六)之云架构模型

云架构模型 1.1 舍伍德业务应用安全架构(SABSA) 舍伍德业务应用安全架构(Sherwood Applied Business Security Architecture&#xff0c;SABSA)的官方网站是 。SABSA提供了一组组件&#xff0c;这些组件可部分或全部用作任何系统的安全架构方www.sabsa.org法。如下&#xff1a…

【Flutter】Flutter中如何获取子类Widget并调用它的方法

文章目录 一、前言二、理解 Flutter 中的 Widget三、如何在 Flutter 中获取子类 Widget1. 使用 GlobalKey2. 使用 context.findAncestorWidgetOfExactType 四、如何调用子类 Widget 的方法五、如何在 Flutter 中传递数据六、总结 一、前言 如果你想深入学习 Flutter&#xff0…

如何打造优秀Web3产品

近日&#xff0c;我们采访了Mysten Labs的联合创始人兼首席执行官Evan Cheng&#xff0c;探讨了Web3技术对消费者的价值、Web3行业应该如何更好地自我诠释&#xff0c;以及它对产品开发的影响。 您曾谈到Web3作为一种所有权实验&#xff0c;这种新技术可能会改变消费者的行为。…

Can’t connect to MySql server on ‘localhost’(10038)

一般是一下几个原因&#xff1a; 1、MySQL服务没有启动 2、用户没有权限使用远程连接 3、linux中防火墙中没有配置MySQL端口&#xff08;3306&#xff09; 使用命令service mysqld status 或者service mysql status 命令来查看mysql的启动状态 启动MySQL命令&#xff1a; …

±0.1℃精度、超低功耗的高精度数字模拟混合信号温度传感芯片

温度芯片感温原理基于CMOS半导体PN节温度与带隙电压的特性关系&#xff0c;经过小信号放大、模数转换数字校准补偿后&#xff0c;数字总线输出&#xff0c;具有精度高、一致性好、测温快、功耗低、可编程配置灵活、寿命长等优点。 温度芯片内置16-bit ADC&#xff0c;分辨率0.…

用代码生撸qsort函数来实现冒泡排序

作者主页&#xff1a;paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《C语言》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造…