当前位置:首页 > 多媒体相关

Linux内核模块编程--中断处理程序



热门问答:
  • 高手::::请教一个简单的问题???? [详细内容]
  • 请问如何把一个form的关闭按钮屏蔽掉而只留下标题栏? [详细内容]
  • 请高手门帮我解决一个问题! [详细内容]
  • 在线请教,找错 [详细内容]
  • 请大家帮忙这个存储过程该怎样设计?呵呵,不好意思!第一次发贴发错了^_^ [详细内容]

  • 推荐阅读
      · 6230ipc套件连接之上网篇
        摘要:虽然只是6月,克拉玛依的气温今天已经是37度,双休日还是在家享受空调吧。在遍试6230ipc套件的各种连接之后,回忆起了a780支持pc便捷的上网功能,何尝不试一试......
      · 段永基评说王志东事件
        摘要:6月28日,自称为“中关村老贼”的北京中关村科技发展股份有限公司总裁段永基在国家信息中心中国经济50人长安论坛上发表了题为“园区风险投资”的演讲。在演讲中,表白了“资本”关于新浪“王志东事件”的态度。  一直为媒体关注的王志东事件,资本方首次开口说话。  6月28日,自称为“中关村老贼”的北京中关村科技发展(控股)股份有限公司总裁段永基在国家信息中心中国经济50人长安论坛上发表了题为“园区风险投资”的演讲。......

    正文
    中断处理程序

      除了上一章外,迄今为止,我们在内核中所做的每件事都是作为对一个进程请求的回应,要么通过处理特殊的文件,发送 ioctl,要么发出系统调用。但是内核的工作并不仅仅是回应进程请求。另一个每个字节都很重要的工作是和连接到机器的硬件对话。
    在cpu和计算机的其他设备之间有两种交互作用。第一种是当cpu对硬件发布命令时,另一种是当硬件要告诉cpu什么事情时。第二种,被称为中断,实现起来是很困难的,因为它不得不处理什么时间硬件是方便的而不是cpu。典型的硬件设备只有很少的内存,如果当信息可见的时候你不读取的话它就会消失。

      在 linux 下,硬件中断被称为 irqs [interrupt requests (这是linux起源的intel 架构上的标准术语。 )的缩写]。有两种 irqs,短的和长的。一个短的 irq 预期占用 非常短的一段时间,在那期间,机器的剩余部分被阻塞,没有其他的中断将被处理。长的 irq 占用的时间长些,在那期间其他中断有可能发生(但不能是来自同一设备)。只要是可能的,声明一个长中断是较好的。

      当 cpu 接收到一个中断,它停止它正在做的任何事情(除非它正在处理一个更重要的中断,在那种情况下,它将处理完那个中断后才来处理现在的这个),在堆栈中保存某些参数并调用中断处理程序。这意味着在中断处理程序自身中有些东西是不能允许的,因为系统处于一种未知的状态。解决的办法是中断处理程序马上做完需要做的,通常是从硬件里面读什么或向硬件发送什么然后安排处理稍后的新信息(这被称为‘bottom half’)并返回。然后内核保证只要可能就调用bottom half --当这在运行,内核模块中允许做的所有事情将被允许。

      实现这个办法是当接收到相关的irq(在 intel 平台下有16个)时去调用 request_irq 以使中断处理程序被调用。 这个函数接收irq 号,函数名,标志, /proc/interrupts 中的名字及一个传送给中断处理程序的参数作为其参数。标志可以包括 sa_shirq 以指明你愿意和其他的中断处理程序分享那个irq(通常因为几个硬件设备在同一irq)以及 sa_interrupt 以指明这是一个快速中断。这个函数只在那个irq上没有处理程序的情况下成功,或者你愿意两者共享。

      然后从中断处理程序中我们和硬件通信,联合tq_immediate使用 queue_task_irq 和 mark_bh(bh_immediate) 调度 bottom half。我们在 2.0 版中不使用标准的queue_task 的原因是中断有可能在其他人的 queue_task(queue_task_irq 从这被一个全局锁保护 -- 在 2.2 版中没有queue_task_irq 而 queue_task 被一个锁保护。 )中发生。我们需要 mark_bh 是因为linux 的早期版本只能有32个 bottom half,而现在它们中的一个(bh_immediate) 用于还没有得到bottom half入口的驱动程序的bottom half连接表。

    讨论区

    Login