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 { //…卸载成功 } }
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索驱动程序
, 函数
, 模块
, i2c设备驱动字符设备
, 字符
, static初始化模块
, 字符设备
, 设备
, 字符设备驱动
, linux驱动字符驱动
入口
linux字符设备驱动、linux3.0字符设备驱动、linux pcie驱动解析、linux 字符驱动、linux字符驱动程序,以便于您获取更多的相关知识。