【问题标题】:Is there any way to make a call to linux kernel with my own softirq有没有办法用我自己的softirq调用linux内核
【发布时间】:2016-08-09 11:56:06
【问题描述】:

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

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

【问题讨论】:

  • Linux 内核从不在离开real mode 后重新进入。一旦引导加载程序结束其工作,一个体面的操作系统将确保 CPU 全部进入protected/long 模式,直到重新启动。也许你的意思是ring 0
  • 是的,我的意思是环 0,已编辑。谢谢
  • 在 Linux 中进入内核模式最简单的方法是编写自己的驱动程序。
  • 只是这不是我的要求,我一直在寻找如何使用来自用户空间的新软中断进入内核模式
  • 请解释您的问题,而不是您认为的实现。

标签: c linux-kernel embedded-linux system-calls softirq


【解决方案1】:

首先,软件中断和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) 开始。

您需要注意entry_32.S 文件开头所述的 CPU 寄存器。

【讨论】:

  • 这是我发现的,按照您的指示理解流程谢谢。
猜你喜欢
  • 2021-03-28
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多