I.MX6ULL内核开发8:linux设备驱动模型

news2024/9/24 5:23:46

目录

一、为什么需要设备驱动模型

二、sysfs概述

驱动模型一

驱动模型二

kobject

kset

kobj_type


一、为什么需要设备驱动模型

  • 早期内核(2.4之前)没有统一的设备驱动模型,但是照样可以使用(之前的led字符设备驱动),比较麻烦;
  • 2.4~2.6期间使用devfs,挂载在/dev目录(需要在内核驱动中创建设备文件(devfs_register),命名死板);
  • 2.6以后使用sysfs,挂载/sys目录(1、将设备分类、分层统一进行管理;2、配合udev/mdev守护进程动态创建设备文件,命名规则自由制定);

二、sysfs概述

linux系统通过sysfs体现设备驱动模型

  • sysfs是一个虚拟文件系统(类似proc文件系统)
  • 目录对应的inode节点会记录基本驱动对象(kobject),从而将系统中的设备组成层级结构
  • 用户可以读写目录下不同文件来配置驱动对象(kobject)的不同属性

设备驱动模型基本元素

  • kobject:sysfs中的一个目录,常用来表示基本驱动对象,不允许发送消息到用户空间
  • kset:sysfs中的一个目录,常用来管理kobject,允许发送消息到用户空间
  • kobj_type:目录下属性文件的操作接口

驱动模型一

  •  kset可以批量管理kobject
  • kobject无法批量管理kobject

驱动模型二

kobject

sysfs中每一个目录都对应一个kobject

/home/geralt/linux_driver/kernel/ebf_linux_kernel_6ull_depth1/include/linux/kobject.h

struct kobject {
    // 用来表示kobject的名称
	const char		*name;
    // 链表节点
	struct list_head	entry;
    // 该kobject的上层节点,构建kobject之间的层次关系
	struct kobject		*parent;
    // 该kobject所属的kset对象,用于批量管理kobject对象
	struct kset		*kset;
    // 该kobject的sysfs文件系统相关联的操作和属性
	struct kobj_type	*ktype;
    // 该kobject在sysfs文件系统中对应目录项
	struct kernfs_node	*sd; /* sysfs directory entry */
    // 该kobject的引用次数
	struct kref		kref;
#ifdef CONFIG_DEBUG_KOBJECT_RELEASE
	struct delayed_work	release;
#endif
    // 记录内核对象的初始状态
	unsigned int state_initialized:1;
    表示该kobject所代表的内核对象有没有在sysfs建立目录
	unsigned int state_in_sysfs:1;
	unsigned int state_add_uevent_sent:1;
	unsigned int state_remove_uevent_sent:1;
	unsigned int uevent_suppress:1;
};

kset

struct kset {
    // 用于将起中的kobject对象构成链表
	struct list_head list;
    // 自旋锁
	spinlock_t list_lock;
    // 当前kset内核对象的kobject变量
	struct kobject kobj;
    // 定义一组函数指针,当kset中的某些kobject对象发生状态变化时需要通知用户空间时候,调用其中的函数来完成
	const struct kset_uevent_ops *uevent_ops;
} __randomize_layout;

kobj_type

struct kobj_type {
    // 销毁kobject对象时使用
	void (*release)(struct kobject *kobj);
    // kobject对象属性文件统一操作接口
	const struct sysfs_ops *sysfs_ops;
    // kobject默认属性文件的名字、”文件具体操作接口“
	struct attribute **default_attrs;
	const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
	const void *(*namespace)(struct kobject *kobj);
	void (*get_ownership)(struct kobject *kobj, kuid_t *uid, kgid_t *gid);
};

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

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

相关文章

2023-2-12刷题情况

字母板上的路径 题目描述 我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。 在本题里,字母板为board [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”],如下所示。 我们可以按下面的指令规则行动…

合宙Air103|fbd数据库| fskv - 替代fdb库|LuatOS-SOC接口|官方demo|学习(16):类redis的fbd数据库及fskv库

基础资料 基于Air103开发板:🚗 Air103 - LuatOS 文档 上手:开发上手 - LuatOS 文档 探讨重点 对官方社区库接口类redis的fbd数据库及fskv库的调用及示例进行复现及分析,了解两库的基本原理及操作方法。 软件及工具版本 Luat…

肝了几天的Git入门教程,收获满满

1.简介 谈及版本控制系统,或许大多数程序员最开始接触的都是SVN(Subversion),它是一个集中式的版本控制系统,使用的时候需要提供一台的服务器来进行部署,所有的更新与同步操作都需要与这台服务器进行交互&…

windows/linux下Qt可执行程序打包,linux桌面双击运行程序sh脚本

1、windows下Qt打包 windows下Qt的可执行文件打包简单的来说就是利用Qt自带依赖的打包工具windeployqt进行打包,该工具存在Qt安装目录下,执行命令为:windeployqt name.exe 打包依赖文件可参考如下链接中1-7步,后面的步骤是打包依…

156、【动态规划】AcWing ——3. 完全背包问题:二维数组+一维滚动数组(C++版本)

题目描述 原题链接:3. 完全背包问题 解题思路 完全背包相对于01背包来说,对同一个物品可以选择多次。而01背包对同一个物品只能选择一次。 递推公式上的区别:01背包是dp[i][j] max(dp[i - 1][j], dp[i - 1][j - v[i]] w[i]),…

14. 最长公共前缀

14. 最长公共前缀 一、题目描述: 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入:strs [“flower”,“flow”,“flight”] 输出:“fl” 示例 2: …

在线支付系列【23】支付宝支付接入指南

有道无术,术尚可求,有术无道,止于术。 文章目录前言接入指南1. 创建应用2. 绑定应用3. 配置密钥4. 上线应用5. 开通产品沙箱环境开发前准备(沙箱环境)1. 获取参数、秘钥、证书2. 下载支付宝客户端3. 案例演示前言 在之…

一个自动配置 opengrok 多项目的脚本

前段时间在服务器上配置 opengrok 阅读代码,项目有很多个,一个一个手动配置比较繁琐。 我从搭建 tomcat 和 opengrok,到配置和索引完 5 个 Android 项目,用了差不多一整天。 要是再让我手动配置几个项目,估计真要崩溃…

学习Request和Response这一篇就够啦~

Request(请求) : Request:获取请求数据 Response:设置响应数据 Request继承体系: 使用request对象,查阅JavaEE API文档的HttpServeltRequest接口 Tomcat需要解析请求数据,封装为request对象,并且创建requ…

知识图谱嵌入技术研究综述

作者 张天成 1 , * 田 雪 1 , * 孙相会 1 , * 于明鹤 2 , * 孙艳红 1 , * 于 戈 摘要 知识图谱 是一种用图模型来描述知识和建模事物之间的关联关系的技术。 知识图谱嵌入 作为一种被广泛采用的知识表示方法。 主要思想是将知识图谱中的实体和关系嵌入到连续的向量空间中…

Ansible---playbook剧本

目录 引言:什么是playbook? 一、Playbook 1.1、playbook中的核心元素 1.2、playbook中的基础组件 1.3、playbook格式说明 1.4、实例:httpd服务剧本 二、playbook中的模块 2.1、Templates 模块 2.2、tags 模块 2.3、Roles 模块 引言&…

关于链表中插入结点的操作……

服了,好久没敲链表了,这都忘了 newnode->next cur->next; cur->next newnode; newnode->next cur->next; cur->next newnode; newnode->next cur->next; cur->next newnode; newnode->next cur->next; cur-…

科技常识就像雨衣,要常备哦

科技常识就像雨衣,平常不准备,遇雨成落汤鸡 昨日晨跑遇雨,随身带轻便雨塑料雨衣 趣讲大白话:晴天挖水渠 *********** 信息科技是现代科技的【火车头】 往前看:要关注趋势 往后看:要了解行业历史 在当下&…

数据结构 | 栈与队列

🔥Go for it!🔥 📝个人主页:按键难防 📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 📖系列专栏:数据结构与算法 &#x1f52…

使用C#编写k8s CRD Controller

本文项目地址:k8s-crd - Repos (azure.com)CRDCRD指的是Custom Resource Definition。开发者更多的关注k8s对于容器的编排与调度,这也是k8s最初惊艳开发者的地方。而k8s最具价值的地方是它提供了一套标准化、跨厂商的 API、结构和语义。k8s将它拥有的一切…

【测试开发】web 自动化测试实战 --- MuiscServerTest

目录界面测试功能测试1. 登录注册模块功能测试2. 音乐列表页自动化测试3. 喜欢音乐列表页自动化测试4. 上传音乐模块自动化测试5. 以上所有测试用例集成测试套件项目测试亮点web 自动化测试实战就通过测试自己的 onlinemusicserver 音乐服务器项目进行测试,通过 sel…

冰冰学习笔记:多线程

欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正。 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位…

基于TimeQuest时序优化原理和方法

💡 回顾基于RTL逻辑时序优化的基本思路,在关键路径中插入寄存器来优化时序 分析最坏路径 通过前面对TimeQuest软件的理解,基本上可以找到关键路径,此文章主要对关键路径时序进行优化,使设计达到时序要求,以…

RibbitMQ 入门到应用 ( 一 ) 基本概念

1.什么是RabbitMQ 1.0.什么是MQ 1.1.RabbitMQ简介 消息队列提供一个异步通信机制,消息的发送者不必一直等待到消息被成功处理才返回,而是立即返回。消息中间件负责处理网络通信,如果网络连接不可用,消息被暂存于队列当中&#…

基于YOLOV5的钢材缺陷检测

数据和源码见文末 1.任务概述 数据集使用的是东北大学收集的一个钢材缺陷检测数据集,需要检测出钢材表面的6种划痕。同时,数据集格式是VOC格式,需要进行转化,上传的源码中的数据集是经过转换格式的版本。 2.数据与标签配置方法 在数据集目录下,train文件夹下有训练集数据…