我正在学习Linux内核中的中断处理,并在下面的代码片段中尝试在IRQ2上注册一个虚拟irq处理程序。但是它似乎没有被注册,因为我看到了一个负的返回值和内核中的一条消息,如下面所示,这来自于试图执行free_irq()的清理函数
[ 2203.989585] Trying to free already-free IRQ 2
下面是来自内核日志的printk,这表明它还没有注册:
Here with registering IRQ handler on IRQ2 for flowTest...retval_irqreg= -22
下面是我的代码的相关部分,它有四个功能
1 the bottom
我有一个Linux系统,我正在连接到定制硬件。(具体来说,这是一个带有FPGA的SoC )。
我正在尝试编写一个内核模块,它将响应来自我设备的中断。它包含对request_irq的调用,但这是通过调用uio_register_device来完成的。当我运行insmod时,它会以“无效的参数”失败。
在浏览代码一段时间之后,我最终在模块init函数中添加了这些行:
struct irq_desc *p;
p = irq_to_desc(89);
if (!p) {
printk(KERN_ALERT "No descriptor allocated for IRQ number
假设我想在编译内核之前在arch/x86/boot/string.c中使用printk()。我必须包含哪个头文件,以便链接器知道在哪里可以找到printk()?我尝试了#include <linux/kernel.h>和#include <linux/printk.h>,但在make bzImage期间总是收到错误,告诉我链接器找不到printk
arch/x86/boot/compressed/string.o: In function `memcmp`:
string.c:(.text+0x19): undefined reference to `printk`
此错误将停止内核生成进程。
ld: arch/x86/entry/syscall_64.o:(.rodata+0x1120): undefined reference to `__x64_sys_fd'
BTF .btf.vmlinux.bin.o
pahole: .tmp_vmlinux.btf: No such file or directory
LD .tmp_vmlinux.kallsyms1
.btf.vmlinux.bin.o: file not recognized: file format not recognized
下面是我在linux内核源代码中
我正在尝试编写一个内核驱动程序。但是,当我在cat /dev/pSeudoDrv上执行cat操作时。它只是不停地打印价值。它从来没有离开过。我假设cat操作应该在阅读一次之后退出。然而,它是永远的阅读。这里有什么问题?
#include <linux/init.h>
#include <linux/module.h> /** needed by all modules **/
#include <linux/kernel.h> /** This is for KERN_ALERT **/
#include <linux/fs.h> /** fo
我正在尝试编写一个内核模块来处理PCIe设备的微星中断。我目前已经为我的驱动程序写了一个简单的框架大纲,每当我试图调用'pci_disable_msi(dev)‘时,我得到一个unable to handle kernel NULL指针取消引用错误。我完全按照/Documentation/PCI/MSI-HOWTO.txt中的描述进行操作,在我看来,我不应该得到这个错误。这是错误还是我的设置不正确?从最后出现的输出判断,我非常确定当我调用fpga_remove()时,它正在发生在pci_disable_msi()中。(很明显,这是在我删除模块时发生的)
static struct pc