ioremap在中断处理函数中会导致错误

2023-10-28 07:18

本文主要是介绍ioremap在中断处理函数中会导致错误,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 http://bbs.chinaunix.net/thread-1960842-1-1.html

 


linux中是无法直接对外设的地址直接进行访问的,所以在这个时候必须要通过ioremap函数对外设的物理地址进行映射,然后通过ioread,iowrite等函数进行读写。
    我现在就在使用这个函数的时候遇到了一个问题,我现在要写一个关于外设的中断处理函数,在外设发出中断时会对一个寄存器赋值,然后我需要在中断处理函数中对这个寄存器进行读值,判断中断类型,然后进行具体的操作。
    现在问题出现在,如果我直接在中断处理函数中直接调用ioremap函数,板子就会直接死掉,通过printk能确定是在执行ioremap函数的时候死掉的; 但如果通过,工作队列,把这部操作放在中断下半部中则没有问题,但下半部又可能会被跟高优先级任务给抢占,所以。。。
   感觉比较困惑,按道理说应该是能访问的,但不知为什么会出错,是ioremap函数运行的具体过程中进行了一些中断处理函数所禁止的操作吗?

    希望哪位达人能跟小弟指点一下,多谢,感激不尽~


  我的linux内核是linux-2.6.24 , 板子是ppc。


CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷


我刚大致看了一下ioremap的实现源码,在这个函数里面主要是调用了get_vm_area这个函数,而get_vm_area里在分配内存空间时,使用的是kmalloc(   , GFP_KERNEL),  这个函数可能会阻塞, 可能是这个问题。
  我现在把他改成GFP_ATOMIC,正在编译内核,还不知道能不能成功。  waiting~


CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷
 

对于内存映射这种操作应该在驱动初始化的时候去做,而不应该在中断中作,
中断中是不能休眠的, 你在中断处理函数里 ioremap , 可能会引起休眠,
中断中休眠的结果就是 kernel 会死掉。

另外,你绝不应该去修改get_vm_area 中的 kmalloc 标志,你应该去修改你的驱动程序。


CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷
 

呵呵,第一次听说在中断中去remap的,难道就不能驱动加载的时候remap好吗?

所有的硬件硬件驱动我觉得都是一上来就映射好的
__________________________________
助人者自助之


CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷
 

还有,你改成GFP_ATOMIC是会好的,这个我试过,只要改成GFP_ATOMIC就可以在中断中调用kamalloc。
虽然表面上看起来没事,但我想肯定是不推荐的。
__________________________________
助人者自助之


CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷
 

谢谢,我按照楼上所说的,通过全局变量,在初始化时建立映射关系的方法,终于把这个问题解决了,真的非常感谢。 由于我是刚接触驱动编写不久,可能有些问题考虑不到,还请大家见谅~


CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷
 

 

这篇关于ioremap在中断处理函数中会导致错误的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/291592

相关文章

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

SpringBoot3匹配Mybatis3的错误与解决方案

《SpringBoot3匹配Mybatis3的错误与解决方案》文章指出SpringBoot3与MyBatis3兼容性问题,因未更新MyBatis-Plus依赖至SpringBoot3专用坐标,导致类冲... 目录SpringBoot3匹配MyBATis3的错误与解决mybatis在SpringBoot3如果

nginx配置错误日志的实现步骤

《nginx配置错误日志的实现步骤》配置nginx代理过程中,如果出现错误,需要看日志,可以把nginx日志配置出来,以便快速定位日志问题,下面就来介绍一下nginx配置错误日志的实现步骤,感兴趣的可... 目录前言nginx配置错误日志总结前言在配置nginx代理过程中,如果出现错误,需要看日志,可以把

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

Python struct.unpack() 用法及常见错误详解

《Pythonstruct.unpack()用法及常见错误详解》struct.unpack()是Python中用于将二进制数据(字节序列)解析为Python数据类型的函数,通常与struct.pa... 目录一、函数语法二、格式字符串详解三、使用示例示例 1:解析整数和浮点数示例 2:解析字符串示例 3:解