Linux内核和驱动学习总结

1 内核编程接口

1)双向环形链表

双向环形链表是Linux内核为内核编程人员提供的一个便利。使用时,通常将struct list_head结构嵌入自定义结构,并利用container_of宏从struct list_head结构指针获得所在的自定义结构的指针。

2)等待、定时和延迟

定时器以固定的频率(HZ)产生中断,内核使用全局变量jiffies记录自系统启动以来产生的中断数。在对时间精度要求不太高的情况下,jiffies可以用来表示系统中各类事件发生的时刻。于是,jiffies为等待和延时提供了时间依据。

等待,有两种实现方式。其一,忙等,即持续检查等待条件直到等待条件为假;其二,阻塞-唤醒,即在所等待的事件发生之前使自己进入休眠状态,在所等待的事件发生之后由他方将自己唤醒。阻塞使用宏wait_event_interruptible,并指定等待队列和等待条件。唤醒使用函数wake_up_interruptible,并指定要唤醒的等待队列。

定时是等待的一种特殊情况,需要使用jiffies变量。内核为定时等待提供了定时器这一便利。struct timer_list结构表示一个定时任务,指定了定时到期jiffies值、定时到期执行的函数等信息。函数add_timer用于注册定时任务,函数del_timer用于删除一个未到期的定时任务。定时任务在中断上下文中执行,因此不能被阻塞。

在某些情况下一项工作需要延迟执行,如中断处理程序应该尽快返回,而将可能需要花较长时间才能完成的工作作为一项延迟执行的任务在系统中注册。内核为此提供了两个便利,一个是tasklet链表,另一个是工作队列。tasklet和工作队列中的工作都是同注册它们的过程异步执行的,它们在被注册之后的某个时机“尽快”执行。二者的区别在于,tasklet在中断上下文中执行,而工作队列中的工作则在进程上下文中执行,因此工作队列中的工作可以被阻塞。

3)同步:原子变量、自旋锁、信号量

这三者中,原子变量是基础。自旋锁和信号量的实现需要使用原子变量。原子变量能够保证任何时刻只有一个线程在访问变量,即使在SMP系统上也是如此。对原子变量的操作是最简单、最基本、由硬件保证的原子操作。自旋锁和信号量本质上也是原子变量,被软件用来控制对临界区的并发访问。自旋锁和信号量的区别在于,等待自旋锁的线程不释放已经占用的处理器,而等待信号量的线程被阻塞且在信号量可用时被唤醒。

2 设备模型

设备模型的三类对象:总线、设备和驱动。设备模型对于编写设备驱动程序的指导意义在于:将设备驱动程序中与平台无关的部分封装为设备模型中的驱动对象,而将设备驱动程序中与平台相关的部分(如设备的资源占用情况)封装为设备模型中的设备对象;利用设备模型的注册、匹配机制,以支持设备的动态插拨。在设备模型的驱动对象的probe函数中,驱动程序可以做许多事情,通常首先是在系统中申请设备声明使用的资源,然后根据设备的类型要么在系统中注册字符字备、块设备或网络设备,要么将设备连接到某个已经存在的子系统,如输入子系统。

三类常见的总线:platform、PCI、USB。其中,platfrom总线具有一般指导意义;PCI总线是资源可配置设备的典型代表;USB总线隐藏了设备资源,设备似乎是不再占用任何资源,而实际上同一个USB主机控制器之下的所有USB设备共享USB主机控制器使用的资源,而USB设备驱动程序从不需要直接访问USB主机控制器,这是USB主机控制器驱动程序的工作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值