int __init hello_init(void){
printk(KERN_ALERT"Hello world!");
return 0;
}
void __exit hello_exit(void){
printk(KERN_ALERT"Goodbye world!\n");
}
四、字符设备驱动的框架设计
字符设备驱动的主要作用,是实现file_operations结构中包含的各种接口函数。为了简单起见,本文只实现了读取和写入所需的两个函数。设备的读写分别对应ssize_t (*read) (struct file *, char __user *, size_t, loff_t *)和ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *)两个函数,其中char __user *表示用户空间中读写内容的指针,size_t为要读写的字节数,返回值为实际读写的字节数。
接口函数实现以后,需要声明一个file_operations结构的变量并将其成员赋值为刚实现的接口函数,最后在模块初始化函数中进行注册。
相关源代码如下:
ssize_t read(struct file* fp, char __user *buff, size_t size, loff_t* loff){
int i;
for(i=0;i其中Char_read()和Char_write()用于操作硬件读写单个字符,将在下一步实现。结构体file_operations的变量fop采用了指定初始化的方式,这种写法具有更大的灵活性,可以不必按照结构体定义的顺序对成员进行初始化,属于C99的新增规则。
五、具体功能的实现
为了增强程序的可读性,也为了扩展方便,本例子将程序的框架和具体功能分开编写,具体的功能实现包含在单独的头文件中。