日期:2014-05-16  浏览次数:20572 次

Writing device drivers in Linux: A brief tutorial(四)

一个名为”memory”的完整的驱动:驱动的初始化部分

         现在我将要演示如何建立一个完整的设备驱动:memory.c。这个驱动允许从它读取一个字符或者向它写入一个字符。尽管在正常情况下并不是很有用,但是这个设备却提供了一个很有阐述性的例子,因为它是一个完整的设备驱动;它也很好实现,因为它并不是一个真正的硬件借口,因为它不和真正的硬件交互(除了计算机自己)

         为了开发这个驱动,几个新的在设备驱动程序中频繁出现的#include语句需要添加进来:

 

<memory initial>=

 

/* Necessaryincludes for device drivers */

#include<linux/init.h>

#include<linux/config.h>

#include<linux/module.h>

#include<linux/kernel.h> /* printk() */

#include<linux/slab.h> /* kmalloc() */

#include<linux/fs.h> /* everything... */

#include<linux/errno.h> /* error codes */

#include<linux/types.h> /* size_t */

#include<linux/proc_fs.h>

#include<linux/fcntl.h> /* O_ACCMODE */

#include<asm/system.h> /* cli(), *_flags */

#include<asm/uaccess.h> /* copy_from/to_user */

MODULE_LICENSE("DualBSD/GPL");

/* Declarationof memory.c functions */

intmemory_open(struct inode *inode, struct file *filp);

intmemory_release(struct inode *inode, struct file *filp);

ssize_tmemory_read(struct file *filp, char *buf, size_t count, loff_t *f_pos);

ssize_tmemory_write(struct file *filp, char *buf, size_t count, loff_t *f_pos);

voidmemory_exit(void);

intmemory_init(void);

/* Structurethat declares the usual file */

/* accessfunctions */

structfile_operations memory_fops = {

read:memory_read,

write:memory_write,

open:memory_open,

release:memory_release

};

/* Declarationof the init and exit functions */

module_init(memory_init);

module_exit(memory_exit);

/* Globalvariables of the driver */

/* Major number*/

intmemory_major = 60;

/* Buffer to