Linux内核模块编程-字符设备驱动

本文介绍了Linux设备驱动中的字符设备和块设备的区别,重点讲解了字符设备驱动的编写,包括注册撤销设备、设备操作的实现,如打开、关闭、读写设备的函数,并阐述了内核模块的初始化和注销过程,以及如何进行内核模块测试。
摘要由CSDN通过智能技术生成

设备驱动简介

设备被大概的分为两类: 字符设备和块设备。

  • 字符设备
    提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节/字符来读写数据。举例来说,键盘、串口、调制解调器都是典型的字符设备。

  • 块设备
    应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。硬盘、软盘、CD-ROM驱动器和闪存都是典型的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。此外,数据的读写只能以块(通常是512B)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。

这两种类型的设备的根本区别在于它们是否可以被随机访问。字符设备只能顺序读取,块设备可以随机读取。其它的一些区别:

  • 字符设备只能以字节为最小单位访问,而块设备以块为单位访问,例如512字节,1024字节等
  • 块设备可以随机访问,但是字符设备不可以
  • 字符和块没有访问量大小的限制,块也可以以字节为单位来访问

对于设备来说,linux抽象为一个个文件,放在/dev目录下,每个文件都有一定的属性其中比较重要的有主设备号和次设备号两个。主设备号标明了设备的类型,次设备号表示同类型设备的不同设备

[root@localhost blog]# ls -al /dev/sda
brw-rw----. 1 root disk 8, 0 Apr 22 22:49 /dev/sda
8是主设备号表示这是一个磁盘,0是次设备号区别相同类型设备的不同设备

开始编写字符设备驱动

注册和撤销设备

通过注册设备驱动模块,可以将一组操作设备的函数和某一设备进行关联起来。
注册一个设备:

linux/fs.h 中的函数 register_chrdev 
int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);
其中major是主设备号,name是设备的名字,fops则是该设备对应的一些列操作函数,成功返回主设备号
major如果为0的话,系统会给我们随机分配主设备号

问题是主设备号怎么去定义,难道可以自己随便填吗?如果大家都这样,那么设备好像就乱了要申请一个没有使用的设备号可以去查看文档:D

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值