当前位置: 首页 > news >正文

linux scatterlist阅读三

sg_copy_buffer

函数定义:

/*** sg_copy_buffer - Copy data between a linear buffer and an SG list* @sgl:		 The SG list* @nents:		 Number of SG entries* @buf:		 Where to copy from* @buflen:		 The number of bytes to copy* @skip:		 Number of bytes to skip before copying* @to_buffer:		 transfer direction (true == from an sg list to a*			 buffer, false == from a buffer to an sg list** Returns the number of copied bytes.***/
size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents, void *buf, size_t buflen, off_t skip, bool to_buffer)
{unsigned int offset = 0;struct sg_mapping_iter miter;unsigned int sg_flags = SG_MITER_ATOMIC;if (to_buffer)sg_flags |= SG_MITER_FROM_SG;elsesg_flags |= SG_MITER_TO_SG;sg_miter_start(&miter, sgl, nents, sg_flags);if (!sg_miter_skip(&miter, skip))return false;while ((offset < buflen) && sg_miter_next(&miter)) {unsigned int len;len = min(miter.length, buflen - offset);if (to_buffer)memcpy(buf + offset, miter.addr, len);elsememcpy(miter.addr, buf + offset, len);offset += len;}sg_miter_stop(&miter);return offset;
}
EXPORT_SYMBOL(sg_copy_buffer);

函数实现比较复杂,还涉及了struct sg_mapping_iter 结构体,这里比较重要的是skip参数,是指拷贝时跳过的字节数。

sg_copy_from_buffer

函数定义:

/*** sg_copy_from_buffer - Copy from a linear buffer to an SG list* @sgl:		 The SG list* @nents:		 Number of SG entries* @buf:		 Where to copy from* @buflen:		 The number of bytes to copy* Returns the number of copied bytes.**/
size_t sg_copy_from_buffer(struct scatterlist *sgl, unsigned int nents,const void *buf, size_t buflen)
{return sg_copy_buffer(sgl, nents, (void *)buf, buflen, 0, false);
}
EXPORT_SYMBOL(sg_copy_from_buffer);

从buf缓冲区里拷贝buflen长度的数据到sgl表里,返回值是成功拷贝到字节数

sg_copy_to_buffer

/*** sg_copy_to_buffer - Copy from an SG list to a linear buffer* @sgl:		 The SG list* @nents:		 Number of SG entries* @buf:		 Where to copy to* @buflen:		 The number of bytes to copy** Returns the number of copied bytes.***/
size_t sg_copy_to_buffer(struct scatterlist *sgl, unsigned int nents,void *buf, size_t buflen)
{return sg_copy_buffer(sgl, nents, buf, buflen, 0, true);
}
EXPORT_SYMBOL(sg_copy_to_buffer);

sg_pcopy_from_buffer

/*** sg_pcopy_from_buffer - Copy from a linear buffer to an SG list* @sgl:		 The SG list* @nents:		 Number of SG entries* @buf:		 Where to copy from* @buflen:		 The number of bytes to copy* @skip:		 Number of bytes to skip before copying** Returns the number of copied bytes.***/
size_t sg_pcopy_from_buffer(struct scatterlist *sgl, unsigned int nents, const void *buf, size_t buflen, off_t skip)
{return sg_copy_buffer(sgl, nents, (void *)buf, buflen, skip, false);
}
EXPORT_SYMBOL(sg_pcopy_from_buffer);

sg_pcopy_to_buffer

/*** sg_pcopy_to_buffer - Copy from an SG list to a linear buffer* @sgl:		 The SG list* @nents:		 Number of SG entries* @buf:		 Where to copy to* @buflen:		 The number of bytes to copy* @skip:		 Number of bytes to skip before copying** Returns the number of copied bytes.***/
size_t sg_pcopy_to_buffer(struct scatterlist *sgl, unsigned int nents,void *buf, size_t buflen, off_t skip)
{return sg_copy_buffer(sgl, nents, buf, buflen, skip, true);
}
EXPORT_SYMBOL(sg_pcopy_to_buffer);

sg_zero_buffer

把skip后面的数据清0,比如sgl里面的数据是"abcde",skip等于2,调用函数以后,sgl里面的数据是"ab"

/*** sg_zero_buffer - Zero-out a part of a SG list* @sgl:		 The SG list* @nents:		 Number of SG entries* @buflen:		 The number of bytes to zero out* @skip:		 Number of bytes to skip before zeroing** Returns the number of bytes zeroed.**/
size_t sg_zero_buffer(struct scatterlist *sgl, unsigned int nents,size_t buflen, off_t skip)
{unsigned int offset = 0;struct sg_mapping_iter miter;unsigned int sg_flags = SG_MITER_ATOMIC | SG_MITER_TO_SG;sg_miter_start(&miter, sgl, nents, sg_flags);if (!sg_miter_skip(&miter, skip))return false;while (offset < buflen && sg_miter_next(&miter)) {unsigned int len;len = min(miter.length, buflen - offset);memset(miter.addr, 0, len);offset += len;}sg_miter_stop(&miter);return offset;
}
EXPORT_SYMBOL(sg_zero_buffer);

最后来个demo,看看怎么使用。

#include <linux/types.h>
#include <linux/fcntl.h>
#include <linux/hdreg.h>
#include <linux/genhd.h>
#include <linux/blkdev.h>
#include <linux/scatterlist.h>//struct sg_table sgt;struct scatterlist *sgl;
void *buf;/* 驱动出口函数 */
static int __init ramdisk_init(void)
{int i;void *buffer;struct scatterlist *sg;printk("sg init\n");sgl = (struct scatterlist *)kmalloc(sizeof(struct scatterlist) * 1, GFP_KERNEL);if(!sgl)return -1;buf = kmalloc(1000, GFP_KERNEL);if(!buf)return -1;buffer = kmalloc(100, GFP_KERNEL);if(!buffer)return -1;memset(buffer, 0, 100);memcpy(buffer, "hello world", 12);void *p;sg_init_one(sgl, buf, 1000);for_each_sg(sgl, sg, 1, i) {//sg_pcopy_from_buffer(sg, 1, buffer, 100, 5);sg_copy_from_buffer(sg, 1, buffer, 100);p = sg_virt(sg);//p = p + 5;printk("p = %s\n", (char *)p);memset(buffer, 0, 100);sg_pcopy_to_buffer(sg, 1, buffer, 100, 6);printk("buffer = %s\n", (char *)buffer);}kfree(buffer);return 0;
}/* 驱动出口函数 */
static void __exit ramdisk_exit(void)
{printk("sg exit\n");kfree(buf);kfree(sgl);
}module_init(ramdisk_init);
module_exit(ramdisk_exit);

相关文章:

linux scatterlist阅读三

sg_copy_buffer 函数定义&#xff1a; /*** sg_copy_buffer - Copy data between a linear buffer and an SG list* sgl: The SG list* nents: Number of SG entries* buf: Where to copy from* buflen: The number of bytes to copy* skip: Number of bytes to sk…...

2023新,centos7安装mysql8.0.25

2023新&#xff0c;centos7安装mysql8.0.25 目录 2023新&#xff0c;centos7安装mysql8.0.251、下载rpm文件2、安装3、配置my.cnf4、启动查看重启服务5、登入mysql并修改密码6、修改可以远程登录 1、下载rpm文件 进入到你想要的文件地址下 wget https://repo.mysql.com//mysq…...

Data Rescue Professional for Mac:专业的数据恢复工具

在数字化时代&#xff0c;我们的生活和工作离不开电脑和存储设备。但是&#xff0c;意外情况时常发生&#xff0c;例如误删除文件、格式化硬盘、病毒攻击等&#xff0c;这些都可能导致重要的数据丢失。面对数据丢失&#xff0c;我们迫切需要一款可靠的数据恢复工具。今天&#…...

新手小白想要做好跨境电商独立站,需要考虑哪些要素?

对于不少中小卖家而言&#xff0c;利用独立站出海已然成为下一个跨境热潮。但是采用独立站模式做出海生意前&#xff0c;卖家需要考虑哪些要素&#xff1f; 产品选择 对于国内的卖家来说&#xff0c;依托于国内强大的供应链优势&#xff0c;只要能把握住消费者心态&#xff0…...

Consul原理介绍

官方文档&#xff1a;https://www.consul.io/docs Raft动画演示&#xff1a;http://thesecretlivesofdata.com/raft/ 注册中心对比 Consul特点 服务发现、健康检查、Key/Value存储、安全服务通信&#xff08;TLS证书&#xff09;、多数据中心 架构 角色 数据中心 数据中心内…...

【C++实战】C++实现贪吃蛇(含源代码)—基于easyx图形库

食用指南&#xff1a;本文在有C基础的情况下食用更佳 &#x1f340;本文前置知识&#xff1a;C基础 ♈️今日夜电波&#xff1a;toge—あよ 0:36 ━━━━━━️&#x1f49f;──────── 4:03 &a…...

PHP获取两个日期之间的所有日期

下面是一个示例代码&#xff0c;用于计算给定开始和结束日期之间的所有日期&#xff1a; <?phpfunction getDatesBetween($start_date, $end_date) {// 初始化结果数组$dates array();// 将开始日期转换为时间戳$current_date strtotime($start_date);$end_date strtot…...

STL之stack(适配器讲解以及双端队列的讲解)

很多人在听到适配器的时候&#xff0c;应该都是懵的&#xff0c;因为对适配器的理解都是懵懵懂懂&#xff0c;其实他很好理解&#xff0c;就是相当于一个转换器。我们可以这样理解&#xff0c;就是现实当中是的插排一样&#xff0c;上面有三个孔的&#xff0c;也有两个孔的&…...

JVM解密: 解构类加载与GC垃圾回收机制

文章目录 一. JVM内存划分二. 类加载机制1. 类加载过程2. 双亲委派模型 三. GC垃圾回收机制1. 找到需要回收的内存1.1 哪些内存需要回收&#xff1f;1.2 基于引用计数找垃圾(Java不采取该方案)1.3 基于可达性分析找垃圾(Java采取方案) 2. 垃圾回收算法2.1 标记-清除算法2.2 标记…...

【Spring Boot】Spring Boot结合MyBatis简单实现学生信息管理模块

实战&#xff1a;实现学生信息管理模块 环境准备 JDKSpring BootMyBatis 创建Spring Boot项目 使用Spring Initializr创建一个新的Spring Boot项目&#xff0c;并添加以下依赖&#xff1a; Spring WebMyBatis FrameworkMySQL Driver 数据库设计 在MySQL数据库中创建一个名…...

【Java List与Map】List<T> Map与Map List<T>的区别(126)

List&#xff1c;T&#xff1e; Map&#xff1a;List里面的数据类型包含Map&#xff1b; Map List&#xff1c;T&#xff1e;&#xff1a;Map里面value的数据类型包含List&#xff1b; 测试案例&#xff1a; import java.util.ArrayList; import java.util.HashMap; import j…...

【FreeRTOS】常用函数总结

xTaskCreate()&#xff1a; 用法&#xff1a; xTaskCreate(taskFunction, taskName, stackSize, parameters, priority, taskHandle)参数&#xff1a; taskFunction&#xff1a;任务函数&#xff0c;即任务的入口函数。taskName&#xff1a;任务的名称。stackSize&#xff1a;任…...

The Cherno——OpenGL

The Cherno——OpenGL 1. 欢迎来到OpenGL OpenGL是一种跨平台的图形接口&#xff08;API&#xff09;&#xff0c;就是一大堆我们能够调用的函数去做一些与图像相关的事情。特殊的是&#xff0c;OpenGL允许我们访问GPU&#xff08;Graphics Processing Unit 图像处理单元&…...

linux中学习控制进程的要点

1. 进程创建 1.1 fork函数 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程中返回0&#xff0c;父进程返回子进程id&#xff0c;出错返回-1 进程调用fork&#xff0c;当控制转移到内核中的fork代码后&#xff0c;内核会做以下操作 分配新的内存块和…...

C++Qt QSS要注意的坑

qss源自css&#xff0c;相当于css的一个子集&#xff0c;主要支持的是css2标准&#xff0c;很多网上的css3的标准的写法在qss这里是不生效的&#xff0c;所以不要大惊小怪。 qss也不是完全支持所有的css2&#xff0c;比如text-align官方文档就有说明&#xff0c;只支持 QPushB…...

LeetCode每日一题:56. 合并区间(2023.8.27 C++)

目录 56. 合并区间 题目描述&#xff1a; 实现代码与解析&#xff1a; 排序 贪心 原理思路&#xff1a; 56. 合并区间 题目描述&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&…...

电视盒子什么牌子好?经销商整理线下热销电视盒子品牌排行榜

在面对众多品牌和型号时&#xff0c;不知道电视盒子哪个牌子好的消费者超多&#xff0c;很多人进店都会问我电视盒子哪款好&#xff1f;我根据店铺内近两年的销量情况整理了电视盒子品牌排行榜&#xff0c;看看实体店哪些电视盒子最值得入手吧。 TOP 1.泰捷WEBOX 40Pro Max电视…...

JavaScript关于函数的小挑战

题目 回到两个体操队&#xff0c;即海豚队和考拉队! 有一个新的体操项目&#xff0c;它的工作方式不同。 每队比赛3次&#xff0c;然后计算3次得分的平均值&#xff08;所以每队有一个平均分&#xff09;。 只有当一个团队的平均分至少是另一个团队的两倍时才会获胜。否则&…...

机器学习深度学习——针对序列级和词元级应用微调BERT

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——NLP实战&#xff08;自然语言推断——注意力机制实现&#xff09; &#x1f4da;订阅专栏&#xff1a;机…...

重启Mysql时报错rm: cannot remove ‘/var/lock/subsys/mysql‘: Permission denied

只有用mysql重启时报错&#xff0c;用root不报错 [mysqlt3-dtpoc-dtpoc-web04 bin]$ service mysql restart Shutting down MySQL.. SUCCESS! rm: cannot remove /var/lock/subsys/mysql: Permission denied Starting MySQL.. SUCCESS! [roott3-dtpoc-dtpoc-web04 ~]# serv…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...