这里主要涉及字符设备的架构,各个函数的具体内容的研究可以后再进行更为深入的学习
还是那句,排除干扰,勇往直前!
字符设备驱动的组成:
1. 模块的加载与卸载函数
主要有以下几块
定义设备结构体
模块加载函数
模块卸载函数
其中重要的有cdev结构体,主要完成设备号相关的及和文件操作函数的连接,同时提供申请内存等操作
如:cdev_init()用于初始化cdev成员,并建立cdev与file_operations的连接
cdev_alloc()用于动态的申请一个cdev内存
cdev_add()向系统添加一个cdev,完成驱动模块的注册或者说加载
cdev_del()删除一个cdev,完成驱动模块的注销或者说是卸载
同时要完成注册和注销还需要配合以下函数
注册时:register_chrdev_region()或者alloc_chrdev_region()
注销时:unregister_chrdev_region()
2,file_operations结构体中的成员函数
最基本的几个
读函数 xxx_read()
写函数 xxx_write()
IO控制函数 xxx_ioctl()
......
文件操作结构体模板
struct file_operations xxx_fops=
{
.owner = THIS_MODULE,
.read = xxx_read,
.write = xxx_write,
.ioctl = xxx_ioctl,
...
};
3,另外就是一些包含的头文件了
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
测试结果
[root@Hunt-PC globalmem]# ls
globalmem.c globalmem.mod.c globalmem.o Module.markers Module.symvers
globalmem.ko globalmem.mod.o Makefile modules.order
[root@Hunt-PC globalmem]# insmod globalmem.ko
insmod: error inserting 'globalmem.ko': -1 Device or resource busy
查看发现254设备号已被使用了,更换了未使用的就OK了,或者动态分配,没有尝试,不会,呵呵
阅读(992) | 评论(0) | 转发(0) |