软件中断

6

如何在C语言中编程软件中断?我知道需要编写一个中断服务例程,然后中断CPU以便调用该例程,但我不知道如何在C语言中实现。此外,我也不知道如何将该例程注册到中断描述符表中。

我使用的是x86-64 CPU(AMD Turion64 X2)和gcc编译器。

任何帮助都将不胜感激。


1
你所询问的事情是在编写操作系统时需要做的事情,而不是应用程序。您能否再详细解释一下您想要实现什么? - R.. GitHub STOP HELPING ICE
实际上,我正在为我的学院工作任务而努力,我需要检查IRET指令,这就是为什么我需要一个中断服务例程。在我编写完它之后,我应该“玩”可执行文件的十六进制代码,并更改IRET(删除它或其他操作),以查看会发生什么。 - protector
3
你不能在C语言中编写中断服务程序(ISR),需要使用汇编语言。在保护模式操作系统上无法测试ISR。修改IRET指令会导致代码崩溃。建议你和你的教育者讨论这个任务。 - Hans Passant
4个回答

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

1
操作系统会将真实的中断隐藏起来,对于应用程序而言是不可见的。据我所知,除非你在内核层(ring 0?)运行,否则不可能看到它们。

0
编写ISR并不是语言问题,你可以用C语言实现。
这涉及到对操作系统内核的理解,了解在某个中断线上调用哪些例程来注册ISR,并在中断描述符表中进行条目输入。 例如,在ARM上使用Linux时,使用request_irq()函数将ISR注册到IRQ控制器并在IRQ_DESC表中创建一个条目。
因此,建议首先检查您所使用的操作系统的ISR框架。

0
使用sigaction。请参阅man 2 sigaction
要引发中断,请使用raisekill

这并不能完成任务,它无法真正中断。如果我表达不清楚,我的目的是中断CPU,而不是应用程序。 - protector

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接