【发布时间】:2015-05-24 14:55:02
【问题描述】:
我一直试图了解硬件中断是如何通过内核最终出现在某些用户空间代码中的。
我的研究让我明白:
1- 外部设备需要 CPU 关注
2- 它通过引发中断(h/w trance 到 cpu 或总线)向 CPU 发出信号
3- CPU 断言,保存当前上下文,查找 ISR 的地址 中断描述符表(向量)
4- CPU 切换到内核(特权)模式并执行 ISR。
问题#1:内核如何在中断向量表中存储 ISR 地址?可能通过向 CPU 发送一些 CPU 用户手册中描述的组件来完成?请在这个主题上越详细越好。
在用户空间中,程序员如何编写一段代码来监听硬件设备通知?
这是我目前所理解的。
5- 该特定设备的内核驱动程序现在已收到来自该设备的消息,并且正在执行 ISR。
问题#3:如果用户空间的程序员想要轮询设备,我会假设这将通过系统调用来完成(或者至少这是我目前所理解的)。这是怎么做到的?驱动程序如何告诉内核在特定的系统调用上被调用,以便它可以执行来自用户的请求?然后会发生什么,驱动程序如何将请求的数据返回给用户空间?
我可能在这里完全偏离轨道,任何指导将不胜感激。 我不是在寻找具体细节的答案,我只是想了解大致情况。
【问题讨论】:
-
有用链接:lwn.net/images/pdf/LDD3/ch10.pdf - Jonathan Corbet、Alessandro Rubini 和 Greg Kroah-Hartman 的 LINUX DEVICE DRIVERS (2005) 第 10 章。如果使用标准的Linux内核,可以使用linux接口(和手册)进行驱动,无需深入了解CPU ISR寄存器机制(哪个CPU - x86/x86_64/arm?)。
标签: linux-kernel operating-system