【内核&驱动】字符设备驱动程序【1】

1.编写驱动程序的第一部就是定义驱动程序为用户提供的能力(机制);
2.举例在计算机内存之上实现若干设备抽象:
scull:simple character Utility for Loading Localities, 区域装载的简单字符工具 
scull的源代码实现了以下设备

scull0 ~ scull3
        这四个设备分别由一个全局且持久的内存区域组成
scullpipe0 ~ scullpipe3
        这四个设备与管道类似,一个进程的读取由另一个进程写入的数据
scullsingle
        一次只允许一个进程使用该驱动程序
scullpriv
        对于每个虚拟控制台是私有的
sculluid scullwuid
        只能由一个用户打开

3.主设备号和次设备号
对字符设备的访问是通过文件系统内的设备名进行的,那些名称被称为特殊文件,设备文件或者简单称之为文件系统数树的节点。他们统称位于/dev目录,字符设备驱动程序的设备文件可通过

  1. $> ls -l
命令输出的第一列中的”c“来标识
  1. crw-rw-rw- 1 root root 1, 5 4月 16 12:59 zero
    1:主设备号
           标识对应的驱动程序(现代的linux内核允许多个驱动程序共享主设备号)
    5:次设备号
            由内核使用,用于正确确定设备文件所指的设备
4.设备编号的内部表达
        在内核中dev_t(<linux/types.h>)用来保存一个设备号,dev_t是一个32位整数,用前12位代表主设备号,后20位代表次设备号。我们的代码不应该对设备编号的组织做任何假定,应该始终使用<linux/kdev_t>定义的宏

  1. MAJOR(dev_t dev);//主设备号
  2. MINOR(dev_t dev);//次设备号
相反,如果将主设备号和次设备号转换成dev_t类型,则使用:
  1. MKDEV(int major, int minor);
5.分配和释放设备编号

获得一个指定的设备号
  1. int register_chrdev_region(dev_t first,
  2.                            unsigned int count,
  3.                            char *name);
first       是要分配的设备好的起始位置
count    是请求连续设备编号的个数
name    是和该编号范围关联的设备名称,它将出现在/proc/devices和sysfs中


动态分配设备号
  1. int alloc_chrdev_region(dev_t *dev,
  2.                         unsigned int firstminor,
  3.                         unsigned int count,
  4.                         char *name);
dev:           仅用于输出的参数
firstminor: 要使用的被请求的第一个次设备号
count    是请求连续设备编号的个数
name    是和该编号范围关联的设备名称,它将出现在/proc/devices和sysfs中


释放设备号

  1. void unregister_chrdev_region(dev_t first,
  2.                               unsigned int count);
first:        要释放的设备号的起始位置
count:     是释放连续设备编号的个数

6.动态分配主设备号

  1. if (scull_major) {
  2.     dev = MKDEV(scull_major, scull_minor);
  3.     result = register_chrdev_region(dev, scull_nr_dev, "scull");
  4. } else {
  5.     result = alloc_chrdev_region(&dev, scull_minor, scull_nr_dev, "scull");
  6.     scull_major = MAJOR(dev);
  7. }

  8. if (result < 0) {
  9.     printk(KERN_WARNING "scull: can't get major %d\n", scull_major);
  10.     return result;
  11. }

  
  

-----------------------------未完待续------------------------------



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值