9

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

以特权模式进入内核是否仅与int 0x80,或者与任何softirq实现相关联,我可以自动进入特权模式或禁用保护模式并进入特权模式,我们必须通过编写其关联标志手动执行?

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

我已经看到了如何在 linux 内核中定义和触发我自己的新软中断?但没有得到我正在寻找的解决方案。

我会更清楚一点,为什么我需要这个
我已经实现了几个内核函数,它们直接与硬件外围设备对话,我希望它们使用软件中断从用户空间触发。不能使用具有可用驱动程序架构的系统调用,因为我需要减少执行时间。

4

1 回答 1

4

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

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

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

    #define MY_SYSCALL_VECTOR             0x120
    
  2. 更改 Linux 中的函数 trap_init arch/x86/kernel/traps.c

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

您需要注意文件开头记录的 CPU 寄存器entry_32.S

于 2016-04-18T21:01:21.770 回答