gpt4 book ai didi

c - 有什么办法可以用我自己的 softirq 调用 linux 内核

转载 作者:太空狗 更新时间:2023-10-29 17:03:55 25 4
gpt4 key购买 nike

类似于系统调用在 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?但没有得到我正在寻找的解决方案。

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

最佳答案

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

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

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

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

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

您需要按照 entry_32.S 文件开头的说明处理 CPU 寄存器。

关于c - 有什么办法可以用我自己的 softirq 调用 linux 内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36682227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com