分配设备编号,注册设备与注销设备的函数均在fs.h中申明,如下:
extern int register_chrdev_region(dev_t, unsigned, const char *); //静态的申请和注册设备号

extern int alloc_chrdev_region(dev_t, unsigned, const char *);//动态的申请注册一个设备号
extern int register_chrdev(unsigned int, const char *,
               struct file_operations *);//int为0时候动态注册,非零时候静态注册。
extern int unregister_chrdev(unsigned int, const char *);
extern void unregister_chrdev_region(dev_t, unsigned);

在Linux2.6版本里面,register_chrdev_region()是register_chrdev()的升级版本。

使用register_chrdev_region()首先需要定义一个dev_t变量来作为一个设备号,

dev_t   dev_num;

如果想静态申请,那么dev_num=MKDEV(major_no,0);major是一个表示设备号的变量

然后便可以用register_chrdev_region(dev_num,2,"my_dev");第二个参数表示注册的此设备数目,第三个表示驱动名

如果要动态的注册主设备号,使用下面

alloc_chrdev_region(&dev_num, 0, 2, "memdev"); //次设备号从0开始,注册两个设备,设备名是Memdev
    mem_major = MAJOR(devno);  //取出主设备号保存在mem_major中

前面只是注册了设备号,后面要向内核添加设备了。

///cdev included in <linux/cdev.h>

struct cdev  devno;

cdev_init(&devno,&file_ops); //初始化改设备

devno.owner = THIS_MODULE;   //.owner这表示谁拥有你这个驱动程序,
devno.ops = &mem_fops;

对于已经知道了主设备号,就用cdev_add(&devno, dev_num,MEMDEV_NR_DEVS);来添加设备

如果是动态申请的设备号,就用

cdev_add(&devno, MKDEV(mem_major, 0), MEMDEV_NR_DEVS); //向内核添加设备,第一个参数是设备,第二个参数是设备号,第三个参数是要注册的次设备数目,mem_major在动态申请时候保存起来了。

注销设备时候,使用unregister_chrdev_region(dev_t, unsigned);第一个参数设备号,和注册时候的要一致,因此如果是动态分配的就需要保存起来,第二个参数是次设备的个数。

而使用 register_chrdev(unsigned int, const char *,struct file_operations *);来申请设备号时候,如果第一个参数是0,表示动态的分配给此驱动程序一个主设备号,,非零时候,表示备驱动程序向系统申请主设备号,第二个是设备名,第三个file_operations,如果是动态分配的,则函数返回分配的主设备号。

对应的使用unregister_chrdev(unsigned int, const char *);来注销设备,第一个参数是主设备号,必须和注册时候的主设备号一致,如果注册时候是动态的分配的主设备号,就需要保存起来。第二个是设备名,

由此可见,使用register_chrdev_region()比register_chrdev()多了一步,就是想内核注册添加cdev设备的步骤

另外在2.6内核中

使用module_init()和module_exit()来作为模块的入口和出口,而老版本中使用init_module()和cleanup_module()来作为入口和出口

register_chrdev_region()和registe_chrdev()相关推荐

  1. 字符设备之register_chrdev与register_chrdev_region

    之前写字符设备驱动,都是使用register_chrdev向内核注册驱动程序中构建的file_operations结构体,之后创建的设备文件,只要是主设备号相同(次设备号不同),则绑定的都是同一个fi ...

  2. register_chrdev_region源码理解

    先贴源代码: /*** register_chrdev_region() - register a range of device numbers* @from: the first in the d ...

  3. ⭐register_chrdev、register_chrdev_region以及alloc_chrdev_region之间的区别

    register_chrdev:Linux2.6.30之前所用,不用定义cdev:但 如果是register_chrdev 注册的话,这个时候,分配的次设备号,是从0~255,这样子的话,就分配的范围 ...

  4. register_chrdev_region、alloc_chrdev_region、register_chrdev区别

    目录 1 概述(快速.简单了解) 1.1 区别 register_chrdev register_chrdev_region(静态) alloc_chrdev_region(动态) 1.2 资源整理 ...

  5. Linux内核 register_chrdev_region和alloc_chrdev_region区别

    Linux内核的字符设备号注册有两个函数,一个是register_chrdev_region,另外一个是alloc_chrdev_region.两个函数的区别就是register_chrdev_reg ...

  6. Linux那些事儿 之 戏说USB(12)接口是设备的接口(一)

    前面的前面已经说了,接口是设备的接口.设备可以有多个接口,每个接口代表一个功能,每个接口对应着一个驱动.Linux设备模型的device落实在USB子系统,成了两个结构,一个是struct usb_d ...

  7. linux内核创建节点,Linux内核驱动自动创建设备节点文件

    Linux下生成驱动设备节点文件的方法有3个:1.手动mknod:2.利用devfs:3.利用udev 在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上L ...

  8. chrdev字符设备几种注册方式的差异

    数据结构 #define CHRDEV_MAJOR_HASH_SIZE 255static struct char_device_struct {struct char_device_struct * ...

  9. 2018-2019-1 20165318 20165322 20165326 实验四 外设驱动程序设计

    实验四 外设驱动程序设计 实验内容 任务一 任务二 问题及解决方法 参考链接 实验内容 任务一 学习资源中全课中的"hqyj.嵌入式Linux应用程序开发标准教程.pdf"中的第十 ...

最新文章

  1. 33. 使用fread()/fwrite()往文件中写入结构体,从文件中读出结构体
  2. Discuz! X2.5 添加自定义数据调用模块(简单方法)
  3. 【深度学习入门到精通系列】神经网络中动量的概念
  4. JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)
  5. 【xpghost】揭晓Windows 7快捷键的秘密
  6. 如何在Windows 10宿主机与Windows 98虚拟机之间共享数据
  7. 前后端分离框架Vue+Element UI(上集)
  8. 1988年图灵奖--伊万·萨瑟兰简介
  9. 我的科四刷题笔记,记完就能过
  10. iPadmini能运行c语言吗,一个移动固态硬盘,可以给iPad Pro2020和iPad Mini用是什么体验?...
  11. Qt项目中,用QPainter进行绘制图形时,边角显示不完整问题的梳理
  12. centos7+PHP7 编译安装swoole教程
  13. 看见“信任”,可信计算平台的由来解读(TPM、TCM、TPCM、等保2.0解读)。
  14. http协议的状态码(statue) / readyState状态码
  15. [小白教程]动态调试工具Ollydbg的简单使用
  16. BIO、NIO、AIO、Netty面试题(总结最全面的面试题!!!)
  17. DELPHI bpl使用
  18. 如何更新深度linux系统,深度操作系统 15.4 RC更新详情
  19. Docker-CE 监控
  20. 翻译工作必备,英文标点符号使用规则

热门文章

  1. ViewPager的使用方法
  2. MySQL的卸载与安装
  3. Tomcat7中文文档
  4. K210视觉体验—颜色识别
  5. 服务器开机显示其他用户,电脑开机后总是提示可能需要其他登录信息如何取消...
  6. 写给嵌入式程序员的循环冗余校验(CRC)算法入门引导
  7. PCS (物理编码子层)
  8. “战”在新高地,星沙加“数”前行
  9. 一种Map转Json字符串,出现“\”转义字符的解决办法
  10. ArcGIS10.2中文版下载与安装教程