中断服务程序和中断处理程序的区别

Henryinferno 2015-07-05 10:36:22
中断服务程序和中断处理程序的区别的区别是什么,两者都需要在核心态下运行吗?linux下当某个信号发生时执行的用户自定义的处理程序是属于哪种?
谢谢各位了。
...全文
2369 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jack_leiwin 2017-07-29
  • 打赏
  • 举报
回复
中断服务程序 中断处理程序 这样描述很清晰,这边分享不错,顶一个。
nswcfd 2015-07-08
  • 打赏
  • 举报
回复
#5楼回答的很全了,补充几点。 ISR更多的出现在硬件的手册里,比如x86的CPU,特指某个中断发生后,通过IDT中断门调用的那段代码(IDT描述符里有代码的位置、权限等信息)。 从CPU或者外设的角度,它不关心那段代码是由谁提供的,不论是bios还是os,或者是某个hacker绕过os提供的一段代码。 Interrupt Hanlder更像是一个逻辑上的概念,从使用者的角度,更多的是指完成中断核心业务逻辑的那部分。 比如,说到网卡rx中断处理程序,一定是在谈“通过网卡的硬件接口去把报文收取下来”的那段代码。 跟硬件中断的接口部分(IDT)被os把持着,网卡驱动的作者不可能去覆盖现有的IDT entry。 只能通过os提供的接口,比如request_irq去注册自己的处理程序,本质上是个callback。 这样,中断发生时,首先进入OS预设的idt entry(通常都很简单),然后一层又一层的处理(例如保存通用寄存器、切换irqstack、共享irq的处理等),最终回调匹配中断号的hanlder。
Henryinferno 2015-07-06
  • 打赏
  • 举报
回复
引用 3 楼 mydo 的回复:
对的 当然必须在内核中
最后一个疑问。unix环境下,通过signal注册的信号信号处理函数属于中端服务程序吗?因为产生信号如果不忽略的话就会执行这个用户自定义的函数。
lucky-lucky 2015-07-06
  • 打赏
  • 举报
回复 1
说下我的理解: 1.中断分为硬件中断和软件中断。LZ可能说的是软件中断,因为是使用signal注册。 2.在386体系下的中断控制器提供的控制线只有16根(可能是两个级联的8259A),由于操作系统需要为每一种中断提供屏蔽位,所以这16根线只能提供16种中断,因此中断控制线显得十分珍贵,这导致有好多硬件要复用同一根中断线(它们通过硬件连线直接与中断控制器连接),如我所使用的一款PC104当中,中断是如此分配的。

root@primary:~# cat /proc/interrupts
           CPU0
  0:     378082    XT-PIC-XT        timer
  1:          4    XT-PIC-XT        i8042
  2:          0    XT-PIC-XT        cascade
  8:          0    XT-PIC-XT        rtc0
 11:      57704    XT-PIC-XT        ehci_hcd:usb1, ohci_hcd:usb2, eth0
 14:      15873    XT-PIC-XT        ide0
NMI:          0   Non-maskable interrupts
MCE:          0   Machine check exceptions
MCP:          0   Machine check polls
ERR:          0
root@primary:~#
可以看出第11号中断被3个设备复用,即被两个usb和一块网卡占用,明白了这个那么你的中断服务程序的疑问便就解开了,为了能防止复用了同一个中断线的设备不发生冲突,因此在内核当中实现了中断服务程序,当一个新的设备连接到主板上并请求使用中断的时候需要在其驱动程序当中向该中断服务程序注册,并由中断服务程序来决策在什么情况下中断应该由谁来处理。 3.中断处理程序也分为硬件的中断处理程序和软件中断处理程序。 3.1硬件中断处理程序即为设备驱动程序中向中断服务程序注册的程序。它负责响应硬件中断,如一块使用光纤模块通信的硬件使用了4号中断,那么它的驱动程序当中就要注册中断号为4的中断处理程序。 3.2软件中断处理程序是由操作系统提供的为保证系统异步执行的机制。如在linux下由用户态向内核态转换需要调用0x80软件中断。 4.signal注册的信号处理函数为一种软件中断。其最终会调用sys_signal系统调用。
大熊猫侯佩 2015-07-05
  • 打赏
  • 举报
回复
对的 当然必须在内核中
Henryinferno 2015-07-05
  • 打赏
  • 举报
回复
引用 1 楼 mydo 的回复:
我的理解是前者会被后者调用;后者在中断发生时被调用这时中断级别可能很高,但在前者执行时却不一定。
谢谢,那这两者都必须在核心态下执行吗?在用户态下不行吧
大熊猫侯佩 2015-07-05
  • 打赏
  • 举报
回复
我的理解是前者会被后者调用;后者在中断发生时被调用这时中断级别可能很高,但在前者执行时却不一定。

18,777

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧