查看某个函数的用法man 2 function:
如man 2 mknod
1.linux字符设备驱动回顾
ioctl
自动创建设备结点
1.mdev->busybox(默认)
fg.which is mdev //查看mdev命令在哪个目录下
which is arm-linux-gcc
2.etc/init.d/rcS脚本
mount -a
echo /sbin/mdev > /proc/sys/kernel/hotplug
3.etc/fstab
proc /proc proc defaults 0 0 //proc和sysfs是两种不同的虚拟文件系统
sysfs /sys sysfs default 0 0 //proc和sysfs是两种不同的虚拟文件系统
4.在驱动程序调用
class_create
device_create
device_destroy
class_destroy
手动创建
2.中断
为什么有中断?
CPU的运行速率远远快于外设的运行速率
轮询,定期检查设备,但做不少无用功
中断的触发流程
外设:有操作或者有数据可用,那么就会产生一个电信号,这个电信号就会给中断控制器
中断控制器:中断控制器接收到外设发来的电信号以后,进行进一步的处理,判断这个中断是否
使能或者禁止,判断它的优先级等,如果需要发送给CPU一个信号,那么这时中断
控制器就给CPU发送一个电信号
CPU:CPU接收到中断控制器发送来的电信号以后,CPU就无条件的跳转到异常微量表的入口(异常向
量表自己来定义),后续CPU就处理对就的中断.
中断的处理流程:
主程序
中断服务程序
响应(保存现场)
中断的优先级问题
返回(恢复现场)
3.linux内核是如何处理中断的呢?
3.1内核已经在它初始化的时候,将异常微量表建立好了,异常微量表的地址在0xffff0000
3.2内核关于保护现场和恢复现场这些事也都帮你做好
3.3对于驱动程序来说,只需要完成中断服务程序即可.
4.linux内核中如何注册中断服务程序呢?
request_irq(中断号, 中断处理函数...)
每当中断号对应的中断发生以后,内核就会执行对应的中断处理函数
5.中断处理程序在编程的时候要注意哪能些事情?
1.中断处理函数不属于任何进程,所以也就不参与进程之间的调度
2.中断处理函函数的速度要快,如果不快,其它任务无法获取CPU的
资源,影响系统的并发
3.中断处理函数不能与用户空间进行数据的往来, 如果要想让中断给用户发送,
进行数据的往来,要配合系统调用函数(file_operations)
4.在中断处理函数中, 不能调用引起休眠的函数
copy_to_user, copy_from_user, kmalloc, 国为这些函数会引起进行内存的拷贝,
在拷贝的时候,有可以空闲页不够,就会引起拷贝过程进入休眠状态,等待空闲页的出现。
共享中断
硬件连接
多个外设都接到同一根中断线,这个中断线接中断控制器,这个噗断控制器接CPU
一旦中断给CPU发信号, CPU会把对应的中断程序逐个执行一遍.
request_irq(..., irqflags,...,...,device_id)
irqflags必须是IRQ_SHARED
device_id必须是唯一的
注册的中断处理程序不能使用disable_irq(unsigned int irq)
中断处理程序中必须能够区分它的设备是否产生中断,这个需要硬件的支持,
然后中需要中断处理程序中判断处理即可。