Linux字符设备驱动的register_chrdev()与unregister_chrdev()
来源:互联网 发布:天刀淘宝刷天赏积分 编辑:程序博客网 时间:2024/05/22 00:54
Linux下的设备驱动程序被组织为一组完成不同任务的函数的集合,通过这些函数使得Windows的设备操作犹如文件一般。在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,如open ()、close ()、read ()、write () 等。
Linux主要将设备分为二类:字符设备和块设备。字符设备是指设备发送和接收数据以字符的形式进行;而块设备则以整个数据缓冲区的形式进行。字符设备的驱动相对比较简单。
下面我们来假设一个非常简单的虚拟字符设备:这个设备中只有一个4个字节的全局变量int global_var,而这个设备的名字叫做"gobalvar"。对"gobalvar"设备的读写等操作即是对其中全局变量global_var的操作。
驱动程序是内核的一部分,因此我们需要给其添加模块初始化函数,该函数用来完成对所控设备的初始化工作,并调用register_chrdev() 函数注册字符设备:
static int __init gobalvar_init(void)
{
if (register_chrdev(MAJOR_NUM, " gobalvar ", &gobalvar_fops))
{
//…注册失败
}
else
{
//…注册成功
}
}
其中,register_chrdev函数中的参数MAJOR_NUM为主设备号,"gobalvar"为设备名,gobalvar_fops为包含基本函数入口点的结构体,类型为file_operations。当gobalvar模块被加载时,gobalvar_init被执行,它将调用内核函数register_chrdev,把驱动程序的基本入口点指针存放在内核的字符设备地址表中,在用户进程对该设备执行系统调用时提供入口地址。
与模块初始化函数对应的就是模块卸载函数,需要调用register_chrdev()的"反函数" unregister_chrdev():
static void __exit gobalvar_exit(void)
{
if (unregister_chrdev(MAJOR_NUM, " gobalvar "))
{
//…卸载失败
}
else
{
//…卸载成功
}
}
随着内核不断增加新的功能,file_operations结构体已逐渐变得越来越大,但是大多数的驱动程序只是利用了其中的一部分。对于字符设备来说,要提供的主要入口有:open ()、release ()、read ()、write ()、ioctl ()、llseek()、poll()等。
Linux主要将设备分为二类:字符设备和块设备。字符设备是指设备发送和接收数据以字符的形式进行;而块设备则以整个数据缓冲区的形式进行。字符设备的驱动相对比较简单。
下面我们来假设一个非常简单的虚拟字符设备:这个设备中只有一个4个字节的全局变量int global_var,而这个设备的名字叫做"gobalvar"。对"gobalvar"设备的读写等操作即是对其中全局变量global_var的操作。
驱动程序是内核的一部分,因此我们需要给其添加模块初始化函数,该函数用来完成对所控设备的初始化工作,并调用register_chrdev() 函数注册字符设备:
static int __init gobalvar_init(void)
{
if (register_chrdev(MAJOR_NUM, " gobalvar ", &gobalvar_fops))
{
//…注册失败
}
else
{
//…注册成功
}
}
其中,register_chrdev函数中的参数MAJOR_NUM为主设备号,"gobalvar"为设备名,gobalvar_fops为包含基本函数入口点的结构体,类型为file_operations。当gobalvar模块被加载时,gobalvar_init被执行,它将调用内核函数register_chrdev,把驱动程序的基本入口点指针存放在内核的字符设备地址表中,在用户进程对该设备执行系统调用时提供入口地址。
与模块初始化函数对应的就是模块卸载函数,需要调用register_chrdev()的"反函数" unregister_chrdev():
static void __exit gobalvar_exit(void)
{
if (unregister_chrdev(MAJOR_NUM, " gobalvar "))
{
//…卸载失败
}
else
{
//…卸载成功
}
}
随着内核不断增加新的功能,file_operations结构体已逐渐变得越来越大,但是大多数的驱动程序只是利用了其中的一部分。对于字符设备来说,要提供的主要入口有:open ()、release ()、read ()、write ()、ioctl ()、llseek()、poll()等。
- Linux字符设备驱动的register_chrdev()与unregister_chrdev()
- Linux字符设备驱动的register_chrdev()与unregister_chrdev()
- Linux字符设备驱动的register_chrdev()与unregister_chrdev()
- linux驱动---字符设备的注册register_chrdev说起
- register_chrdev()与unregister_chrdev()
- register_chrdev()与unregister_chrdev()
- register_chrdev()与unregister_chrdev()
- register_chrdev()与unregister_chrdev()
- register_chrdev & unregister_chrdev
- register_chrdev & unregister_chrdev
- Linux字符设备注册函数 register_chrdev详解
- 混杂设备与字符设备的区别----misc_register、 register_chrdev 的区别总结
- LDD3-最简字符设备驱动freg (register_chrdev)
- linux 驱动-----字符设备驱动的组成
- 使用register_chrdev注册字符设备
- 使用register_chrdev注册字符设备
- 使用register_chrdev注册字符设备
- 使用register_chrdev注册字符设备
- ICTCLAS2011_JNI学习笔记-ICTCLAS_ImportUserDictFile及ICTCLAS_SaveTheUsrDic接口
- ICTCLAS2011_JNI学习笔记-ICTCLAS_FileProcess接口
- win 8 store app 查询IP地址 隐私声明
- du(disk usage)
- 【vi】编辑器的使用
- Linux字符设备驱动的register_chrdev()与unregister_chrdev()
- Ado.net中用StreamWriter从数据库表中导出数据到txt中……
- PLC1
- win 8 store app 公民身份证信息查询 隐私声明
- win 8 store app 手机号码所在地查询 隐私声明
- QTableWidget 设置头标签
- ubuntu 12.04(64位)下搭建android2.3/android4.2/4.1/4.0开发环境
- 行政区划代码行政编码大全(截止2012年10月31日)SQL语句
- Spring AOP 详解