深入浅出Linux字符设备驱动程序解析

MC李奕晨

MC李奕晨

2016-01-29 17:38

深入浅出Linux字符设备驱动程序解析,深入浅出 Linux字符设备驱动程序解析

Linux下的设备驱动程序被组织为一组完成不同任务的函数的集合,通过这些函数使得linux的设备操作犹如文件一般。在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,如open()、close()、read()、write() 等。

Linux主要将设备分为二类:字符设备和块设备。字符设备是指设备发送和接收数据以字符的形式进行;而块设备则以整个数据缓冲区的形式进行。字符设备的驱动相对比较简单。

下面我们来假设一个非常简单的虚拟字符设备:这个设备中只有一个4个字节的全局变量int global_var,而这个设备的名字叫做"globalvar"。对"globalvar"设备的读写等操作即是对其中全局变量global_var的操作。

驱动程序是内核的一部分,因此我们需要给其添加模块初始化函数,该函数用来完成对所控设备的初始化工作,并调用register_chrdev() 函数注册字符设备:

static int __init globalvar_init(void){  if (register_chrdev(MAJOR_NUM, " globalvar ", &gobalvar_fops)) {  //…注册失败 } else {  //…注册成功 }}

其中,register_chrdev函数中的参数MAJOR_NUM为主设备号, "globalvar"为设备名,globalvar_fops为包含基本函数入口点的结构体,类型为file_operations。当globalvar模块被加载时,globalvar_init被执行,它将调用内核函数register_chrdev,把驱动程序的基本入口点指针存放在内核的字符设备地址表中,在用户进程对该设备执行系统调用时提供入口地址。

与模块初始化函数对应的就是模块卸载函数,需要调用register_chrdev()的"反函数"

unregister_chrdev():static void __exit globalvar_exit(void){ if (unregister_chrdev(MAJOR_NUM, " globalvar ")) {  //…卸载失败 } else {  //…卸载成功 }}

随着内核不断增加新的功能,file_operations结构体已逐渐变得越来越大,但是大多数的驱动程序只是利用了其中的一部分。对于字符设备来说,要提供的主要入口有:open()、release()、read()、write()、ioctl()、llseek()、poll()等。

open()函数 对设备特殊文件进行open()系统调用时,将调用驱动程序的open() 函数:

int (*open)(struct inode * ,struct file *);

其中参数inode为设备特殊文件的inode (索引结点) 结构的指针,参数file是指向这一设备的文件结构的指针。open()的主要任务是确定硬件处在就绪状态、验证次设备号的合法性(次设备号可以用 MINOR(inode- i - rdev) 取得)、控制使用设备的进程数、根据执行情况返回状态码(0表示成功,负数表示存在错误)等;

release()函数 当最后一个打开设备的用户进程执行close ()系统调用时,内核将调用驱动程序的release() 函数:

void (*release) (struct inode * ,struct file *) ;

release 函数的主要任务是清理未结束的输入/输出操作、释放资源、用户自定义排他标志的复位等。

read()函数 当对设备特殊文件进行read() 系统调用时,将调用驱动程序read()函数:

ssize_t (*read) (struct file *, char *, size_t, loff_t *);

用来从设备中读取数据。当该函数指针被赋为NULL 值时,将导致read 系统调用出错并返回-EINVAL("Invalid arg

展开更多 50%)
分享

猜你喜欢

深入浅出Linux字符设备驱动程序解析

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
深入浅出Linux字符设备驱动程序解析

深入浅出分析Linux设备驱动程序中断 (1)

PHP
深入浅出分析Linux设备驱动程序中断  (1)

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

深入浅出分析Linux设备驱动程序中断 (1)(3)

PHP
深入浅出分析Linux设备驱动程序中断  (1)(3)

深入浅出分析Linux设备驱动程序中断 (1)(2)

PHP
深入浅出分析Linux设备驱动程序中断  (1)(2)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

深入浅出Linux设备驱动中断处理介绍

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
深入浅出Linux设备驱动中断处理介绍

深入浅出Linux设备驱动异步通知介绍

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
深入浅出Linux设备驱动异步通知介绍

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

使用Openssh工具远程管理Solaris10

使用Openssh工具远程管理Solaris10

Linux操作系统如何完美装载Windows分区

Linux操作系统如何完美装载Windows分区
下拉加载更多内容 ↓