/************************************************************************************

*本文为个人学习记录,如有错误,欢迎指正。

*本文参考资料:

*        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设备文件的创建相关推荐

  1. Linux 设备文件的创建和mdev

    内容转载于http://blog.csdn.net/yueqian_scut/article/details/46771595.有格式的调整和内容的删改,如有侵权,请告知删除 . 本文将从代码级去理解 ...

  2. linux 设备文件动态,使用 udev 高效、动态地管理 Linux 设备文件

    概述: Linux 用户常常会很难鉴别同一类型的设备名,比如 eth0, eth1, sda, sdb 等等.通过观察这些设备的内核设备名称,用户通常能知道这些是什么类型的设备,但是不知道哪一个设备是 ...

  3. linux设备文件,Linux 文件系统与设备文件

    1 Linux 文件系统 1.1 Linux 文件系统与设备驱动关系 下图表明了 Linux 中虚拟文件系统.磁盘/Flash文件系统以及一般的设备文件与设备驱动程序之间的关系. 文件系统与设备驱动之 ...

  4. Linux设备文件简介

    设备文件简介 本文为转载,留给自己学习之用 大家可以直接到原作者的空间查看: <Linux设备文件简介> http://lamp.linux.gov.cn/Linux/device_fil ...

  5. Linux设备文件简介。

    概述 设备管理是linux中比较基础的东西,但是由于Linux智能程度的越来越高,Udev的使用越来越广泛,使得越来越多的Linux新用户对 /dev 目录下的东西变得不再熟悉.有时候遇见问题就会变得 ...

  6. linux设备文件生成,Linux设备文件自动生成(示例代码)

    第一种是使用mknod手工创建:# mknod 第二种是自动创建设备节点:利用udev(mdev)来实现设备文件的自动创建,首先应保证支持udev(mdev),由busybox配置. 具体udev相关 ...

  7. linux设备文件列表,linux 设备文件

    设备文件: b:按块为单位,随机访问的设备 如:硬盘 c:按字符为单位,线性设备 如:键盘 [root@localhost tm]# ll /dev/ crw-rw---- 1 root audio  ...

  8. linux设备文件的分类,Linux设备模型组件-类设备-设备类及subsystem

    Linux设备模型一.sysfs文件系统: sysfs文件系统是Linux2.6内核引入的,它被看成是与proc.devfs和devpty等同类别的文件系统,sysfs文件系统也是一个虚拟文件系统,它 ...

  9. 设备文件的创建mknod

    设备文件是通过mknod命令来创建的.其命令格式为: mknod [OPTION]... NAME TYPE [MAJOR MINOR] TYPE取值: 主设备号和次设备号两个参数合并成一个16位的无 ...

最新文章

  1. 克鲁斯卡尔(Kruskal)算法求最小生成树
  2. NSString删除换行符号
  3. flex navigateToURL()页面跳转的例子
  4. HTTP协议详解(必看)
  5. Pano2VR 展示全景图
  6. 计算机职称photoshop,职称计算机考试photoshop核心通关技巧
  7. SpringCLoud+redis+es高并发项目《九》(Spring Security Oauth2 JWT)
  8. java虚拟机假死怎么办_虚拟机假死解决方法
  9. 键盘按键名键码对照表
  10. pytest单元测试
  11. 裸辞3个月,空白期啥都没干,怎么办?
  12. Akka in 2 weeks
  13. MP3 MP4 里不能缺少的231首歌!
  14. 图像拼接---图片柱面投影简单实现
  15. C语言编写学生成绩信息管理系统
  16. Qt软件开发文档20----Qt语言翻译家
  17. ISO14001是什么?
  18. win10解压安装mysql方法及遇见的问题(缺少MSVCR120.dll文件、服务无法启动)
  19. 如何用iptables限制BT、电驴等网络流量(示例如何过滤mark标志包)
  20. 宏碁再次遭遇勒索病毒攻击、谷歌分析8000万个勒索软件样本|10月15日全球网络安全热点

热门文章

  1. Oracle数据库学习(四)
  2. mysql排序自段为字符串类型问题解决
  3. [教程]微信官方开源UI库-WeUI使用方法【申明:来源于网络】
  4. oracle连接总结(内连接、外连接、自然连接,交叉连接,自连接)
  5. 3D游戏引擎中常见的三维场景管理方法
  6. (step3.3) hdu 1059(Dividing——多重背包)
  7. python 多进程 调用模块内函数_python--多进程的用法详解实例
  8. Spark源码分析之Master注册机制原理
  9. (104)FPGA面试题-画出程序所描述的电路原理图(二)
  10. ppt怎么无边距打印 wps_为什么用WPS的同事总是比你早下班?