【问题标题】:Software interrupt软件中断
【发布时间】:2010-08-14 06:37:06
【问题描述】:

如何用 C 语言编写软件中断?我知道需要编写一个中断服务例程然后中断 CPU 以便可以调用该例程,但我不知道如何在 C 中执行此操作。另外,我不知道如何使用中断描述符注册该例程桌子。 我有一个 x86-64 CPU (AMD Turion64 X2),我正在使用 gcc 编译器。 任何帮助将不胜感激。

【问题讨论】:

  • 您要问的事情是您在编写操作系统时所做的事情,而不是应用程序。您能否详细解释一下您要完成的工作?
  • 实际上,我正在为我的教职员工做作业,我需要检查 IRET 指令,这就是我需要中断服务程序的原因。在我写完之后,我应该“玩”可执行文件的十六进制代码并更改 IRET(删除它或其他东西)以查看会发生什么。
  • 你不能用 C 编写 ISR,它需要(一些)程序集。您无法在受保护模式的操作系统上测试 ISR。更改 IRET 只会使代码崩溃。与您的教育工作者讨论这项作业。

标签: c interrupt


【解决方案1】:

中断的概念不包含在 C 规范中(并且在某种程度上也是特定于处理器的)。大多数编译器,包括 GCC,都允许您编写内联汇编代码(或者您当然可以将用汇编编写的文件链接到您的程序)。但最大的问题是常见的操作系统(尤其是那些运行在 64 位模式下的)不会让你改变中断表。我想您最好的选择是寻找一个简单的开源操作系统,然后从普通程序(如果操作系统允许的话)安装您的中断处理程序,或者将您的代码添加到内核中。您不能只在处理器模拟器(或虚拟机)中运行一小段代码的原因是处理器需要相当多的设置才能进入 64 位模式。而关于如何更改中断表的具体细节取决于该设置。

【讨论】:

    【解决方案2】:

    操作系统对应用程序隐藏真正的中断。据我所知,除非您在内核层(环 0?)中运行,否则这是不可能的

    【讨论】:

      【解决方案3】:

      编写 ISR 与语言无关。是的,你可以在 C 中做到这一点。

      这是一个理解你的操作系统内核的问题,关于被调用的例程,这些例程被调用来使用 GIC 或其他中断控制器在某个中断线上注册你的 ISR 并在中断描述符表中创建一个条目。 就像 ARM 上的 Linux .. 它的 request_irq() 向 IRQ 控制器注册一个 ISR 并在 IRQ_DESC 表中创建一个条目。

      因此建议首先检查您各自操作系统的 ISR 框架。

      【讨论】:

        【解决方案4】:

        使用sigaction。见man 2 sigaction

        要引起中断,请使用raisekill

        【讨论】:

        • 这不起作用,它不会产生真正的中断。如果我不清楚,我应该中断 CPU,而不是应用程序。
        猜你喜欢
        • 1970-01-01
        • 2023-04-09
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 2017-05-25
        • 2012-02-04
        • 2014-10-07
        • 2014-11-19
        相关资源
        最近更新 更多