linux 安装一个中断处理
如果你想实际地"看到"产生的中断, 向硬件设备写不足够; 一个软件处理必须在系统中配 置. 如果 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 中可以设置的位如下:
221
SA_INTERRUPT
当置位了, 这表示一个"快速"中断处理. 快速处理在当前处理器上禁止中断来执行 (这个主题在"快速和慢速处理"一节涉及).
SA_SHIRQ
这个位表示中断可以在设备间共享. 共享的概念在"中断共享"一节中略述.
SA_SAMPLE_RANDOM
这个位表示产生的中断能够有贡献给
/dev/random 和 /dev/urandom 使用的加密 池. 这些设备在读取时返回真正的随机数并且设计来帮助应用程序软件为加密选择 安全钥. 这样的随机数从一个由各种随机事件贡献的加密池中提取的. 如果你的设 备以真正随机的时间产生中断, 你应当设置这个标志. 如果, 另一方面, 你的中断
是可预测的( 例如, 一个帧抓取器的场消隐), 这个标志不值得设置 -- 它无论如 何不会对系统加密有贡献. 可能被攻击者影响的设备不应当设置这个标志; 例如, 网络驱动易遭受从外部计时的可预测报文并且不应当对加密池有贡献. 更多信息看 drivers/char/random.c 的注释.
中断处理可以在驱动初始化时安装或者在设备第一次打开时.
尽管从模块的初始化函数中 安装中断处理可能听来是个好主意, 它常常不是, 特别当你的设备不共享中断. 因为中断 线数目是有限的, 你不想浪费它们. 你可以轻易使你的系统中设备数多于中断数.如果一 个模块在初始化时请求一个 IRQ, 它阻止了任何其他的驱动使用这个中断, 甚至这个持有 它的设备从不被使用. 在设备打开时请求中断, 另一方面, 允许某些共享资源.
例如, 可能与一个 modem 在同一个中断上运行一个帧抓取器, 只要你不同时使用这 2 个 设备. 对用户来说是很普通的在系统启动时为一个特殊设备加载模块, 甚至这个设备很少 用到. 一个数据获取技巧可能使用同一个中断作为第 2 个串口. 虽然不是太难避免在数 据获取时联入你的互联网服务提供商(ISP), 被迫卸载一个模块为了使用 modem 确实令人 不快.
调用 request_irq 的正确位置是当设备第一次打开时, 在硬件被指示来产生中断前. 调 用
free_irq 的位置是设备最后一次被关闭时, 在硬件被告知不要再中断处理器之后. 这 个技术的缺点是你需要保持一个每设备的打开计数, 以便于你知道什么时候中断可以被禁
止.
尽管这个讨论,
short 还在加载时请求它的中断线. 这样做是为了你可以运行测试程序而 不必运行一个额外的进程来保持设备打开. short, 因此, 从它的初始化函数
( short_init )请求中断, 不是在 short_open 中做, 象一个真实设备驱动.
下面代码请求的中断是
short_irq. 变量的真正赋值(即, 决定使用哪个 IRQ )在后面显 示, 因为它和现在的讨论无关. short_base 是使用的并口 I/O 基地址;
接口的寄存器 2 被写入来使能中断报告.
if (short_irq >= 0)
{
222
result =
request_irq(short_irq, short_interrupt,
SA_INTERRUPT, "short", NULL);
if (result) {
printk(KERN_INFO
"short: can't get assigned irq %i\n", short_irq);
short_irq = -1;
} else { /* actually
enable it -- assume this *is* a parallel port */ outb(0x10,short_base+2);
}
}
代码显示,
安装的处理是一个快速处理(SA_INTERRUPT), 不支持中断共享(SA_SHIRQ 没 有), 并且不对系统加密有贡献(SA_SAMPLE_RANDOM
也没有). outb 调用接着为并口使能 中断报告.
由于某些合理原因, i386
和 x86_64 体系定义了一个函数来询问一个中断线的能力:
int
can_request_irq(unsigned int irq, unsigned long flags);
这个函数当试图分配一个给定中断成功时返回一个非零值. 但是, 注意, 在 can_request_irq 和
request_irq 的调用之间事情可能一直改变.
linux 安装一个中断处理的更多相关文章
- linux 安装一个共享的处理者
共享中断通过 request_irq 来安装就像不共享的一样, 但是有 2 个不同: SA_SHIRQ 位必须在 flags 参数中指定, 当请求中断时. dev_id 参数必须是独特的. 任何模块地 ...
- linux安装fasttext报错,升级gcc后成功解决
首先说一下存在问题: 本人打算在linux安装一个fasttext用来训练词向量,本来是想要从gensim来调用fasttext的,但是加载大的本地txt一直不对,没办法了只好在linux安装一个fa ...
- Memcahce(MC)系列(两)Linux下一个Memcache安装
Linux下一个memcache安装 memcache是高性能.分布式的内存对象缓存系统,用于在动态应用中降低数据库负载.提升訪问速度.眼下用memcache解决互联网上的大用户读取是很流行的一种使用 ...
- 在本机使用虚拟机安装一个linux系统,并搭建ftp服务器
一.Linux基础使用:linux服务器环境搭建(FTP服务器), 在本机使用虚拟机安装一个linux系统,并搭建ftp服务器,要求能使用ftp服务将本机文件到保存linux虚拟机上 资料: VMwa ...
- Linux安装LAMP开发环境及配置文件管理
Linux主要分为两大系发行版,分别是RedHat和Debian,lamp环境的安装和配置也会有所不同,所以分别以CentOS 7.1和Ubuntu 14.04做为主机(L) Linux下安装软件,最 ...
- linux安装php
接上篇:linux安装apache 一.安装php 先安装libxml2库 [root@ctxsdhy package]# yum -y install libxml2-devel 最新地址在:htt ...
- linux安装oracle11g
准备oracle安装文件 Oracle11gR2包含两个文件linux_11gR2_database_1of2.zip和linux_11gR2_database_2of2.zip,将这两个文件通过SS ...
- Symantec Backup Exec 2010 Agent For Linux安装
以前写过一篇文章介绍过Symantec Backup Exec 2012 Agent For Linux安装安装,今天介绍一下Symantec Backup Exec 2010 Agent For L ...
- Linux安装软件总结(二.几种安装命令介绍)
一.rpm包安装方式步骤: 1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录: 2.打开一个终端,su -成root用户: 3.cd soft.version.rpm所在 ...
随机推荐
- 探索云数据库最佳实践 阿里云开发者大会数据库专场邀你一起Code up!
盛夏.魔都.科技 三者在一起有什么惊喜? 7月24日,阿里云峰会·上海——开发者大会将在上海世博中心盛大启程,与未来世界的开发者们分享数据库.云原生.开源大数据等领域的技术干货,共同探讨前沿科技趋势, ...
- Mysql数据库日志类型查询与配置详解
在mysql中日志分为很多种,下面小编来给大家介绍Mysql数据库日志类型查询与使用,希望对各位同学会有所帮助 mysql常见的日志类型有五种:错误日志.二进制日志.查询日志.慢查日志和中继日志. 一 ...
- EasyUI 网格 一主多从 从表使用自定义树状展开
<table id="Table1" class="easyui-datagrid" title="标题" style="w ...
- 2017校赛 问题 F: 懒人得多动脑
题目描述 小D的家A和学校B都恰好在以点F为焦点的双曲线上,而小D每日所需的生活水源在一条平行该双曲线准线的直线上,设它的值为v.大家都知道,每天都是要喝水的,但是小D有点懒,他希望自己能在去上学或者 ...
- 如何实现两个input框的同步更新
class MVVM { constructor(options) { this.$options = options; this.$el = options.el; this.$data = opt ...
- List<object> 转 List<T>
List<TAXIWAY_CENTER_LINE> kk = allObjs.Where(c => c.ToString() == "AMXM.TAXIWAY_CENTER ...
- @hdu - 6329@ Problem K. Transport Construction
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 n 个点,第 i 个点位于 (xi, yi). 在第 i ...
- @NOIP2018 - D2T2@ 填数游戏
目录 @题目描述@ @题解@ @代码@ @题目描述@ 小 D 特别喜欢玩游戏.这一天,他在玩一款填数游戏. 这个填数游戏的棋盘是一个 n×m 的矩形表格.玩家需要在表格的每个格子中填入一个数字(数字 ...
- git 练习
删除文件 git rm test.txt git commit -m 'remove test.txt' 回复到最新版本 git checkout -- test.txt git checkout ...
- @codechef - BIKE@ Chef and Bike
目录 @description@ @solution@ @accepted code@ @details@ @description@ 输入 n(n ≤ 22) 个点,m(m ≤ 8000) 个边.每 ...