操作系统实战 45 讲
彭东
网名 LMOS,Intel 傲腾项目关键开发者
65203 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 60 讲
尝尝鲜:从一个Hello到另一个Hello (2讲)
特别放送 (1讲)
操作系统实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

31 | 瞧一瞧Linux:如何获取所有设备信息?

测试驱动功能
加载内核模块
编写应用程序
读写
关闭
打开
注册设备
注册总线
内核模块退出函数
内核模块入口函数
操作该总线下所有设备的通用操作函数的指针
总线上设备的默认属性
总线的默认属性
总线名称
管理所有设备
自身包含一个kobject结构
挂载kobject结构的链表
指向所属的kset
指向父结构
挂入kset结构的链表
测试驱动
文件操作函数
建立设备
驱动程序框架
bus_type
kset
kobject
查看所有设备
对应内存中的设备
驱动程序实例
数据结构
/sys/bus目录
设备文件
Linux设备管理
总结脑图

该思维导图由 AI 生成,仅供参考

你好,我是 LMOS。
前面我们已经完成了 Cosmos 的驱动设备的建立,还写好了一个真实的设备驱动。
今天,我们就来看看 Linux 是如何管理设备的。我们将从 Linux 如何组织设备开始,然后研究设备驱动相关的数据结构,最后我们还是要一起写一个 Linux 设备驱动实例,这样才能真正理解它。

感受一下 Linux 下的设备信息

Linux 的设计哲学就是一切皆文件,各种设备在 Linux 系统下自然也是一个个文件。不过这个文件并不对应磁盘上的数据文件,而是对应着存在内存当中的设备文件。实际上,我们对设备文件进行操作,就等同于操作具体的设备。
既然我们了解万事万物,都是从最直观的感受开始的,想要理解 Linux 对设备的管理,自然也是同样的道理。那么 Linux 设备文件在哪个目录下呢?其实现在我们在 /sys/bus 目录下,就可以查看所有的设备了。
Linux 用 BUS(总线)组织设备和驱动,我们在 /sys/bus 目录下输入 tree 命令,就可以看到所有总线下的所有设备了,如下图所示。
Linux设备文件
上图中,显示了部分 Linux 设备文件,有些设备文件是链接到其它目录下文件,这不是重点,重点是你要在心中有这个目录层次结构,即总线目录下有设备目录,设备目录下是设备文件
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了在Linux系统中获取所有设备信息的方法,强调了Linux系统中一切皆文件的设计哲学,包括设备也是以文件形式存在于/sys/bus目录下。详细介绍了Linux设备管理的核心数据结构,包括kobject、kset和bus_type,以及它们在/sys目录下的组织结构。此外,还介绍了设备结构、驱动结构和文件操作函数的重要性和作用。通过实现一个真实的驱动程序实例来加深对Linux设备驱动的理解。文章还介绍了如何建立总线和设备,以及相应的注册和初始化过程。最后,通过实际操作和指令展示了如何加载和卸载内核模块,以及如何在终端中查看设备和总线的文件节点。整体而言,本文通过深入的技术细节和实例演示,帮助读者全面了解了Linux系统中获取设备信息的方法和原理。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《操作系统实战 45 讲》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • 艾恩凝
    置顶
    以前作为使用者去写驱动,现在以提供者的角度去分析驱动,又来到了熟悉的file_operations结构了,写过简单的内核2.6 和 3.4版本的驱动,每个版本都稍有区别,盲猜这个是5版本的,毕竟有些陌生的函数,刚才看到了一个评论驱动是如何操作硬件的,来个最简单的按键驱动就知道了,这还没谈谈设备树,设备树也应该谈谈,到底是哪个大聪明想到的设备树
    2022-05-09
    1
    1
  • neohope
    置顶
    关于驱动程序Demo 一、miscdrv是一个内核模块 1、四个操作函数,封装在file_operations结构中,包括: misc_open在打开设备文件时执行 misc_release在关闭设备文件时执行 misc_read在读取设备时执行 misc_write在写入设备时执行 file_operations又被封装在miscdevice中,在注册设备时传入 2、devicesinfo_bus_match函数用于总线设备的过滤,被封装在bus_type结构中 bus_type描述了总线结构,在总线注册时传入 3、module_init和module_exit声明入口和出口函数: miscdrv_init注册设备和总线,在安装内核模块时执行 miscdrv_exit反注册设备和总线,在卸载内核模块时执行 4、只有misc_read比较复杂: A、通过注册时的devicesinfo_bus获取kset,枚举kset中的每一个kobj B、对于每个kobj,通过container_of转换为subsys_private C、对于每个subsys_private,枚举其bus中每个设备,并通过misc_find_match函数进行处理 D、misc_find_match会在kmsg中输出设备名称 二、app.c 就是打开设备,写一下,读一下,关闭设备,主要是触发设备输出 三、执行顺序,需要两个Terminal,T1和T2 1、T1:make 2、T1:sudo insmod miscdrv.ko 3、T2:sudo cat /proc/kmsg 4、T1:sudo ./app 5、T2:ctrl+c 6、T1:sudo rmmod miscdrv.ko

    作者回复: 老铁 可谓 学习能力爆表

    2021-08-06
    10
  • neohope
    置顶
    关于数据结构 一、目录组织相关结构 kobject结构表示sysfs一个目录或者文件节点,同时提供了引用计数或生命周期管理相关功能; kset结构,可以看作一类特殊的kobject,可以作为kobject的集合;同时承担了发送用户消息的功能; Linux通过kobject和 kset来组织sysfs下的目录结构。但两者之间关系,却并非简单的文件和目录的关系。每个kobject的父节点,需要通过parent和kset两个属性来决定: A、无parent、无kset,则将在sysfs的根目录(即/sys/)下创建目录; B、无parent、有kset,则将在kset下创建目录;并将kobj加入kset.list; C、有parent、无kset,则将在parent下创建目录; D、有parent、有kset,则将在parent下创建目录,并将kobj加入kset.list; kobject和kset并不会单独被使用,而是嵌入到其他结构中发挥作用。 二、总线与设备结构 bus_type结构,表示一个总线,其中 subsys_private中包括了kset; device结构,表示一个设备,包括驱动指针、总线指针和kobject; device_driver结构,表示一个驱动,其中 driver_private包括了kobject; 上面说的kset和kobject的目录组织关系,起始就是存在于这些数据结构中的; 通过kset和kobject就可以实现总线查找、设备查找等功能; 三、初始化 全局kset指针devices_kset管理所有设备 全局kset指针bus_kset管理所有总线 初始化调用链路: kernel_init->kernel_init_freeable->do_basic_setup->driver_init ->devices_init设备初始化 ->buses_init总线初始化 四、设备功能函数调用 miscdevice结构,表示一个杂项设备; 其中 file_operations包含了全部功能函数指针; 以打开一个设备文件为例,其调用链路为: filp_open->file_open_name->do_filp_open->path_openat->do_o_path->vfs_open->do_dentry_open 通过file_operations获取了open函数指针,并进行了调用

    作者回复: 是的 哈哈

    2021-08-06
    9
  • 青玉白露
    在Linux系统中,sudo可以获取超级用户的权利,它之后的命令可以在内核态下进行工作。 而加载miscdrv.ko模块和app测试都需要在内核态下进行。

    作者回复: 是的

    2021-07-19
    2
    6
  • pedro
    加载内核模块,使用内核驱动,得 sudo 权限

    作者回复: 哈哈 这问题又太简单了

    2021-07-19
    2
  • Geek_Lawrence
    驱动程序仍然是“软件”部分,“软件”如何驱动“硬件”,这部分能否更细致点,想了解下驱动程序是如何连接硬件并且驱动硬件工作的,其更加底层的工作原理是什么呢?

    作者回复: 那你需要了解每一种设备的编程细节 ,这通常需要熟读每一种设备的编程数据手册

    2022-01-29
    1
  • Zhang
    终于看到这了,看到曙光了感觉,打个卡,感觉今天课后作业简单了

    编辑回复: 6666,进展很快嘛,继续加油!

    2022-06-25
  • Mingjie
    老师,HDMI驱动是属于哪类驱动设备?我觉得是块类型设备,不是有显存这个说法嘛,我想的对吗

    作者回复: 属于是MISC

    2021-11-28
    2
  • 驰往
    既陌生又熟悉的代码。曾几何时,大学的时候就是从platform device入手,深入学习驱动设备模型,然而由于工作环境,越工作越上层,最终没有踏入内核这片圣地。如今再学操作系统,希望能够借此机会,了却当年的初心😄。

    作者回复: 哈哈 程序员的三大浪漫之一

    2021-08-31
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部