(一):操作系统内核访问的主要设备:
(1):字符型设备:键盘,打印机
(2):数据块设备:软盘,硬盘,光盘
(二):linux设备驱动程序的主要功能:
(1):对设备进行初始化。
(2):使设备投入运行和退出服务
(3):从设备接收数据并将它们送向内核
(4):将数据从内核送到设备
(5):检测处理设备出现的错误。
(三):字符设备驱动程序:
(1)驱动程序的 init()函数的主要功能是在内核登记设备驱动程序。包括给这一
驱动程序使用的主设备号,同时给内核提供指向驱动程序的file_operation结构的
指针,内核将这一指针放在字符设备驱动程序表的相应表目中,通过下列的内核函数完成登记。
register_chrdev(major,name,file_op)
其中major是这一驱动程序使用的主设备号,name是字符串,它给出驱动程序的名称。
而file_op则是指向file_operation结构的指针。
(四):驱动程序的工作内存:
(1):专用缓冲区:
给设备驱动程序分配内存的最简单办法是在它的源程序中按所需的字节数加以说明
在源程序中说明数组:
static char buff[800];
在任何函数外面使用关键字static表示缓冲区只能由一文件中的代码所
使用, (既用于这一设备驱动程序内部)。
上面这样使用专用缓冲区有几个缺点:
(1):用这种方法分配的内存只能在驱动程序内部使用
(2):如果推测的容量比实际需要的容量少,无法增加工作内存的容量。
(3):即使你不使用它,如硬设备没有连上,这块内存还是分配给你使用。
(2):kmalloc 函数和vmalloc函数
使用kmalloc函数最多能分配128Kb的内存块 。
vmalloc函数分配的内存块不能用于DMA传送,也不能从中断服务子程序内部调用vmalloc函数。
(3):中断: request_irq函数
int request_irq(unsigned int irq,void(*handler)(int),unsigned long type,char *name);
(五):设备驱动程序安装:
(1):第一项任务是将driver.c和任何有关的driver.h文件复制到包含
字符设备驱动程序源码的目录下,它放在linux源程序目录下的drivers/char子目录中。
(2):其次,你应该在char_dev_init()函数的最后增加调用init()子程序的行。char_dev_init()
()函数在drivers/char/mem.c中。
(3):现在编辑driver/char目录中的makefile,将driver.o的名称放在OBJS定义的后面,并将
driver.c名称放在SRCS定义的后面。
(4):现在将目录改变到linux源程序目录的最上层,安装新内核。