Linux设备文件的创建
/************************************************************************************
*本文为个人学习记录,如有错误,欢迎指正。
*本文参考资料:
* http://www.cnblogs.com/chen-farsight/p/6154941.html
* https://blog.csdn.net/yueqian_scut/article/details/46771595
************************************************************************************/
1. 创建设备文件的两种方式
(1)手动创建:mknod命令
在驱动程序insmod成功之后,通过mknod命令手动创建设备文件至/dev目录下:mknod /dev/xxx c 主设备号 次设备号。("c"表示字符设备、"b"表示块设备、"p"表示网络设备)
(2)自动创建设备文件:mdev
在设备驱动注册到系统后,调用class_create为该设备在/sys/class目录下创建一个设备类,再调用device_create函数为每个设备创建对应的设备,并通过uevent机制调用mdev(嵌入式linux由busybox提供)来调用mknod创建设备文件至/dev目录下。
2. 自动创建设备文件过程分析
2.1 相关数据结构
struct class和struct device则通过sysfs向用户层提供信息。
class_private是class的私有结构,class通过class_private注册到系统中;device_private是device的私有结构,device通过device_private注册到系统中。注册到系统中也是将相应的数据结构加入到系统已经存在的链表中,但是这些链接的细节并不希望暴露给用户,也没有必要暴露出来,所以才有private的结构。
//所在文件/kernel/include/linux/device.h //设备类 struct class {const char *name; //设备类名称struct module *owner;//创建设备类的modulestruct class_attribute *class_attrs;//设备类属性struct device_attribute *dev_attrs;//设备属性struct kobject *dev_kobj;//kobject再sysfs中代表一个目录 .....................struct class_private *p;//设备类得以注册到系统的连接件 };//drivers/base/base.h struct class_private {struct klist class_devices;//设备类包含的设备(kobject) ..................................struct class *class;//指向设备类数据结构,即要创建的本级目录信息 };
//所在文件/kernel/include/linux/device.h struct device {struct device *parent; //sysfs/devices/中的父设备struct device_private *p; //设备得以注册到系统的连接件struct kobject kobj; //设备目录const char *init_name; //设备名称struct bus_type *bus; //设备所属总线struct device_driver *driver; //设备使用的驱动struct klist_node knode_class;//连接到设备类的kliststruct class *class; //所属设备类 ..................... }; //所在文件/kernel/drivers/base/base.h struct device_private {struct klist klist_children; //连接子设备struct klist_node knode_parent; //加入到父设备链表struct klist_node knode_driver; //加入到驱动的设备链表struct klist_node knode_bus; //加入到总线的链表struct device *device; //对应设备结构 };
2.2 创建过程
step1:调用class_create函数在/sys/class目录下创建一个设备类。
/*功能:在/sys/class目录下创建一个目录,目录名是name指定的参数:struct module *owner - THIS_MODULEconst char *name - 设备名返回值:成功:class指针失败: - bool IS_ERR(const void *ptr) 判断是否出错long PTR_ERR(const void *ptr) 转换错误码 */ struct class *class_create(struct module *owner, const char *name);
step2:调用device_create函数在step1创建的设备类目录下创建具体的设备目录和设备属性文件。
/* 功能:在class指针指向的目录下再创建一个目录,目录名由const char *fmt, ...指出、并导出设备信息(dev_t)参数:struct class *cls - class指针struct device *parent - 父对象,NULLdev_t devt - 设备号void *drvdata - 驱动私有数据const char *fmt, ... - fmt是目录名字符串格式,...就是不定参数返回值:成功 - device指针失败 - bool IS_ERR(const void *ptr) 判断是否出错long PTR_ERR(const void *ptr) 转换错误码 */ struct device *device_create(struct class *cls, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...);
step3:在/dev创建设备文件(系统自动进行)
step1、step2都是在sysfs文件系统中创建目录或者文件,而应用程序访问的设备文件则需要创建在/dev/目录下。该项工作由mdev完成(需保证根文件系统支持mdev,由busybox配置)。
2.2 注销过程
step1:删除设备类目录下的设备
/*功能:删除device_create创建的目录参数:struct class *cls - class指针dev_t devt - 设备号 */ void device_destroy(struct class *cls, dev_t devt);
step2:删除/sys/class目录下的设备类
/*功能:删除class指针指向的目录参数:struct class *cls - class指针 */ void class_destroy(struct class *cls);
转载于:https://www.cnblogs.com/linfeng-learning/p/9316224.html
Linux设备文件的创建相关推荐
- Linux 设备文件的创建和mdev
内容转载于http://blog.csdn.net/yueqian_scut/article/details/46771595.有格式的调整和内容的删改,如有侵权,请告知删除 . 本文将从代码级去理解 ...
- linux 设备文件动态,使用 udev 高效、动态地管理 Linux 设备文件
概述: Linux 用户常常会很难鉴别同一类型的设备名,比如 eth0, eth1, sda, sdb 等等.通过观察这些设备的内核设备名称,用户通常能知道这些是什么类型的设备,但是不知道哪一个设备是 ...
- linux设备文件,Linux 文件系统与设备文件
1 Linux 文件系统 1.1 Linux 文件系统与设备驱动关系 下图表明了 Linux 中虚拟文件系统.磁盘/Flash文件系统以及一般的设备文件与设备驱动程序之间的关系. 文件系统与设备驱动之 ...
- Linux设备文件简介
设备文件简介 本文为转载,留给自己学习之用 大家可以直接到原作者的空间查看: <Linux设备文件简介> http://lamp.linux.gov.cn/Linux/device_fil ...
- Linux设备文件简介。
概述 设备管理是linux中比较基础的东西,但是由于Linux智能程度的越来越高,Udev的使用越来越广泛,使得越来越多的Linux新用户对 /dev 目录下的东西变得不再熟悉.有时候遇见问题就会变得 ...
- linux设备文件生成,Linux设备文件自动生成(示例代码)
第一种是使用mknod手工创建:# mknod 第二种是自动创建设备节点:利用udev(mdev)来实现设备文件的自动创建,首先应保证支持udev(mdev),由busybox配置. 具体udev相关 ...
- linux设备文件列表,linux 设备文件
设备文件: b:按块为单位,随机访问的设备 如:硬盘 c:按字符为单位,线性设备 如:键盘 [root@localhost tm]# ll /dev/ crw-rw---- 1 root audio ...
- linux设备文件的分类,Linux设备模型组件-类设备-设备类及subsystem
Linux设备模型一.sysfs文件系统: sysfs文件系统是Linux2.6内核引入的,它被看成是与proc.devfs和devpty等同类别的文件系统,sysfs文件系统也是一个虚拟文件系统,它 ...
- 设备文件的创建mknod
设备文件是通过mknod命令来创建的.其命令格式为: mknod [OPTION]... NAME TYPE [MAJOR MINOR] TYPE取值: 主设备号和次设备号两个参数合并成一个16位的无 ...
最新文章
- 克鲁斯卡尔(Kruskal)算法求最小生成树
- NSString删除换行符号
- flex navigateToURL()页面跳转的例子
- HTTP协议详解(必看)
- Pano2VR 展示全景图
- 计算机职称photoshop,职称计算机考试photoshop核心通关技巧
- SpringCLoud+redis+es高并发项目《九》(Spring Security Oauth2 JWT)
- java虚拟机假死怎么办_虚拟机假死解决方法
- 键盘按键名键码对照表
- pytest单元测试
- 裸辞3个月,空白期啥都没干,怎么办?
- Akka in 2 weeks
- MP3 MP4 里不能缺少的231首歌!
- 图像拼接---图片柱面投影简单实现
- C语言编写学生成绩信息管理系统
- Qt软件开发文档20----Qt语言翻译家
- ISO14001是什么?
- win10解压安装mysql方法及遇见的问题(缺少MSVCR120.dll文件、服务无法启动)
- 如何用iptables限制BT、电驴等网络流量(示例如何过滤mark标志包)
- 宏碁再次遭遇勒索病毒攻击、谷歌分析8000万个勒索软件样本|10月15日全球网络安全热点
热门文章
- Oracle数据库学习(四)
- mysql排序自段为字符串类型问题解决
- [教程]微信官方开源UI库-WeUI使用方法【申明:来源于网络】
- oracle连接总结(内连接、外连接、自然连接,交叉连接,自连接)
- 3D游戏引擎中常见的三维场景管理方法
- (step3.3) hdu 1059(Dividing——多重背包)
- python 多进程 调用模块内函数_python--多进程的用法详解实例
- Spark源码分析之Master注册机制原理
- (104)FPGA面试题-画出程序所描述的电路原理图(二)
- ppt怎么无边距打印 wps_为什么用WPS的同事总是比你早下班?