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