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);

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

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

相关文章

Java 语言实现快速排序算法

【引言】 快速排序算法是一种常用且高效的排序算法。它通过选择一个基准元素&#xff0c;并将数组分割成两个子数组&#xff0c;一边存放比基准元素小的元素&#xff0c;另一边存放比基准元素大的元素。然后递归地对这两个子数组进行排序&#xff0c;最终达到整个数组有序的目的…

【C修炼计划】卷壹 · 初识C语言

文章目录 卷壹 初识C语言一 C语言的起源二 C语言的特性三 C语言的应用范围四 C语言程序结构五 C语言书写规范六 C语言编译器安装附 参考资料 卷壹 初识C语言 一 C语言的起源 C语言的前生是B语言&#xff08;BCPL&#xff0c;一种早期的高级语言&#xff09;。下图描…

c++多线程中常用的使用方法

1)promise(保证)和future的联合使用&#xff0c;实现两个线程的数据传递 #include <iostream> #include<thread> #include<future>using namespace std;//promise用法&#xff1a;可以给线程一个值&#xff0c;而从另一个线程读出该值 // 实现了两个线程的数…

Flink常用函数

1、比较函数 <> > > < < 注意&#xff1a;select nullnull; 返回为nullIS NULL 、 IS NOT NULL --非空判断value1 IS DISTINCT FROM value2、value1 IS NOT DISTINCT FROM value2、 --不同于value1 BETWEEN [ ASYMMETRIC | S OR 、AND、NOT boolean…

VMware虚拟机---Ubuntu无法连接网络该怎么解决?

在学习使用Linux系统时&#xff0c;由于多数同学们的PC上多是Windows系统&#xff0c;故会选择使用VMware创建一个虚拟机来安装Linux系统进行学习。 安装完成之后&#xff0c;在使用时总是会遇到各种各样的问题。本片随笔就主要针对可能出现的网络问题进行一个总结&#xff0c;…

物种气候生态位动态量化与分布特征模拟

在全球气候快速变化的背景下&#xff0c;理解并预测生物种群如何应对气候变化&#xff0c;特别是它们的地理分布如何变化&#xff0c;已经变得至关重要。利用R语言进行物种气候生态位动态量化与分布特征模拟&#xff0c;不仅可以量化描述物种对环境的需求和适应性&#xff0c;预…

限流算法深入

限流定义及目的 当系统流量达到系统或下游承受能力的阈值时对系统进行限流控制以防止系统或下游挂掉&#xff0c;减少影响面。 限流组成&#xff1a;阈值及限流策略。阈值是指系统单位时间接收到的请求qps总数&#xff1b;限流策略是指限流行业触发后对应的系统行为&#xff…

FPGA GTX全网最细讲解,aurora 8b/10b协议,HDMI板对板视频传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTX 全网最细解读GTX 基本结构GTX 发送和接收处理流程GTX 的参考时钟GTX 发送接口GTX 接收接口GTX IP核调用和使用 4、设计思路框架视频源选择IT6802解码芯片配置及采集动态彩条视频数据组包GTX aurora 8b/10b数据…

Django(5)-视图函数和模板渲染

Django 中的视图的概念是「一类具有相同功能和模板的网页的集合」 在我们的投票应用中&#xff0c;我们需要下列几个视图&#xff1a; 问题索引页——展示最近的几个投票问题。 问题详情页——展示某个投票的问题和不带结果的选项列表。 问题结果页——展示某个投票的结果。 投…

SVN 项目管理笔记

SVN 项目管理笔记 主要是介绍 SVN 管理项目的常用操作&#xff0c;方便以后查阅&#xff01;&#xff01;&#xff01; 一、本地项目提交到SVN流程 在SVN仓库下创建和项目名同样的文件夹目录&#xff1b;选中本地项目文件&#xff0c;选择SVN->checkout,第一个是远程仓库项…

大数据Flink实时计算技术

1、架构 2、应用场景 Flink 功能强大&#xff0c;支持开发和运行多种不同种类的应用程序。它的主要特性包括&#xff1a;批流一体化、精密的状态管理、事件时间支持以及精确一次的状态一致性保障等。在启用高可用选项的情况下&#xff0c;它不存在单点失效问题。事实证明&#…

vue 学习笔记 简单实验

1.代码(html) <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"counter">Counter: {{ counter }} </div> <script> const Counter {data() {return {counter: 5}} } Vue.cr…

java-便签

--其实最痛的。不是离别。而是离别后的那些回忆。 java length( ) javalength中文占多长 1.一个中文字符或符号 2 个字节&#xff0c;一个英文字符或符号 1 个字节。 System.out.println("abc你好&#xff0c;".getBytes("gbk").length); System.out.pr…

【Linux】【驱动】驱动挂载的时候给驱动传递参数

【Linux】【驱动】驱动挂载的时候给驱动传递参数 绪论1.什么是驱动传参驱动传参就是传递参数给我们的驱动举例:2.驱动传参数有什么作用呢?3. 传递单个参数使用如下的数组4. 传递数组使用以下函数&#xff1a; 传递数字值代码指令 传递数组代码传递数组指令 绪论 1.什么是驱动…

C语言(第二十九天)

1.2.2 文件结构设计 之前学习了多文件的形式对函数的声明和定义&#xff0c;这里我们实践一下&#xff0c;我们设计三个文件&#xff1a; test.c //文件中写游戏的测试逻辑 game.c //文件中写游戏中函数的实现等 game.h //文件中写游戏需要的数据类型和函数声明等 2. 扫雷游戏的…

如何拼接两个视频在一起?

如何拼接两个视频在一起&#xff1f;在度过一个美好周末的时候&#xff0c;我和朋友一起拍摄了两组视频&#xff0c;准备将两个视频合并成一个并发布到朋友圈。这个想法非常棒&#xff0c;但是我在第一步就遇到了麻烦&#xff1a;如何将这两个视频拼接在一起&#xff1f;这听起…

Go 自学:struct结构体

以下代码展示如何建立一个结构体struct。 我们可以使用%v查看结构体的详情。 package mainimport ("fmt" )func main() {Jeff : User{"Jeff", "Jeffgo.dev", true, 16}fmt.Println((Jeff))fmt.Printf("Jeff details are: %v\n", Jeff…

7天GMV达220万美元!TikTok Shop爆品榜出炉。

7天GMV达220万美元&#xff01;TikTok Shop爆品榜出炉 8月28日消息&#xff0c;据跨境指南联合TikTok数据分析平台EchoTik发布的数据&#xff0c;监测了上周TikTok Shop印尼、马来西亚、泰国、美国市场GMV前10的商品。上周在印尼市场GMV排名前10的商品中&#xff1a;FREE ONGK…

RPA是什么样的机器人技术?RPA可以实现哪些流程的自动化?

一、RPA是什么样的机器人技术&#xff1f; RPA&#xff08;Robotic Process Automation&#xff09;即机器人流程自动化&#xff0c;是一种通过模拟人类在计算机系统上的操作&#xff0c;实现流程自动化的技术。RPA机器人可以代替人工执行各种重复性任务&#xff0c;如数据输入…

基于微服务、Java、Springcloud、Vue、MySQL开发的智慧工地管理系统源码

智慧工地聚焦施工现场岗位一线&#xff0c;围绕“人、机、料、法、环”五大要素&#xff0c;数字化工地平台与现场多个子系统的互联实现了工地业务间的互联互通和协同共享。数字化工地管理平台能够盘活工地各大项目之间孤立的信息系统&#xff0c;实现数据的统一接入、处理与维…