02 关于设备号,设备节点等一些简单概念

原创 2016年06月02日 11:46:01
1,设备
Linux文件系统/dev/下通常存放了一系列设备名称。对设备的访问,即访问这些文件。
ls -l /dev/ 能看到这些设备的一些基本信息。如下图所示
了解过Linux下文件类型的小伙伴应该对哪些是字符设备、块设备不会感到陌生了。(bcd-lsp分别是块、字符、目录、普通、链接、套接字、管道)
root后面 那两个逗号隔开的数字是设备的主设备号和次设备号。那我们跳到下一个概念吧。

2,设备号
设备号分为主设备号和次设备号;
主设备号标识设备对应的驱动程序,次设备号由内核使用,区分同一个类型的多个设备,如两个串口。个人认为了解这些就够了。我们需要重点关注的是驱动程序里面如何表达这些概念,也就是下一步。
dev_t devno   //定义设备号,数据类型为dev_t,实际是一个32位的数。
devno = MKDEV(int major, int minor);  //major minor 即我们看到的程序员给出的203,0等这些数字。习惯上限于255个主设备号,255个次设备号  devno = major << 20 | minor;
int major = MAJOR(dev_t devno);
int minor = MINOR(dev_t devno);   //与上面的相反,如果你想通过dev_t devno获得主设备号和次设备号的话,可以这么做。
3,分配和释放设备号
直接上代码
#include <linux/fs.h>
int register_chrdev_region(dev_t first, unsigned int count, char *name);
void unregister_chrdev_region(dev_t first, unsigned int count);
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);
参数说明:
dev_t first :MKDEV();获取得到的设备号,
unsigned int count :连续设备编号的个数
char *name :文件系统中看到的设备驱动的名称,cat /proc/devices 或 ls /dev/下能看到的
初始化时需要register,退出时需要unregister。
alloc顾名思义,动态分配。经常认为通用PC随机分配,嵌入式产品需提前规划好,故尽量用静态。
register成功返回0,失败返回负的错误码,时刻谨记,可能失败,所以要添加if判断。
驱动程序设计师们经常这样写:

4,设备节点
当你驱动程序按上面的步骤写好后,编译并且insmod。你会发现文件系统中:
cat /proc/devices/下会出现你添加的设备名称,和主设备号。但是/dev/下并没有存在你所注册的dev。这是因为你还没有创建设备节点。这时你需要执行如下命令:
mknod /dev/name c $major minor
你可以确定count 个设备节点,根据你代码中register时指定的count个数。
动态分配主设备号有一个缺点:无法预先创建设备节点。不过,你可以通过/proc/devices/中获得。如果要写成脚本自动分配,可以参考书Page 51,有一个很棒的shell脚本,帮我们完成了。
最后附上几行简单的完整的注册设备号程序:
 1 #include <linux/module.h>
  2 #include <linux/init.h>
  3 #include <linux/kernel.h>
  4 #include <linux/fs.h>        //note: register_chrdev need it
  5
  6 MODULE_LICENSE("Dual BSD/GPL");
  7
  8 static int __init scull_init(void)
  9 {
 10         dev_t devno = MKDEV(250, 66);
 11         int ret;
 12
 13         printk(KERN_ALERT "scull dev init\n");
 14         ret = register_chrdev_region(devno, 3, "scull");
 15         if (0 == ret ) {
 16                 printk(KERN_ALERT " register success\n");
 17         } else {
 18                 printk(KERN_ALERT "register fail ret:%d\n", ret);
 19                 goto register_fail;
 20         }
 21
 22         return 0;
 23 register_fail:
 24         unregister_chrdev_region(devno, 1);
 25 }
 26 static void __exit scull_exit(void)
 27 {
 28         dev_t devno = MKDEV(250, 66);
 29
 30         printk(KERN_ALERT "scull exit\n");
 31         unregister_chrdev_region(devno, 1);    
 32 }
 33
 34 module_init(scull_init);
 35 module_exit(scull_exit);                   

主设备号--驱动模块与设备节点联系的纽带

一、如何对设备操作 linux中对设备进行操作是通过文件的方式进行的,包括open、read、write。 对于设备文件,一般称其为设备节点, 节点有一个属性是设备号(主设备号、次设备号),其中主设...
  • cuijiyue
  • cuijiyue
  • 2014年12月21日 22:49
  • 1726

linux驱动之设备号与创建设备节点

设备号: 1、自动分配 major = register_chrdev(0,"first_drv",&first_sdv_fops);//注册 注册设备时给设备号写0,则内核会自动分配一个主设备...
  • a912293097
  • a912293097
  • 2014年12月18日 21:50
  • 1109

关于信号处理的一些基本概念

传感器类型:根据传感器各构成部分工作方式的不同,可将传感器分成不同的类型;依据接收方式不同,有相对式和绝对式(惯性式)之分;依据机电转换输出量的不同又有发电机型和参数型两种类型。测量电路可输出不同的关...
  • genghaiyang
  • genghaiyang
  • 2008年04月19日 10:31
  • 2587

Linux任务计划crontab

实验介绍 我们时常会有一些定期定时的任务,如周期性的清理一下/tmp,周期性的去备份一次数据库,周期性的分析日志等等。而且有时候因为某些因素的限制,执行该任务的时间会很尴尬。本课程将带你很好的利...
  • jijerry
  • jijerry
  • 2016年12月09日 09:48
  • 319

linux crontab 简单整理

在项目开发中,做报表时,需要后台进程去扫描数据,所以将比较费时的任务放到后台去执行,因此用到里linux 下的crontab 定式服务,所以对crontab做一个简单的认识 crontab ...
  • baby_it
  • baby_it
  • 2014年12月19日 12:01
  • 338

linux中在/dev/下手动创建设备节点

linux中在/dev/下手动创建设备节点 /dev/目录下有许多设备节点文件,比如u盘的文件/dev/sda,mmc卡的文件/dev/mmcblk0,这些文件通常是由udev或mdev程序检测到u...
  • chuanzhilong
  • chuanzhilong
  • 2017年03月25日 15:36
  • 3152

聊聊高并发(三)锁的一些基本概念

理解并发编程的一些基本概念很重要,给我们思考问题指明一个基本的方向。这篇说一说锁的一些基本概念。 在通常情况下我们说的锁都指的是“互斥”锁,因为在还存在一些特殊的锁,比如“读写锁”,不完全是互斥...
  • ITer_ZC
  • ITer_ZC
  • 2014年10月08日 16:32
  • 5411

在linux 2.6内核下建立字符设备,自动获取设备号,建立设备节点的简单例子

忘记很早以前从哪里的找到的一个很简单的C代码,完成了字符设备注册,自动获取设备号(主/从),并且自动建立设备节点。 由于最近好几个人问我类似的问题,因此在这里贴出了,供大家参考。 感谢代码的原作者...
  • lionfire
  • lionfire
  • 2011年08月23日 11:06
  • 2236

创建设备节点

在init 文件中,用device_create()函数创建设备结点。 /proc/devices中的主设备号要和/dev/内的主设备好一致。...
  • ruanjianruanjianruan
  • ruanjianruanjianruan
  • 2015年09月15日 20:07
  • 1069

挂载一个文件系统

挂载一个文件系统  mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在  umount /dev/hda2 卸载一个叫做...
  • tjns8
  • tjns8
  • 2015年03月07日 20:26
  • 291
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:02 关于设备号,设备节点等一些简单概念
举报原因:
原因补充:

(最多只允许输入30个字)