LDD3学习6--Scull的变种

news2025/1/5 20:17:11

1 整体介绍

之前在LDD3学习1里面就提过scull的变种,LDD学习1--启程-CSDN博客,大概的变种有这些:

名称全名说明对应章节
scullSimple Character Utility for Loading Localities基础版本3
scullcScull with Slab cache使用基于slab高速缓存8.2.1
scullpScull with whole page使用整页的缓存8.3.1
scullvScull with Virtual Buffers使用虚拟地址空间的连续区域8.3.4
sculldScull with ...会注册设备
scull-sharedScull with ...没有具体内容

它们主要的区别是在内存的分配上,内容基本上都在第八章。

2 细节

主要的流程这里就不写了,可以参考scull那篇LDD3学习5--Scull代码流程-CSDN博客,这些只列一些重点吧。

2.1 scullc(Scull with Slab cache)

作用:实现内存缓冲区的字符设备。

在scullc_write中:

	/* Allocate a quantum using the memory cache */
	if (!dptr->data[s_pos]) {
		dptr->data[s_pos] = kmem_cache_alloc(scullc_cache, GFP_KERNEL);
		if (!dptr->data[s_pos])
			goto nomem;
		memset(dptr->data[s_pos], 0, scullc_quantum);
	}

里面的行,也就是quantum,使用kmem_cache_alloc来获得。kmem_cache_alloc主要用于从特定的高速缓存(cache)中分配内存对象。这些高速缓存是通过kmem_cache_create函数预先创建的。

scullc_read和基本版几乎一致。

在scullc_init的时候,创建了cache。

	/* 
	 * allocate the devices -- we can't have them static, as the number
	 * can be specified at load time
	 */
	scullc_devices = kmalloc(scullc_devs*sizeof (struct scullc_dev), GFP_KERNEL);
	if (!scullc_devices) {
		result = -ENOMEM;
		goto fail_malloc;
	}
	memset(scullc_devices, 0, scullc_devs*sizeof (struct scullc_dev));
	for (i = 0; i < scullc_devs; i++) {
		scullc_devices[i].quantum = scullc_quantum;
		scullc_devices[i].qset = scullc_qset;
		mutex_init (&scullc_devices[i].lock);
		scullc_setup_cdev(scullc_devices + i, i);
	}

	scullc_cache = kmem_cache_create("scullc", scullc_quantum,
			0, SLAB_HWCACHE_ALIGN, NULL); /* no ctor/dtor */
	if (!scullc_cache) {
		scullc_cleanup();
		return -ENOMEM;
	}

在follow的时候,流程和之前倒是差不多。最后一个区别就是在scullc_trim清理的时候,用的kmem_cache_free。

	for (dptr = dev; dptr; dptr = next) { /* all the list items */
		if (dptr->data) {
			for (i = 0; i < qset; i++)
				if (dptr->data[i])
					kmem_cache_free(scullc_cache, dptr->data[i]);

			kfree(dptr->data);
			dptr->data=NULL;
		}
		next=dptr->next;
		if (dptr != dev) kfree(dptr); /* all of them but the first */
	}

这种分配方式的解答如下:

别是对于频繁分配和释放相同类型内存块(如 scullc 设备所需的内存块)的情况。通过kmem_cache_alloc和kmem_cache_free函数,scullc 能够更加高效地利用内存,并且减少内存碎片的产生。对内存的使用效率和数据的一致性有较高要求时,例如,在开发一个网络设备驱动或者一个共享的存储设备驱动时,scullc 的这些特性可以更好地满足需求。

评估:


2.2 scullp(Scull with whole page)

作用:使用整页的内存。

在scullp_init的时候,和基本版没有区别。

在write的时候:

int quantum = PAGE_SIZE << dev->order;
...
	/* Here's the allocation of a single quantum */
	if (!dptr->data[s_pos]) {
		dptr->data[s_pos] =
			(void *)__get_free_pages(GFP_KERNEL, dptr->order);
		if (!dptr->data[s_pos])
			goto nomem;
		memset(dptr->data[s_pos], 0, PAGE_SIZE << dptr->order);
	}

分配默认4000byte的空间的时候,使用__get_free_pages来获取。

read的时候倒是差不多。

在scullp_trim的时候,使用:

			/* This code frees a whole quantum-set */
			for (i = 0; i < qset; i++)
				if (dptr->data[i])
					free_pages((unsigned long)(dptr->data[i]),
							dptr->order);

说明如下:

scullp 由于是页面对齐的内存分配,数据存储相对更加规整。在进行读写操作时,能够更好地利用现代处理器的缓存机制。因为数据在内存中的分布更加符合页的边界,处理器在缓存数据时可以更高效地将整页数据加载到缓存中。

例如,在读取数据时,如果要读取的数据位于同一页或者相邻的页内,scullp 可以更方便地利用内存的局部性原理,减少内存访问的次数,从而提高数据读取的效率。在写入数据时,也更容易保证数据的连续性和完整性,因为它是以页为单位进行操作的。


2.3 scullv(Scull with Virtual Buffers)

作用:实现虚拟缓冲区管理。
大体和基本版还是一致的,区别还是在内存分配。

	/* follow the list up to the right position */
	dptr = scullv_follow(dev, item);
	if (!dptr->data) {
		dptr->data = kmalloc(qset * sizeof(void *), GFP_KERNEL);
		if (!dptr->data)
			goto nomem;
		memset(dptr->data, 0, qset * sizeof(char *));
	}
	/* Allocate a quantum using virtual addresses */
	if (!dptr->data[s_pos]) {
		dptr->data[s_pos] = (void *)vmalloc(PAGE_SIZE << dptr->order);
		if (!dptr->data[s_pos])
			goto nomem;
		memset(dptr->data[s_pos], 0, PAGE_SIZE << dptr->order);
	}

可以看到,块还是用的kmalloc,但是每一个缓冲用的vmalloc。

最后,在释放的时候,用的vfree。

	for (dptr = dev; dptr; dptr = next) { /* all the list items */
		if (dptr->data) {
			/* Release the quantum-set */
			for (i = 0; i < qset; i++)
				if (dptr->data[i])
					vfree(dptr->data[i]);

			kfree(dptr->data);
			dptr->data=NULL;
		}
		next=dptr->next;
		if (dptr != dev) kfree(dptr); /* all of them but the first */
	}


2.4 sculld(Scull with ...)

作用:基于设备缓冲区的扩展版本。

在init的时候,多了一个注册函数:

	/*
	 * Register with the driver core.
	 */
	register_ldd_driver(&sculld_driver);

cleanup的时候,要取消注册。

unregister_ldd_driver(&sculld_driver);

init时候每个设备也多了一个注册的函数:

static void sculld_register_dev(struct sculld_dev *dev, int index)
{
	snprintf(dev->devname, sizeof(dev->devname), "sculld%d", index);
	dev->ldev.name = dev->devname;
	dev->ldev.driver = &sculld_driver;
	dev_set_drvdata(&dev->ldev.dev, dev);
	register_ldd_device(&dev->ldev);
	device_create_file(&dev->ldev.dev, &dev_attr_dev);
}

仅此而已


2.5 scull-shared(Scull with Shared Buffers)

作用:模拟多个进程共享同一个缓冲区。

本来以为是使用了共享内存,结果里面只有几个函数。

3 小结

接口用途推荐场景
kmalloc 小块物理连续内存DMA 或少量内存分配
kmem_cache_alloc固定大小对象内存分配,频繁分配/释放结构体对象的内存管理
vmalloc 大块虚拟连续但物理不连续内存 大块非 DMA 数据存储(如大型数组、表)
__get_free_pages中等大小的物理连续内存,灵活需要手动管理中等大小内存块

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

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

相关文章

设计模式の状态策略责任链模式

文章目录 前言一、状态模式二、策略模式三、责任链模式 前言 本篇是关于设计模式中的状态模式、策略模式、以及责任链模式的学习笔记。 一、状态模式 状态模式是一种行为设计模式&#xff0c;核心思想在于&#xff0c;使某个对象在其内部状态改变时&#xff0c;改变该对象的行为…

【网络协议】路由信息协议 (RIP)

未经许可&#xff0c;不得转载。 路由信息协议&#xff08;Routing Information Protocol&#xff0c;简称 RIP&#xff09;是一种使用跳数&#xff08;hop count&#xff09;作为路由度量标准的路由协议&#xff0c;用于确定源网络和目标网络之间的最佳路径。 文章目录 什么是…

linux下安装达梦数据库v8详解

目录 操作系统、数据库 1、下载达梦数据库 2、安装前准备 2.1、建立数据库用户和组 2.2、修改文件打开最大数 2.3、挂载镜像 2.4、新建安装目录 3、数据库安装 4、配置环境变量 5、初始化数据库实例 6、注册服务 7、使用数据库 8、卸载数据库 9、多实例管理 10、…

小程序租赁系统的优势与应用探索

内容概要 小程序租赁系统&#xff0c;听起来很高大上&#xff0c;但实际上它比你想象的要实用得多&#xff01;设想一下&#xff0c;几乎所有的租赁需求都能通过手机轻松解决。这种系统的便捷性体现在让用户随时随地都能发起租赁请求&#xff0c;而不再受制于传统繁琐的手续。…

(leetcode算法题)​122. 买卖股票的最佳时机 II​ 和 123. 买卖股票的最佳时机 III

这两个题都可以进行转化&#xff0c;转换成等价问题求解 对于122的等价转换 求出所有能够赚钱的区间&#xff0c;这些区间满足一下特点 1. 首尾相接&#xff0c; 2. 区间末尾的值大于区间开头的值 3. 每个区间尽可能的小 新的问题只要用贪心的思想就能求得问题的解 只要求出上…

oceanbase集群访问异常问题处理

1.报错现象 2.问题排查 检查obproxy状态发现为不可用状态 重启obproxy 依次重启Obproxy集群 观察任务状态 重启完成 Obproxy状态正常 3.验证登录 登录成功

WeNet:面向生产的流式和非流式端到端语音识别工具包

这篇文章介绍了WeNet&#xff0c;一个面向生产的开源端到端&#xff08;E2E&#xff09;语音识别工具包。WeNet的主要特点和贡献如下&#xff1a; 统一流式和非流式识别&#xff1a;提出了一种名为U2的两阶段框架&#xff0c;能够在单一模型中同时支持流式和非流式语音识别&…

ArcGIS计算矢量要素集中每一个面的遥感影像平均值、最大值等统计指标

本文介绍在ArcMap软件中&#xff0c;基于矢量面要素集&#xff0c;计算在其中每一个面区域内&#xff0c;遥感影像的像元个数、平均值、总和等统计值&#xff0c;并将统计信息附加到矢量图层的属性表中的方法。 首先&#xff0c;明确一下本文的需求。现在有一个矢量面要素集&am…

Wallpaper壁纸制作学习记录13

骨骼物理模拟 Wallpaper Engine还允许您为人偶变形骨骼配置某些物理模拟。选择骨骼时&#xff0c;点击编辑约束来配置骨骼这些属性。 警告 请记住&#xff0c;物理模拟可能会根据用户的最大FPS设置略微改变其行为。 Wallpaper Engine编辑器将始终以高帧速率渲染。您可以将壁纸…

CertiK《Hack3d:2024年度安全报告》(附报告全文链接)

CertiK《Hack3d&#xff1a;2024年度安全报告》现已发布&#xff0c;本次报告深入分析了2024年Web3.0领域的安全状况。2024年损失总额超过23亿美元&#xff0c;同比增幅高达31.61%&#xff1b;其中&#xff0c;12月的损失金额最少。过去一年&#xff0c;网络钓鱼攻击和私钥泄露…

SpiderFlow平台v0.5.0之数据库连接

一、寻找lib目录安装方式 在 SpiderFlow 平台中&#xff0c;连接数据库时需要指定数据库的 DriverClassName&#xff0c;并确保正确配置数据库驱动。通常&#xff0c;驱动文件&#xff08;JAR 文件&#xff09;需要放置在指定的文件夹中&#xff0c;以便 SpiderFlow 可以找到并…

如何在notepad++里面,修改注释颜色

问题&#xff1a;我使用notepad加载.bib格式的文件&#xff0c;我想把第一行的GSA弄成紫色的&#xff0c;并且注释的格式是&#xff1a;%注释% 实现以后得效果展示&#xff1a; 接下来进行一步步讲解。 1. 不同的文件使用的语言不同&#xff0c;于是需要自己创建一个语言。如…

生态碳汇涡度相关监测与通量数据分析实践技术应用

1.以涡度通量塔的高频观测数据为例&#xff0c;基于MATLAB开展上机操作&#xff1a; 2.涡度通量观测基本概况&#xff1a;观测技术方法、数据获取与预处理等 3.涡度通量数据质量控制&#xff1a;通量数据异常值识别与剔除等 4.涡度通量数据缺失插补&#xff1a;结合气象数据…

[QT]控件的核心属性

一、控件的核心属性 1.enable属性 表示一个控件是否可用&#xff0c;可以用isEnabled()接口获取到当前控件的可用状态&#xff0c;同时来提供了setEnabled()接口设置控件是否可用&#xff0c;传递的参数为true和false。 isEnabled(); setEnabled(bool); Demo&#xff1a;通过一…

Vue 3 slot/插槽继承使用方法示例(基于 Ant Design Vue)

目录 Vue 3 插槽继承使用方法示例&#xff08;基于 Ant Design Vue&#xff09; 实例演示 背景 问题 解决方案&#xff1a;插槽继承 如何解决 插槽继承的原理 实现步骤 1. 子组件&#xff1a;封装 EaAutoComplete.vue 说明&#xff1a; 2. 父组件&#xff1a;自定义插…

成立一家无人机培训机构需要哪些基础配置

成立一家无人机培训机构&#xff0c;需要一系列基础配置来确保教学质量、学员安全以及机构的正常运营。以下是根据公开发布的信息整理出的关键基础配置&#xff1a; 一、场地配置 1. 飞行场&#xff1a;提供一个安全、宽敞的室外飞行环境&#xff0c;面积最好大于三千平米&…

【ACCSS】2024年亚信安全云认证专家题库

文件包含&#xff1a; 亚信安全ACCSS认证2019年真题&#xff08;1&#xff09; 亚信安全ACCSS认证2019年真题&#xff08;2&#xff09; 亚信安全ACCSS认证2019年真题&#xff08;3&#xff09; 亚信安全ACCSS认证2020年真题&#xff08;1&#xff09; 亚信安全ACCSS认证2020年…

探索 JMeter While Controller:循环测试的奇妙世界

嘿&#xff0c;宝子们&#xff01;今天咱们就来聊聊 JMeter 里超级厉害的 While 控制器&#xff0c;它就像是一把神奇的钥匙&#xff0c;能帮我们打开循环测试的大门&#xff0c;模拟出各种各样复杂又有趣的场景哦&#xff01; 一、While 控制器初印象 想象一下&#xff0c;你…

麒麟信安云在长沙某银行的应用入选“云建设与应用领航计划(2024)”,打造湖湘金融云化升级优质范本

12月26日&#xff0c;2024云计算产业和标准应用大会在北京成功召开。大会汇集政产学研用各方专家学者&#xff0c;共同探讨云计算产业发展方向和未来机遇&#xff0c;展示云计算标准化工作重要成果。 会上&#xff0c;云建设与应用领航计划&#xff08;2024&#xff09;建云用…

LeetCode算法题——螺旋矩阵ll

题目描述 给你一个正整数n&#xff0c;生成一个包含1到n2所有元素&#xff0c;且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix 。 示例 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]题解 思路&#xff1a; 将整个过程分解为逐圈填充的过程&#xf…