一、字符设备驱动程序
先来张图吧!
1、写应用的人,直接用:open,read,write等,标准的接口,调用我们的驱动程序。那应用程序怎么会调用我们的驱动里的open、read、write的呢?中间有哪些东西呢?
实际上,应用程序的open,read,write是c库实现的,通过swi val这条汇编指令进入内核,相当于引发一个异常,进入到内核的异常处理函数里面,根据异常发生的原因,调用不同的处理函数,比如说。system_open,system_read,system_write,最终调用我们驱动程序里的open,read,write。
2、字符设备驱动的框架(以一个点灯的驱动来说)
(1)写出led_open、led_read、led_write、
(2)怎么告诉内核呢?
a、定义一个file_operation结构体,填充它
b、把这个结构体告诉内核(register_chrdev)
c、谁来调用它,显然是驱动的入口函数(drv_init),有入口得有出口函数(drv_exit)
d、内核怎么知道你调用它,所以得修饰一下(module_init)
二、块设备驱动程序
1、块设备驱动框架
2、如何写块设备驱动程序:
LINUX内核中都构造了一个结构体。
1,以面向对象的思想分配 gendisk 结构体。用 alloc_disk 函数。
2,设置 gendisk 结构体。
①,分配/设置一个队列:request_queue_t. (提供读写能力)用 blk_init_queue 函
数。
②,设置 gendisk 其他信息。(提供磁盘属性:磁盘容量,扇区大小等)
3,注册 gendisk 结构体。用 add_disk 函数。
三、网卡驱动程序
网卡驱动程序“收发功能”:
只要把上层的数据发给网卡,从网卡来的数据构造成包给上层即可。网卡只需要 “socket”编程,不需要打开某设备。 驱动程序都是以面向对象的思想写的,都有相关的结构体。
编程步骤
(1)分配某结构体:net_device
(2)设置结构体。
①,提供一个发包函数:hard_start_xmit()
②,提供收包的功能 : net_interrupt(int irq, void *dev_id)-->netif_rx(skb);
收到数据后,网卡里面一般都有中断程序。在中断程序中有一个上报数据的函数。
(3)注册结构体:register_netdev(dev) 真实驱动中使用的是此注册函数。
(4)硬件相关操作。