• 1. LINUX驱动开发郑灵翔 lxzheng@xmu.edu.cn
  • 2. Agenda基本原理 内核模块 设备驱动的结构 Linux 2.6内核设备模型 中断处理 各种接口设计与驱动开发实例厦门大学通讯工程系
  • 3. LINUX设备的分类字符设备 串口,终端,触摸屏 ls -l /dev/ttyS0 crw-rw-rw- 1 root uucp 4, 64 4月 1 19:56 /dev/ttyS0 块设备 FLASH,RAMDISK,硬盘 ls -l /dev/mtdblock3 brw-r--r-- 1 505 505 31, 3 Feb 19 2005 /dev/mtdblock3 网络设备 ifconfig -a厦门大学通讯工程系
  • 4. 设备文件与设备号用户通过设备文件访问设备 每个设备用一个主设备号和次设备号标识厦门大学通讯工程系
  • 5. 设备驱动的功能管理I/O设备 上层软件的抽象操作与设备操作的转换厦门大学通讯工程系
  • 6. 内核模块Linux内核运行时动态扩展的一种技术 一组可以动态加载/卸载的代码 Linux驱动以内核模块的方式实现厦门大学通讯工程系
  • 7. LINUX内核模块的框架static int init_routine (void) { … } void cleanup_routine(void) { … } module_init(init_routine); module_exit(cleanup_routine); MODULE_LICENSE("GPL"); 厦门大学通讯工程系
  • 8. 内核模块的编译和加载Kconfig Makefile厦门大学通讯工程系
  • 9. Kconfig与Makefile的关系厦门大学通讯工程系
  • 10. Kconfig语法 config config options 类型定义 依赖性定义 帮助定义厦门大学通讯工程系
  • 11. Kconfig示例厦门大学通讯工程系
  • 12. Makefile示例定义示例 obj-y += hello.o obj-m += hello.o obj-$(CONFIG_HELLO_MODULE) += hello.o 编译 make -C M = $PWD modules厦门大学通讯工程系
  • 13. 设备驱动的结构驱动与内核的接口 注册/卸载 VFS接口 数据交互 中断注册 硬件设备接口 硬件探测 初始化 读写访问 设备控制厦门大学通讯工程系
  • 14. 设备驱动与VFS的接口厦门大学通讯工程系
  • 15. 简单字符设备驱程的框架static struct file_operations driver_fops = { … }; int __init init_routine (void) { … cdev_add(…); return 0; } void cleanup_routine(void) { cdev_del(…); } 厦门大学通讯工程系
  • 16. 内核与用户空间数据交换方法copy_to_user(void __user *to, const void *from, unsigned long n); copy_from_user(void *to, const void __user *from, unsigned long n); 厦门大学通讯工程系
  • 17. 简单字符设备驱程示例DEMO厦门大学通讯工程系
  • 18. Linux 2.6内核设备模型Linux 2.6内核在整个系统范围内对硬件设备进行抽象,建立了一个统一的设备模型 四个重要的数据结构 struct kobject struct kset struct kobj_type struct subsystem厦门大学通讯工程系
  • 19. 什么是中断 Linux中的中断处理 中断处理程序的编写 中断处理程序的注册与释放中断处理厦门大学通讯工程系
  • 20. 工作推后执行的机制中断处理程序要求短小,处理快。 为了尽快处理中断,以免发生中断丢失,实时性要求不高的工作推后执行。 给LINUX带来实时性不好恶名的bottom half机制在2.6内核中已不再使用。厦门大学通讯工程系
  • 21. 工作推后执行的机制软中断 Tasklet 工作队列(work queue)厦门大学通讯工程系
  • 22. 软中断执行频率或连续性要求很高的强实时性系统工作,一般不用。 HI_SOFTIRQ 优先级高的tasklets TIMER_SOFTIRQ 定时器软中断 NET_TX_SOFTIRQ 网络数据包TX NET_RX_SOFTIRQ 网络数据包RX SCSI_SOFTIRQ SCSI软中断 TASKLET_SOFTIRQ tasklets软中断 厦门大学通讯工程系
  • 23. tasklets最常用的延迟执行机制,与软中断类似 通过软中断实现,接口更简单 厦门大学通讯工程系
  • 24. 工作队列(work queue)将工作交给内核线程执行 允许重新调度或睡眠 通常可以用内核线程代替 与tasklet使用的区别 若推后执行的任务不需要休眠taklet/softirq厦门大学通讯工程系
  • 25. 各种接口设计与驱动开发实例9-14章厦门大学通讯工程系