类似于系统调用如何在int 0x80
上运行,是否可以在内核中实现我自己的ISR,以便在softirq上假设int 0x120
或任何其他softirq程序计数器可以从用户跳转空间到内核空间?
在特权模式下进入内核只与int 0x80
相关联,或者与任何softirq实现相关联我可以自动进入特权模式,或者为了禁用受保护模式并进入特权模式,我们必须通过编写其关联来手动完成标志?
还有一件事,如果有可能实现这种类型的ISR,那么数据交换的最佳方式是使用寄存器EBX,ECX,EDX,ESI,EDI和EBP还是其他任何方式?< / p>
我已经看过How to define and trigger my own new softirq in linux kernel?,但没有找到我想要的解决方案。
我会更清楚,为什么我需要这个 我实现了很少的内核函数,它们直接与硬件外设通信,我希望它们使用软件中断从用户空间触发。不能使用具有可用驱动程序体系结构的系统调用,因为我需要减少执行时间。
答案 0 :(得分:3)
首先,软件中断和softirq是完全不同的: 软件中断是从用户模式切换到特权模式的汇编指令,这正是您正在寻找的 softirq是一种将硬件中断处理程序拆分为上半部分的机制
对于您的问题 - 您需要编写汇编代码并修改特定于平台的代码
您需要在Linux arch/x86/include/asm/irq_vectors.h
中定义int编号:
#define MY_SYSCALL_VECTOR 0x120
更改Linux arch/x86/kernel/traps.c
中的函数trap_init:
set_system_trap_gate(MY_SYSCALL_VECTOR, entry_INT120_32);
现在您需要编写汇编函数entry_INT120_32
。您可以在文件中看到一个示例:arch/x86/entry/entry_32.S
从ENTRY(entry_INT80_32)
开始。
您需要处理entry_32.S
文件开头记录的CPU寄存器。