本文主要是介绍ioremap在中断处理函数中会导致错误,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
http://bbs.chinaunix.net/thread-1960842-1-1.html
luoyan_xy (Rookie) 帖子 - 112
主题 - 13
精华 - 0
可用积分 - 294
专家积分 - 0 (本版:0)
在线时间 - 464 小时
注册时间 - 2009-07-30
最后登录 - 2011-09-14
状态:...保密... [微博] [博客] [短信] | [倒序看帖] 1楼 发表于 2009-08-31 10:23 | 只看该作者 在linux中是无法直接对外设的地址直接进行访问的,所以在这个时候必须要通过ioremap函数对外设的物理地址进行映射,然后通过ioread,iowrite等函数进行读写。 我现在就在使用这个函数的时候遇到了一个问题,我现在要写一个关于外设的中断处理函数,在外设发出中断时会对一个寄存器赋值,然后我需要在中断处理函数中对这个寄存器进行读值,判断中断类型,然后进行具体的操作。 现在问题出现在,如果我直接在中断处理函数中直接调用ioremap函数,板子就会直接死掉,通过printk能确定是在执行ioremap函数的时候死掉的; 但如果通过,工作队列,把这部操作放在中断下半部中则没有问题,但下半部又可能会被跟高优先级任务给抢占,所以。。。 感觉比较困惑,按道理说应该是能访问的,但不知为什么会出错,是ioremap函数运行的具体过程中进行了一些中断处理函数所禁止的操作吗? 希望哪位达人能跟小弟指点一下,多谢,感激不尽~ 我的linux内核是linux-2.6.24 , 板子是ppc。 | |
CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷 |
| |
luoyan_xy (Rookie) 帖子 - 112
主题 - 13
精华 - 0
可用积分 - 294
专家积分 - 0 (本版:0)
在线时间 - 464 小时
注册时间 - 2009-07-30
最后登录 - 2011-09-14
状态:...保密... [微博] [博客] [短信] | 2楼 发表于 2009-08-31 11:19 | 只看该作者 我刚大致看了一下ioremap的实现源码,在这个函数里面主要是调用了get_vm_area这个函数,而get_vm_area里在分配内存空间时,使用的是kmalloc( , GFP_KERNEL), 这个函数可能会阻塞, 可能是这个问题。 我现在把他改成GFP_ATOMIC,正在编译内核,还不知道能不能成功。 waiting~ | |
CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷 |
| |
potti_chu 帖子 - 24
主题 - 0
精华 - 0
可用积分 - 37
专家积分 - 0 (本版:0)
在线时间 - 20 小时
注册时间 - 2007-06-27
最后登录 - 2010-07-14
状态:...当前离线... [微博] [博客] [短信] | 3楼 发表于 2009-08-31 11:50 | 只看该作者 对于内存映射这种操作应该在驱动初始化的时候去做,而不应该在中断中作, 中断中是不能休眠的, 你在中断处理函数里 ioremap , 可能会引起休眠, 中断中休眠的结果就是 kernel 会死掉。 另外,你绝不应该去修改get_vm_area 中的 kmalloc 标志,你应该去修改你的驱动程序。 | |
CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷 |
| |
emmoblin 帖子 - 7056
主题 - 95
精华 - 0
可用积分 - 10157
专家积分 - 20 (本版:0)
在线时间 - 135 小时
注册时间 - 2008-10-29
最后登录 - 2011-09-13
状态:...当前离线... [微博] [博客] [短信] | 4楼 发表于 2009-08-31 14:10 | 只看该作者 呵呵,第一次听说在中断中去remap的,难道就不能驱动加载的时候remap好吗? 所有的硬件硬件驱动我觉得都是一上来就映射好的 | |
__________________________________ 助人者自助之 CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷 |
| |
emmoblin 帖子 - 7056
主题 - 95
精华 - 0
可用积分 - 10157
专家积分 - 20 (本版:0)
在线时间 - 135 小时
注册时间 - 2008-10-29
最后登录 - 2011-09-13
状态:...当前离线... [微博] [博客] [短信] | 5楼 发表于 2009-08-31 14:11 | 只看该作者 还有,你改成GFP_ATOMIC是会好的,这个我试过,只要改成GFP_ATOMIC就可以在中断中调用kamalloc。 虽然表面上看起来没事,但我想肯定是不推荐的。 | |
__________________________________ 助人者自助之 CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷 |
| |
luoyan_xy (Rookie) 帖子 - 112
主题 - 13
精华 - 0
可用积分 - 294
专家积分 - 0 (本版:0)
在线时间 - 464 小时
注册时间 - 2009-07-30
最后登录 - 2011-09-14
状态:...保密... [微博] [博客] [短信] | 6楼 发表于 2009-08-31 14:39 | 只看该作者 谢谢,我按照楼上所说的,通过全局变量,在初始化时建立映射关系的方法,终于把这个问题解决了,真的非常感谢。 由于我是刚接触驱动编写不久,可能有些问题考虑不到,还请大家见谅~ | |
CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷 |
| |
avcodec 帖子 - 1022
主题 - 21
精华 - 0
可用积分 - 754
专家积分 - 0 (本版:0)
在线时间 - 681 小时
注册时间 - 2008-09-12
最后登录 - 2011-09-14
状态:...当前离线... [微博] [博客] [短信] | 7楼 发表于 2010-05-11 11:06 | 只看该作者 |
这篇关于ioremap在中断处理函数中会导致错误的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!