Linux下/dev和/sys/class初探

news/2024/7/7 18:45:46

文章目录

        • 引言
        • 1. devfs
        • 2. sysfs
        • sysfs 和 /dev的关系
        • 3. proc
        • ATTR 与 file_operations
      • 参考链接:
      • 扩展知识

引言

在用户空间操控设备可以通过/dev下的设备文件,也可以通过/sys/class下的设备文件。两者到底有什么区别?学习过程中,对于内核中许多文件目录的宏观概念了解的不是很清楚,借此文依据自己的思路进行整理总结。

1. devfs

一切设备皆文件,这是 Linux的哲学思想之一。设备当然也不例外,它们往往被抽象成文件,存放在 /dev 目录下供用户进程进行操作。用户通过这些设备文件,可以实现对硬件进行相应的操作。而这些设备文件,需要由对应的设备文件系统来负责管理

在 kernel 2.6 版本之前,完成这一使命的是 devfs。devfs 是 Linux 2.4 引入的一个虚拟的文件系统,挂载在 /dev 目录下。可以动态地为设备在 /dev 下创建或删除相应的设备文件,只生成存在设备的节点。

然而它存在以下缺点:

1. 可分配的设备号数目 (major / minor) 受到限制
2. 设备映射不确定,一个设备所对应的设备文件可能发生改变
3. 设备名称在内核或模块中写死,违反了内核开发的原则
4. 缺乏热插拔机制

2. sysfs

sysfs 是一种虚拟的基于内存的文件系统, 导出了内核的数据结构,在2.6内核修正后,挂载在/sys目录。这些文件就是sysfs开放给用户进程的一些操作接口,并负责以设备树的形式向 user space 提供直观的设备和驱动信息。

block bus class dev devices firmware fs kernel module power

/sys/devices (/sys文件系统最重要的目录结构)
该目录下是全局设备结构体系,包含所有被发现的**注册在各种总线上的各种物理设备**。一般来说,所有的物理设备都按其在总线上的拓扑结构来显示,但有两个例外,即platform devices和system devices。platform devices一般是挂在芯片内部的高速或者低速总线上的各种控制器和外设,它们能被CPU直接寻址;system devices不是外设,而是芯片内部的核心结构,比如CPU,timer等,它们一般没有相关的驱动,但是会有一些体系结构相关的代码来配置它们。

/sys/dev
**该目录下有字符设备(block)和块设备(char)两个子目录,里面全是以主次设备号(major:minor)命名的链接文件,链接到/sys/devices。**

/sys/class (按功能分类设备)
该目录下包含所有注册在kernel里面的设备类型,每个设备类型表达具有一种功能的设备。每个设备类型子目录下是具体设备的符号链接,这些链接指向/sys/devices/…下的具体设备。设备类型和设备并没有一一对应的关系,一个物理设备可能具备多种设备类型;一个设备类型只表达具有一种功能的设备,比如:系统所有输入设备都会出现在/sys/class/input之下,而不论它们是以何种总线连接到系统的。(/sys/class也是构成linux统一设备模型的一部分)

/sys/block (从linux2.6.26版本开始已经移到了/sys/class/block)
代表着系统中当前被发现的所有块设备。按照功能来说防止在/sys/class下会更合适,但由于历史遗留因素而一直存在于/sys/block,但从linux2.6.22内核开始这部分就已经标记为过去时,只有打开了CONFIG_SYSFS_DEPRECATED配置编译才会有这个目录存在,并且其中的内容在从linux2.6.26版本开始已经正式移到了/sys/class/block,旧的接口/sys/block为了向后兼容而保留存在,但其中的内容已经变为了指向它们在/sys/devices/中真实设备的符号链接文件。

/sys/bus (按总线类型分类设备)
一般来说每个子目录(总线类型)下包含两个子目录,一个是devices,另一个是drivers;其中devices下是这个总线类型下的所有设备,这些设备都是符号链接,它们分别指向真正的设备(/sys/devices/…下);而drivers下是所有注册在这个总线上的驱动,每个driver子目录下 是一些可以观察和修改的driver参数。 (它也是构成linux统一设备模型的一部分)

/sys/module
该目录包含所有被载入Kernel的模块,无论这些模块是以内联(inlined)方式编译到内核映像文件中还是编译为外模块(.ko文件)

/sys/fs
该目录用来描述系统中所有的文件系统,包括文件系统本身和按照文件系统分类存放的已挂载点。

/sys/kernel
该目录下存放的是内核中所有可调整的参数

/sys/firmware
该目录下包含对固件对象(firmware object)和属性进行操作和观察的接口,即这里是系统加载固件机制的对用户空间的接口.(关于固件有专用于固件加载的一套API)

/sys/power
该目录下有几个属性文件可以用于控制整个机器的电源状态,如向其中写入控制命令让机器关机/重启等等。

sysfs 和 /dev的关系

sysfs最主要是用来描绘Linux kernel 2.6中的设备驱动模型,用户态的后台程序(udev)会动态地周期性的扫描/sys目录中的属性项来自动管理设备文件(也称为设备节点),从而在/dev目录会建立或者删除对应的设备文件。

//注册字符设备驱动完成后,添加设备类的操作,让内核发信息给udev,让udev自动删除和创建设备文件。
test_class = class_create(THIS_MODULE, "aliya_class");  //参数2是类名,在/sys/class/下创建的类,就是这里命名的。
if (IS_ERR(test_class))
	return -EINVAL;
//最后一个参数就是希望在应用中app.c创建的设备文件的名字, 是/dev/test
device_create(test_class, NULL, mydev, NULL, "test");

3. proc

/proc 正在运行的内核信息映射,主要输出的信息为:进程信息、内存资源信息、磁盘分区信息等。

/proc下文件基本都是只读的,除了/proc/sys目录,它是可写的(查看和修改内核的运行参数)

/proc下数字命令的目录就是对于PID的进程目录

/proc/cmdline 启动时传递给kernel的参数信息(就是bootargs信息)
/proc/cpuinfo cpu的信息
/proc/crypto 内核使用的所有已安装的加密密码及细节
/proc/devices 已经加载的设备并分类
/proc/dma 已注册使用的ISA DMA频道列表
/proc/execdomains Linux 内核当前支持的execution domains
/proc/fb 帧缓冲设备列表,包括数量和控制它的驱动
/proc/filesystems 内核当前支持的文件系统类型
/proc/interrupts x86架构中的每个IRQ中断数
/proc/iomem 每个物理设备当前在系统内存中的映射
/proc/ioports 一个设备的输入输出所使用的注册端口范围
/proc/kcore 代表系统的物理内存,存储为核心文件格式,里边显示的是字节数,等于RAM大小加上4kb
/proc/kmsg 记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理
/proc/loadavg 根据过去一段时间内CPU和IO的状态得出的负载状态,与uptime命令有关
/proc/locks 内核锁住的文件列表
/proc/mdstat 多硬盘,RAID配置信息(md=multiple disks)
/proc/meminfo RAM使用的相关信息
/proc/misc 其他的主要设备(设备号为10)上注册的驱动
/proc/modules 所有加载到内核的模块列表
/proc/mounts 系统中使用的所有挂载
/proc/partitions 分区中的块分配信息
/proc/pci 系统中的PCI设备列表
/proc/slabinfo 系统中所有活动的 slab 缓存信息
/proc/stat 所有的CPU活动信息
/proc/uptime 系统已经运行了多久
/proc/swaps 交换空间的使用情况
/proc/version Linux内核版本和gcc版本
/proc/bus 系统总线(Bus)信息,例如pci/usb等
/proc/driver 驱动信息
/proc/fs 文件系统信息
/proc/ide ide设备信息
/proc/irq 中断请求设备信息
/proc/net 网卡设备信息
/proc/scsi scsi设备信息
/proc/tty tty设备信息
/proc/net/dev 显示网络适配器及统计信息
/proc/vmstat 虚拟内存统计信息
/proc/vmcore 内核panic时的内存映像
/proc/diskstats 取得磁盘信息
/proc/schedstat kernel调度器的统计信息
/proc/zoneinfo 显示内存空间的统计信息,对分析虚拟内存行为很有用

以下是/proc目录中进程N的信息
/proc/N/cmdline 进程启动命令
/proc/N/cwd 链接到进程当前工作目录
/proc/N/environ 进程环境变量列表
/proc/N/exe 链接到进程的执行命令文件
/proc/N/fd 包含进程相关的所有的文件描述符 (ls /proc//fd | wc -l 查看某个进程打开多少FD)
/proc/N/maps 与进程相关的内存映射信息
/proc/N/mem 指代进程持有的内存,不可读
/proc/N/root 链接到进程的根目录
/proc/N/stat 进程的状态
/proc/N/statm 进程使用的内存的状态
/proc/N/status 进程状态信息,比stat/statm更具可读性
/proc/self 链接到当前正在运行的进程

ATTR 与 file_operations

  1. 使用DEVICE_ATTR,可以实现驱动在sys目录自动创建文件,我们只需要实现show和store函数即可.
  2. 在应用层就能通过cat和echo命令来对sys创建出来的文件进行读写驱动设备,实现交互.
  3. file_operations是字符设备驱动实现的另外一种方式。

参考链接:

https://blog.csdn.net/qq_38814358/article/details/110530398
https://www.binss.me/blog/sysfs-udev-and-Linux-Unified-Device-Model/
https://blog.csdn.net/myxmu/article/details/7954741
https://blog.csdn.net/u014213012/article/details/53141835

扩展知识

ATTR参考链接
platform设备Probe


http://lihuaxi.xjx100.cn/news/439653.html

相关文章

高阶数据结构--图

本篇主要是介绍:图的一些常用的算法。 文章目录 一、图的基本概念二、图的存储结构 1、邻接矩阵2、邻接表三、图的遍历 1、广度优先遍历2、深度优先遍历四、最小生成树 1、Kruskal算法2、Prim算法五、最短路径 1、单源最短路径--Dijkstra算法2、单源最短路径--Bellm…

携程Apollo配置中心架构介绍

俗话说”麻雀虽小,五脏俱全“,有人说想看开源源码却不知道什么好,事实上,那些流行多年,广受好评的开源工程都是很值得一读的。今天我们介绍Apollo配置中心的基本情况,之所以介绍这个,主要是因为…

计算机操作系统笔记总结:Part2 进程与线程

文章目录1 进程1.1 进程的概念、组成与特征1.2 进程的状态与转换1.3 进程的组织1.4 进程控制1.5 进程通信2 线程与多线程模型2.1 线程的概念2.2 线程的实现方式2.3 多线程模型2.4 线程的状态与转换3 处理机调度3.1 调度的三个层次3.2 进程的挂起态与七状态模型3.3 进程调度3.3.…

Transformers学习笔记1. 一些基本概念和编码器、字典

Transformers学习笔记1. 一些基本概念和编码器、字典一、基本概念1. Hugging Face简介2. Transformers(1)简介(1)预定义模型(2)使用方法3. Datasets查看有哪些公开数据集方法1: 使用datasets包的…

【华为OD机试真题2023 JAVA】整理扑克牌

华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 整理扑克牌 知识点贪心排序 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 给定一组数字,表示扑克牌的牌面数字,忽略扑克牌的花色,请按如下规则对这一组扑克牌进行整理: 步骤1、对扑克牌进行分组,形成…

[附源码]Nodejs计算机毕业设计健身房预约平台Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

使用c++部署tensorrt加速yolov7

先放上一张我运行成功的截图,只要跟着我的教程一步一步按操作,下载好匹配的软件是一定可以成功的! 我相信想要在C++平台使用tensorrt加速的朋友们也是有很强的计算机基础的,那么简单的部分我们就跳过,重点是和大家介绍模型转换的部分以及环境的搭建。 一. 环境 我的cudn…

实习生招聘丨DolphinDB星臾计划

什么是星臾计划? 星臾计划是DolphinDB针对在读本科/硕士/博士生常年开放的实习生培养计划,帮助在校生提前了解企业、熟悉工作环境、提前锁定正式offer。 考核A,可提前拿到次年正式offer实习满6个月,可免试用期优秀实习生奖励2000元获得公司…