有没有办法用我自己的softirq调用linux内核

Sam*_*Das 8 c system-calls linux-kernel embedded-linux softirq

类似于系统调用的工作方式int 0x80,是否可以在内核中实现自己的ISR,以便在softirq上假设int 0x120或与任何其他softirq程序计数器一起从用户空间跳转到内核空间

正在进入特权模式内核只与有关int 0x80,或与任何软中断实现我可以自动或禁用保护模式并进入我们必须通过编写其相关的标志做手工特权模式进入特权模式?

还有一两件事,如果能够实现这种类型的ISR的,是数据交换的最佳方法是使用寄存器EBX,ECX,EDX,ESI,EDI和EBP或任何其他方式仍然存在?

我已经看过如何在linux内核中定义和触发我自己的新softirq?但没有得到我想要的解决方案.

我会更明确一些,为什么我需要这个
我实现了很少的内核函数,它们直接与硬件外设交谈,我希望它们使用软件中断从用户空间触发.不能使用具有可用驱动程序体系结构的系统调用,因为我需要减少执行时间.

小智 4

首先,软件中断和软中断是完全不同的:软件中断是从用户模式切换到特权模式的汇编指令,这就是您正在寻找的软中断是一种将硬件中断处理程序拆分为上半部分和下半部分的机制

对于您的问题 - 您需要编写汇编代码并修改特定于平台的代码

  1. 您需要在 Linux 中定义 int 数字arch/x86/include/asm/irq_vectors.h

    #define MY_SYSCALL_VECTOR             0x120
    
    Run Code Online (Sandbox Code Playgroud)
  2. 更改 Linux 中的 trap_init 函数arch/x86/kernel/traps.c

    set_system_trap_gate(MY_SYSCALL_VECTOR, entry_INT120_32);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在您需要编写汇编函数entry_INT120_32。您可以在文件中看到一个示例:arch/x86/entry/entry_32.SENTRY(entry_INT80_32).

您需要按照文件开头所述处理 CPU 寄存器entry_32.S