- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是 Linux 内核模块开发的新手,正在尝试编写一个简单的内核模块,稍后可以将其扩展为键盘驱动程序。
我尝试了以下两种方法:
我按照给定的指南开始编写代码 here .但唯一的问题是当我运行 rmmod
时机器死机了,因为它无法将 IRQ 恢复到原始键盘驱动程序。
在 init()
中请求 IRQ 和然后在 exit()
即 cleanup_module()
被触发后将一切恢复正常?
void cleanup_module() {
/* Something to restore everything back to normal */
free_irq(1, NULL);
}
在这种方法中,我通过使用 while
循环不断轮询按下和释放的键,然后将输入复制回用户。
while(!(inb(0x64) & 0x1) || (input = inb(0x60)) & 0x80);
我在这里面临的问题是它永远不会从 while
循环中出来。我假设这是因为原始键盘驱动程序满足了请求。
有没有办法让原键盘驱动转发请求?
我感谢任何帮助/指点。
谢谢!
最佳答案
恐怕只要正常的内核键盘驱动程序也在控制键盘,我就看不出这是如何工作的,因为两个驱动程序都将尝试控制设备。内核 i8042 驱动程序(我假设这是与您相关的)将其中断注册为共享,如果您的驱动程序设法注册了相同的中断,那么它也将其处理程序注册为共享,以便两者都收到中断通知并且会争先恐后地访问该设备。
如果您注册了一个共享处理程序,这也可以解释当您卸载它时发生的崩溃:注销共享中断处理程序仅在第二个参数包含有效的 dev_id 时有效;所以当你像你一样用 NULL 调用时注销会失败,但是处理程序代码仍然会从内存中卸载。这会导致 future 中断时发生崩溃。
关于您的轮询方法,是的,因为普通驱动程序会收到中断通知,所以很可能会先于您读取键盘。
关于linux - 恢复键盘 IRQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42059024/
我正在使用线程 irq 实现一个中断处理模块。我面临这个错误: 1983.150961] Shut down eMMC app module init. [ 1983.151115] genirq:
我有一个 GPIO 外围设备,在设备树中定义为: gpio0: gpio@2300000 { compatible = "fsl,qoriq-gpio"; reg = ; in
我已经构建了一个静态库(*.a 用于 gcc,*.lib 用于 keil)。它的源文件之一,编译成库,包含 RADIO_IRQHandler 的定义。下面是这个名为“ral_irq_handlers.
从: http://software.intel.com/en-us/articles/introduction-to-pc-architecture/ 异常编号 10h 对应于“浮点错误”,但软件中
我正在学习 Linux 内核中的中断处理,并尝试使用下面的代码片段在 IRQ2 上注册一个虚拟 irq 处理程序。但它似乎没有被注册,因为我在内核中看到了一个负返回值和一条消息,如下所示,这是由试图执
我在制作我的第一个驱动程序 (PIT) 时遇到了问题。我之前录制的视频中清楚地解释了这个问题:https://www.youtube.com/watch?v=hjvTtVbaics&feature=y
目前我的 IRQ 是三重故障并给出除以 0 的错误。 Here是我录制的视频,它将向您展示这一点。 irq.c++: #include "irq.h" #define PIC_MASTER_CONTR
我是 Linux 内核模块开发的新手,正在尝试编写一个简单的内核模块,稍后可以将其扩展为键盘驱动程序。 我尝试了以下两种方法: 基于中断的方法 我按照给定的指南开始编写代码 here .但唯一的问题是
我有一些关于 PCI 和 IRQS 的问题。 IRQ 是如何分配给连接到 PCI 总线的设备的,它是由 BIOS 在启动时分配的,还是总线选择它或总线 Controller 自己自动选择它,谁负责选择
如果我的 PC 有两个内核——CPU0 和 CPU1,则 CPU0 的 IRQ 被禁用 (local_irq_disabled())。如何使用CPU1上的进程开启CPU0的IRQ? 最佳答案 不要。
如何在 32 位保护模式(显然是 x86)下查看 PIT IRQ 处理程序的返回值?我想我可以这样做,但我不完全确定。 pop eax ; pop last thing from stack mov
如何在 32 位保护模式(显然是 x86)下查看 PIT IRQ 处理程序的返回值?我想我可以这样做,但我不完全确定。 pop eax ; pop last thing from stack mov
我正在开发一个使用 ARM Cortex-M0 处理器的项目。在这个项目中,我需要提供计时器支持(CMSDK (SSE-200)计时器)。 因此,在 vector 表中,在 TIMER0_IRQn 表
我正在浏览下面的线程,它说内核头不想将 irq 暴露给模块。 Accessing IRQ description array within a module and displaying action
我是 Linux 内核编程的新手,很长一段时间以来我都在尝试编写模块,它应该执行以下操作:用我自己的替换默认的 irq 处理程序,然后恢复默认的处理程序,使用 IDT (尝试保存 idt 用我自己的替
当一个 IRQ 线在多个已注册的中断服务例程之间共享时,什么决定了中断线产生时 ISR 的执行顺序? 最佳答案 无论如何,顺序是不可预测的,因为正如你所说,中断线是共享的。因此,系统中有(或可能有)其
我正在浏览 arch/arm/kernel/perf_event.c 中的部分 Linux 内核源代码,并试图了解如何进行 request_irq 设置这里: static int armpmu_re
我正在开发一个玩具 unix 克隆,我正在尝试正确连接我的中断。我遇到了一个问题,我的键盘 IRQ (IRQ 1) 即使在我正确确认它之后也只触发一次等等。我也启用了 PIT 中断,以仔细检查我的 A
我目前正在学习 Derek Molloy 在他的书“Exploring Raspberry Pi - Interfacing to The Real World with Embedded Linux
我正在用 C 编写一个内核模块,它正在努力访问 IRQ 描述数组元素并显示这些元素的所有操作名称。 一开始,我认为这个irq_desc 数组就像一个宏,但编译后我明白了它不是。然后我使用了 for_e
我是一名优秀的程序员,十分优秀!