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