内核驱动篇九--设备模型

  • 一、起源
  • 二、新方案
    • 2.1 sysfs: 一种用内存模拟的文件系统,系统启动时mount到/sys目录
    • 2.2 uevent
  • 三、代码中自动mknod

一、起源

linux内核开发前期,仅devfs,导致开发不方便以及一些功能难以支持:

  1. 热插拔
  2. 不支持一些针对所有设备的统一操作(如电源管理)
  3. 不能自动mknod
  4. 用户查看不了设备信息
  5. 设备信息硬编码,导致驱动代码通用性差,即没有分离设备和驱动

二、新方案

linux内核在3.0以后引入了设备树的机制与新的开发方法

uevent机制:sysfs + uevent + udevd(上层app)

2.1 sysfs: 一种用内存模拟的文件系统,系统启动时mount到/sys目录

sysfs用途:(类似于windows的设备管理器)

  1. 建立系统中总线、驱动、设备三者之间的桥梁
  2. 向用户空间展示内核中各种设备的拓扑图
  3. 提供给用户空间对设备获取信息和操作的接口,部分取代ioctl功能
sysfs在内核中的组成要素 在用户空间/sys下的显示
内核对象(kobject) 目录
对象属性(attribute) 文件
对象关系(relationship) 链接(Symbolic Link)

四个基本结构

类型 所包含的内容 内核数据结构 对应/sys项
设备(Devices) 设备是此模型中最基本的类型,以设备本身的连接按层次组织 struct device /sys/devices/?/?/…/
驱动(Drivers) 在一个系统中安装多个相同设备,只需要一份驱动程序的支持 struct device_driver /sys/bus/pci/drivers/?/
总线(Bus) 在整个总线级别对此总线上连接的所有设备进行管理 struct bus_type /sys/bus/?/
类别(Classes) 这是按照功能进行分类组织的设备层次树;如 USB 接口和 PS/2 接口的鼠标都是输入设备,都会出现在/sys/class/input/下 struct class /sys/class/?/

目录组织结构:

/sys下的子目录 所包含的内容
/sys/devices 这是内核对系统中所有设备的分层次表达模型,也是/sys文件系统管理设备的最重要的目录结构;
/sys/dev 这个目录下维护一个按字符设备和块设备的主次号码(major:minor)链接到真实的设备(/sys/devices下)的符号链接文件;
/sys/bus 这是内核设备按总线类型分层放置的目录结构, devices 中的所有设备都是连接于某种总线之下,在这里的每一种具体总线之下可以找到每一个具体设备的符号链接,它也是构成 Linux 统一设备模型的一部分;
/sys/class 这是按照设备功能分类的设备模型,如系统所有输入设备都会出现在/sys/class/input 之下,而不论它们是以何种总线连接到系统。它也是构成 Linux 统一设备模型的一部分;
/sys/kernel 这里是内核所有可调整参数的位置,目前只有 uevent_helper, kexec_loaded, mm, 和新式的slab 分配器等几项较新的设计在使用它,其它内核可调整参数仍然位于sysctl(/proc/sys/kernel) 接口中;
/sys/module 这里有系统中所有模块的信息,不论这些模块是以内联(inlined)方式编译到内核映像文件(vmlinuz)中还是编译为外部模块(ko文件),都可能会出现在/sys/module 中
/sys/power 这里是系统中电源选项,这个目录下有几个属性文件可以用于控制整个机器的电源状态,如可以向其中写入控制命令让机器关机、重启等。

2.2 uevent


三、代码中自动mknod

struct class *class_create(struct module *owner, const char *name);
/** 功能:在/sys/class生成一个目录,目录名由name指定* 参数:struct module *owner - THIS_MODULEconst char *name - 目录名* 返回值  成功:class指针   失败:NULL
*/
/*
辅助接口:可以定义一个struct class 的指针变量cls来接受返回值,然后通过IS_ERR(cls)判断是否失败;
IS_ERR(cls);成功----------------->0
IS_ERR(cls);失败----------------->非0
PTR_ERR(cls);来获得失败的返回错误码;
*/
void class_destroy(struct class *cls)
/*
* 功能:删除class_create生成目录
* 参数:struct class *cls - class指针
* 返回值
*/
struct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, ...)
/** 功能:在/sys/class目录下class_create生成目录再生成一个子目录与该设备相对应,发uevent让应用程序udevd创建设备文件* 参数:struct class *class - class指针struct device *parent - 父对象,一般NULLdev_t devt - 设备号void *drvdata - 驱动私有数据,一般NULLconst char *fmt - 字符串的格式... - 不定参数* 返回值成功:device指针失败:NULL*/
void device_destroy(struct class *class, dev_t devt)
/** 功能:删除device_create生成目录* 参数:struct class *class - class指针dev_t devt - 设备号* 返回值
*/

到这里就结束啦!

【Linux】内核驱动篇九--设备模型相关推荐

  1. linux内核创建节点,Linux内核驱动自动创建设备节点文件

    Linux下生成驱动设备节点文件的方法有3个:1.手动mknod:2.利用devfs:3.利用udev 在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上L ...

  2. Linux设备驱动篇——[I2C设备驱动-1]

    Linux 设备驱动篇之I2c设备驱动 fulinux 一.I2C驱动体系 虽然I2C硬件体系结构和协议都很容易理解,但是Linux I2C驱动体系结构却有相当的复杂度,它主要由3部分组成,即I2C设 ...

  3. Linux内核学习-字符设备驱动学习(二)

    在Linux内核学习-字符设备驱动学习(一)中编写字符设备驱动的一种方法,但是需要手动创建设备节点. 有没有能够自动的创建设备节点的呢? 有!使用class_create()和device_creat ...

  4. linux内核创建字符节点,Tiny6410学习ing—(四)、嵌入式Linux内核驱动进阶—(7)、高级字符设备驱动(自动创建节点)—#931...

    按照国嵌的视频教程上来说的,最后就是-自动创建设备文件! 其实我感觉以前完全可以直接是手动创建了设备文件,然后就可以直接讲述自动创建设备文件,为啥非要拖到最后来讲述,我也就不清楚了!! 不管了,写完收 ...

  5. 树莓派基于Linux内核驱动开发详解

    一.驱动认知 首先理解Linux内核框图 文件系统认知,Linux内核框图 1.什么是驱动 linux内核驱动.软件层面上的驱动 广义上是指:这一段代码操作了硬件去动,所以这一段代码就叫硬件的驱动程序 ...

  6. Linux内核驱动之efi-rtc

    Linux内核驱动之efi-rtc 1. UEFI与BIOS概述 1.1. BIOS 概述 1.1.1. BIOS缺点: 1.1.2. BIOS的启动流程 1.2 UEFI 概述 1.2.1 Boot ...

  7. 从入门到精通ARM(4412)-Linux内核驱动编程【下】-李志勇-专题视频课程

    从入门到精通ARM(4412)-Linux内核驱动编程[下]-247人已学习 课程介绍         嵌入式绝对是当前IT领域最炙手可热的话题了.其主要应用领域涵盖与人类相关的各行各业: * 消费电 ...

  8. 嵌入式 Linux 内核驱动开发【The first day: 36093万字】

    嵌入式 Linux 内核驱动开发[1] 嵌入式 Linux 内核驱动开发前言 第1章 Linux 内核裁剪和定制 [1]Linux 内核开发简介 [2] Linux 源码阅读工具 [1.2.1]Sou ...

  9. Linux内核基础篇——常用调试技巧汇总

    文章目录 printk 动态输出 BUG()和BUG_ON() dump_stack() devmem printk printk共有8个等级,从0-7,等级依次降低. 打印等级可以通过修改/proc ...

最新文章

  1. 如何修改路由器和交换机的密码
  2. 【运筹学】表上作业法 ( 求初始基可行解 | 最小元素法 )
  3. 【Paper】2006_Time-Optimal Control of a Hovering Quad-Rotor Helicopter
  4. ISA Server 2007 beta TAP 开始招人
  5. 可汗学院统计学笔记 42-81集
  6. 35 MM配置-采购-采购订单-设置价格差异的容差限制
  7. 如何读出烧录程序.bin的数据_如何改变程序搜索数据的方式?使用Redis进行搜索...
  8. 帆软高级函数应用之时间函数
  9. excel有多行不同内容需要向下填充
  10. C++标准模板库(STL)(3) 之 vector map容器快速学习 (自学笔记)
  11. ViewBinding
  12. 我的世界Java存档转移_我的世界怎么导入本地地图_我的世界中国版怎么导入地图_我的世界怎么导入存档...
  13. oracle提取违反,ORA-01002: 提取违反顺序的问题分析
  14. 面试笔记@MySQL
  15. 网络数据包最大长度 MTU 分片 科普
  16. Photoshop 快速抠图:使用快速选择工具
  17. Scott 数据 映射 MySQL
  18. socket编程--搜索百度歌曲
  19. 小米6卸载html,小米手机驱动程序如何删除(附驱动程序卸载的步骤)
  20. 手机代工成利润增长点,“霸主”比亚迪要退位了?

热门文章

  1. 阿里云对象存储服务OSS前后联调
  2. MLY -- 14.Evaluating multiple ideas in parallel during error analysis
  3. Tomcat配置数据库连接池
  4. 崩坏3服务器维护多久,崩坏34月25日停机维护到几点_4月25日崩坏3停机维护时间_玩游戏网...
  5. 提前还贷怎样才划算 多还本金减少期限最划算
  6. crt上传数据_使用SecureCRT上传文件到Linux服务器
  7. ENE轨道线的选股公式
  8. 和ChatGPT的一番对话
  9. 年底谷歌扎堆升职,L3到L6升一级多$10w
  10. 使用Blender导出多个动画的GLTF模型