linux内核设备驱动简单分析

一、字符设备驱动程序

先来张图吧!

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)硬件相关操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值