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

设备驱动的私有数据设计

IIO子系统的私有数据

私有数据的完整使用流程:

// 定义私有数据结构
struct my_data {int calibration;u8 buffer[128];
};// 分配 IIO 设备(包含私有数据空间)
struct iio_dev *indio_dev = devm_iio_device_alloc(dev, sizeof(struct my_data));// 获取私有数据指针(关键步骤!)
struct my_data *data = iio_priv(indio_dev);// 初始化私有数据
data->calibration = 0x1234;

在Linux内核设计中(如Input,IIO子系统),通过以上代码操作私有数据的方式十分常见,他的本质是通过指针运算访问连续内存中的相邻区域,在devm_iio_device_alloc中,他会把堆空间设计为如下布局:

|--------------------------|-------------------------------|
| struct iio_dev (设备对象) | 私有数据 (private data)       |
|--------------------------|-------------------------------|
^                          ^
indio_dev                  iio_priv(indio_dev)

这样做能在初始化的时候把私有数据的大小确定,即指定私有数据的空间大小为my_data;而后的读写则通过访问固定偏移的地址即可

static inline void *iio_priv(const struct iio_dev *indio_dev)
{return (char *)indio_dev + ALIGN(sizeof(struct iio_dev), IIO_ALIGN);
}

对比包含void*的私有数据

Linux内核的IIO子系统(以及其他类似子系统)选择通过内存布局偏移量(如iio_priv())而不是在结构体中直接包含void*指针来访问私有数据,主要基于以下几个关键考虑:

  1. 内存效率优化
  • 单次分配:通过连续内存布局,设备和私有数据可以一次性分配完成(只需一次kmalloc)
  • 无额外指针开销:省去了void*指针本身占用的内存(在64位系统上节省8字节)
  • 缓存友好性:设备和私有数据物理上相邻,提高CPU缓存命中率
// 当前方案(紧凑):
[iio_dev][padding][private_data]// 如果使用void*(额外开销):
[iio_dev][void*][private_data]
  1. 性能优势
  • 减少内存访问:直接通过偏移量计算访问私有数据,省去了通过指针间接寻址的步骤

  • 避免二级跳转:传统void*方案需要先读取指针值,再通过指针访问数据,而偏移量方案只需一次地址计算

但void也并非没有优点,相比固定偏移的方案,void能够处理更为灵活的场景,比如私有数据需要动态调整大小的场景;但在内核底层,偏移量方案的优势更为关键。

http://www.dtcms.com/a/285253.html

相关文章:

  • yocto开发(1)----bitbake的全流程分析
  • 指针数组和数组指针的应用案例
  • js对象简介、内置对象
  • 聊聊数据和功能测试面临的挑战有哪些?
  • #systemverilog# 关键字之 变量声明周期与静态方法关系探讨
  • 美团外卖霸王餐接口对接具体操作步骤
  • NW972NW974美光固态闪存NW977NW981
  • 【读论文】AgentOrchestra 解读:LLM 智能体学会「团队协作」去解决复杂任务
  • 海思3516CV610 卷绕 研究
  • JxBrowser 8.9.2 版本发布啦!
  • Python22 —— 标准库(random库)
  • 简单手写一个Spring boot starter
  • flask request实现两台PC之间文件传输通信
  • 华夏基金(ChinaAMC)推出全球首只人民币计价的代币化货币基金
  • AUTOSAR进阶图解==>AUTOSAR_SWS_BusMirroring
  • lombok版本过低导致@SuperBuilder注解编译无法通过(java: 类型变量数目错误; 需要3)
  • Fiddler 中文版在移动开发中的调试应用 从抓包到性能调优
  • CMSIS DSP FFT
  • Linux探秘坊-------15.线程概念与控制
  • 内容安全策略(CSP)详解:Web安全的关键防线
  • SegNet:一种用于图像分割的深度卷积编码器解码器架构
  • 简单易懂,动态分区分配算法
  • Leetcode刷题营第二十九,三十题:二叉树的中序以及后序遍历
  • mongosh 安装记录
  • ruoyi-cloud启动常见问题处理
  • set、map 比数组,json 对象的性能更好原因分析
  • Python元组(Tuple)指南
  • [RAG system] 信息检索器 | BM25 Vector | Pickle格式 | HybridRetriever重排序
  • 教资科三【信息技术】— 学科知识: 第二章(计算机系统基础)
  • 【程序地址空间】虚拟地址与页表转化