日期:2014-05-16 浏览次数:20581 次
static struct file_operations s3c24xx_buttons_fops = { .owner = THIS_MODULE, /* 这是一个宏,指向编译模块时自动创建的__this_module变量 */ .open = s3c24xx_buttons_open, .release = s3c24xx_buttons_close, .read = s3c24xx_buttons_read, };
这个结构的每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件进行诸如read/write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数,这是linux的设备驱动程序工作的基本原理。编写设备驱动程序的主要工作就是编写子函数,并填充file_operations的各个域。
注意:在用户进程调用驱动程序是,系统进入和心态,这是不再是抢先式调度。也就是说,系统必须在驱动程序的子函数返回后才能进行其他的工作。如果此时驱动程序陷入死循环,不幸的是只能重新启动机器了。
编译:
$gcc -O2 -DMODULE -D__KERNEL__ -c test.c 得到文件test.o就是一个设备驱动程序。
如果设备驱动程序有多个文件,把每个文件编译后,$ld -r file1.0 file2.0 -o modulename
将驱动程序安装到系统:insmod -f test.o
如果安装成功,会在/proc/devices文件中就可以看到设备test,并可以看到他的主设备号。 cat /proc/devices
卸载:rmmod test
创建设备文件:mknod /dev/test c major minor