- 1、本文档共3页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux中关于中断和fork的学习笔记
Linux中关于中断和fork的学习笔记
ByEchoa
这几天主要学习了中断和fork函数的知识,以下是总结:
一、中断与时钟:
由于有了字符设备驱动的知识,这部分学习相对比较轻松,其实是在完善设备
驱动程序,增加了中断部分的内容。
中断的引入,主要是为缓解cpu与硬件设备速度的差异,提高cpu效率,另外可
以故障处理,不过随着中断技术的发展,它实现的功能已越来越多。根据中断的来
源可分为内部中断和外部中断;根据是否可屏蔽分为可屏蔽中断和不可屏蔽中断;
根据中断入口跳转方法可分为向量中断和非向量中断(多个中断共享一个入口地
址)。
为了适应高吞吐和中断程序的短小精悍,Linux的中断引入了顶半部和底半部分
“ ”
离的机制,顶半部进行 登记中断 的工作,底半部处理不紧急的耗时中断处理工作,
但若中断处理工作比较少时,可以在顶半部完成全部工作。执行cat /proc/interrupts
可查看中断的相关信息。实现顶半部的工作的是中断处理程序,实现底半部的机制
有taklet,工作队列和软中断,其中tasklet是基于软中断实现的,即用软件方式模拟
硬件中断的概念。软中断和tasklet运行于中断上下文,而工作队列则运行于进程上
下文。因此,软中断和tasklet处理函数中不能睡眠,而工作队列处理函数中允许睡
cpu
眠。硬中断是外设对 的中断,软中断是硬中段服务程序对内核的中断,信号是由
内核(或其他进程)对某个进程的中断。
以下是几个重要的函数和宏:
(1)申请IRQ,定义在源码的include/linux/interrupt.h 中。
intrequest_irq(unsiged int irq,// 要申请的硬件中断号
void (*handler) (int irq,void *dev_id,structpt_regs *regs)),//中断处理函数
unsigned longirqflags,//中断属性,如快速中断,共享中断等
const char *devname,//设备名
void *dev_id);// 设备标识,中断共享时会用到,一般为设备结构体或NULL
返回0表示成功,-INVAL 表中断号无效或处理函数指针为NULL,-EBUSY表中
断已被占用且不能共享。
(2)释放Irq,定义在linux/kernel/irq/manage.c 中。
void free_irq(unsignedint irq,void *dev_id);
释放 request_irq分配的中断,参数定义与request_irq相同。当任何驱动程序都不
使用时删除一个中断处理例程,在共享irq时要确保在调用此函数前中断已失效。函
数完成不返回任何值,这个函数的调用必须在中断上下文中。
(3)在kernel/irq/manage.c中定义了以下三个函数用于屏蔽一个中断源:
void disable_irq(int irq);
void disble_irq_nosync(intirq);
void enble_irq(int irq);
第一个函数禁止给定的中断,它会等待目前的中断处理完成,如果调用它的线
程持有任何中断处理程序所需的资源 (如自旋锁),系统可能死锁,第二个函数禁止
给定中断后立即返回。
(4)屏蔽本cpu内的所有中断
void local_irq_save (unsignedflags);//保存中断状态后,禁止中断
void local_irq_disable(void);//关闭中断不保存状态
local cpu
以 开头说明作用范围在本 内。
(5)在include/linux/interrupt.h 中定义了
structtasklet_struct
{
structtasklet_struct *next;
unsigned long state;
atomic_tcount;//原子计数
void (*fu
文档评论(0)