2021-11-14字符设备驱动基础

字符设备驱动基础

1.Linux内核对设备的分类

分为七类文件种类:1.-:普通文件 2.d:目录文件 3.p:管道文件 4.s:本地socket文件 5.l:链接文件 6.c:字符设备 7.b:块设备
上述7类中的1,2,5三种在外存中是有具体的内容,即包含文件内容,文件名和元信息inode(元信息是指时间戳或者大小等信息)三种信息,并且其中5链接文件中的软链接直接指向文件,其文件内容是指向的地址,而硬链接是指文件内容和元信息是用的同一个,但是文件名又创建了一个(即起了一个别名)。而上述的其余四类在外存中没有具体的内容,即只是用一个名字来表示某个设备或东西。
Linux内核按照驱动程序实现框架的不同,将设备分为三类:
1.字符设备:按照字符流的形式进行访问设备,一般按照顺序执行的,数据量不大,一般不设缓存。
2.块设备:按整块进行数据读写,最小的块至少是512字节(一个扇区),一块应该是扇区的整数倍。Linux中一个扇区一般是4096字节(4K大小),随机访问的,设缓存以提高访问速度。
3.网络设备:针对网络数据收发的设备。
总体框架图:
对于不同的设备文件都采用虚拟文件系统VFS来提供统一的接口函数,例如open,read,write,slect等等

2.设备号

2.1设备号是无符号整型32位,高12位表示主设备号用来规定是哪一个驱动程序,低20位表示具体的哪一个设备。创建一个设备可以使用如下命令创建:
sudo mknod /dev/文件名 设备类型(c字符设备,b块设备) 主设备号 次设备号
MKDEV(主设备号,此设备号);//整合为一个设备号
MAJOR(设备号);//得到主设备号
MINOR(设备号);//得到次设备号
应用程序也可以使用系统调用函数来创建:
int mknod(const char *pathname,mode_t mode,dev_t dev);
pathname:带路径的设备文件名,无路径默认为当前目录,一般都创建在/dev下
mode:文件权限 位或 S_IFCHR/S_IFBLK
dev:32位设备号
返回值:成功为0,失败-1

2.2申请和注销设备号
字符驱动开发第一步是通过模块的入口函数向内核添加本设备驱动的代码框架,主要完成:1.申请设备号,2.定义、初始化、向内核添加代表本设备的结构体元素。
int register_chrdev_region(dev_t from, unsigned count, const char *name)
功能:手动分配设备号,先验证设备号是否被占用,如果没有则申请占用该设备号
参数:
from:自己指定的设备号
count:申请的设备数量
name:/proc/devices文件中与该设备对应的名字,方便用户层查询主设备号
返回值:
成功为0,失败负数,绝对值为错误码

int alloc_chrdev_region(dev_t *dev,unsigned baseminor,unsigned count, const char *name)
功能:动态分配设备号,查询内核里未被占用的设备号,如果找到则占用该设备号
参数:
dev:分配设备号成功后用来存放分配到的设备号
baseminior:起始的次设备号,一般为0
count:申请的设备数量
name:/proc/devices文件中与该设备对应的名字,方便用户层查询主次设备号
返回值:
成功为0,失败负数,绝对值为错误码

分配成功后在/proc/devices 可以查看到申请到主设备号和对应的设备名,mknod时参数可以参考查到的此设备信息

void unregister_chrdev_region(dev_t from, unsigned count)
功能:释放设备号
参数:
from:已成功分配的设备号将被释放
count:申请成功的设备数量

释放后/proc/devices文件对应的记录消失

3.函数指针

一般的使用情况:
当决定某个函数被调用的代码和调用的代码不在一个地方时,需要用函数指针来传给调用处到底是哪个函数被调用了。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值