- 1、本文档共14页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
10.2. 安装一个中断处理
10.2. 安装⼀个中断处理
10.2. 安装⼀个中断处理
如果你想实际地看到产⽣的中断, 向硬件设备写不⾜够; ⼀个软件处理必须在 统中
配置. 如果 Linux 内核还没有被告知来期待你的中断, 它简单地确认并忽略它.
中断线是⼀个宝贵且常常有限的资源, 特别当它们只有 15 或者 16 个时. 内核保持了中
断线的⼀个注册, 类似于 I/O 端⼜的注册. ⼀个模块被希望来请求⼀个中断通道(或者
IRQ, 对于中断请求), 在使⽤它之前, 并且当结束时释放它. 在很多情况下, 也希望模块
能够与其他驱动共享中断线, 如同我们将看到的. 下⾯的函数, 声明在
linux/interrupt .h , 实现中断注册接⼜:
int request_irq(unsigned int irq,
irqreturn_t (*handler)(int, void *, struct pt_regs
unsigned long flags,
const char *dev_name,
void *dev_id);
void free_irq(unsigned int irq, void *dev_id);
从 request irq 返回给请求函数的返回值或者是 0 指⽰成功, 或者是⼀个负的错误码, 如
同平常. 函数返回 -EBUSY 来指⽰另⼀个驱动已经使⽤请求的中断线是不寻常的. 函数
的参数如下:
unsigned int irq
请求的中断号
irqreturn t (*handler)
安装的处理函数指针. 我们在本章后⾯讨论给这个函数的参数以及它的返回值.
unsigned long flags
如你会希望的, ⼀个与中断管理相关的选项的位掩码(后⾯描述) .
const char *dev name
这个传递给 request irq 的字串⽤在 /proc/interrupts 来显⽰中断的拥有者(下⼀节看到)
void *dev id
⽤作共享中断线的指针. 它是⼀个独特的标识, ⽤在当释放中断线时以及可能还被驱动
⽤来指向它⾃⼰的私有数据区(来标识哪个设备在中断) . 如果中断没有被共享, dev id
可以设置为 NULL , 但是使⽤这个项指向设备结构不管如何是个好主意. 我们将在实现
⼀个处理⼀节中看到 dev id 的⼀个实际应⽤.
flags 中可以设置的位如下:
SA INTERRUPT
当置位了, 这表⽰⼀个快速中断处理. 快速处理在当前处理器上禁⽌中断来执⾏(这个
主题在快速和慢速处理⼀节涉及) .
SA SHIRQ
这个位表⽰中断可以在设备间共享. 共享的概念在中断共享⼀节中略述.
SA SAMPLE RANDOM
这个位表⽰产⽣的中断能够有贡献给 /dev/random 和 /dev/urandom 使⽤的加密池. 这些
设备在读取时返回真正的随机数并且设计来帮助应⽤程序软件为加密选择安全钥. 这
样的随机数从⼀个由各种随机事件贡献的加密池中提取的. 如果你的设备以真正随机
的时间产⽣中断, 你应当设置这个标志. 如果, 另⼀⽅⾯, 你的中断是可预测的( 例如, ⼀
个帧抓取器的场消隐), 这个标志不值得设置 -- 它⽆论如何不会对 统加密有贡献. 可
能被攻击者影响的设备不应当设置这个标志; 例如, ⽹络驱动易遭受从外部计时的可预
测报⽂并且不应当对加密池有贡献. 更多信息看 drivers/char/random .c 的注释.
中断处理可以在驱动初始化时安装或者在设备第⼀次打开时. 尽管从模块的初始化函
数中安装中断处理可能听来是个好主意, 它常常不是, 特别当你的设备不共享中断. 因
为中断线数⽬是有限的, 你不想浪费它们. 你可以轻易使你的 统中设备数多于中断数.
如果⼀个模块在初始化时请求⼀个 IRQ, 它阻⽌了任何其他的驱动使⽤这个中断, 甚⾄
这个持有它的设备从不被使⽤. 在设备打开时请求中断, 另⼀⽅⾯, 允许某些共享资源.
例如, 可能与⼀个 modem 在同⼀个中断上运⾏⼀个帧抓取器, 只要你不同时使⽤这 2
个设备. 对⽤户来说是很普通的在 统启动时为⼀个特殊设备加载模块, 甚⾄这个设备
很少⽤到. ⼀个数据获取技巧可能使⽤同⼀个中断作为第 2 个串⼜. 虽然不是太难避免
在数据获取
文档评论(0)