一、开发环境
1、内核:Linux 2.6.22.6;
2、JZ2440
3、ubuntu 9.10、
二、实验笔记
1、ARM架构Linux内核中,有5种常见的异常,中断异常是其一,Linux内核将所有中断统一编号,使用一个irq_desc结构体来描述这些中断,里面记录了中断名称、中断状态、中断标记、并提供了中断的底层硬件访问函数(如:清除、屏蔽、使能中断),提供了这个中断的处理函数入口,通过它还可以调用用户注册的的中断处理函数。
2、中断操作过程
(1)注册中断
调用request_irq向内核注册中断。原型为:
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char * devname, void * dev_id)
第一个参数irq:中断号,在irqs.h中定义,与架构相关;第二个参数handler: 用户中断处理函数;第三个参数flags:中断标记;第四个参数devname:中断名字;可以通过cat proc/interrupts查看;第五个参数dev_id: 在free_irq中有用,也用作区分中断处理函数。
(2)卸载中断
中断是一种很稀缺的资源,当不再使用一个设备时,应该释放它占据的中断,通过free_irq函数来实现,其原型为:
void free_irq(unsigned int irq, void *dev_id)
第一个参数irq:中断号,与request_irq中的irq一致,用于定位action链表;
第二个参数dev_id:用于在action链表中找到要卸载的表项;同一个中断的不同中断处理函数必须使用不同的dev_id来区分,这就要求在注册共享中断时参数dev_id必须唯一。
free_irq函数,根据中断号irq、dev_id从action链表中找到表项,将它移除。
(3)休眠的进入和唤醒
先使用static DECLARE_WAIT_QUEUE_HEAD(wq)定义并初始化一个等待队列头,并设置condition条件变量;
使用wait_event函数,linux内核进入休眠,其扩展型常用的函数为wait_event_interruptible(wq, condition),即可被中断打断的休眠。wq是一个等待队列,condition是条件,如果condition = 0,则将会进行休眠,直到condition = 1,并且有唤醒函数唤醒它;
使用wait_up函数,linux内核唤醒进程,其扩展型常用的函数为wake_up_interruptible(wq),wq与wait_event_interruptible的wq是一致的。
三、命令
insmod 加载模块
rmmod 卸载模块
ps 显示所有进程
ls -l /proc/791/fd/proc/$pid/fd 目录下存放了$pid进程中所有打开的fd
lsmod 显示加载的模块
exec 5</dev/keys 打开中断设备keys,分配进程号5
exec 5<&- 关闭进程号为5中断设备
ls -l /dev 显示所有设备
cat /proc/interrupts 显示中断设备
cat /proc/devices显示设备
top 显示进程的cup占有率等参数
kill -9 pid杀死进程号是pid的进程