【发布时间】:2017-10-29 18:32:43
【问题描述】:
我下载了英特尔 IA-64 和 32 书籍,因为我想更深入地了解 CPU 的工作原理。所以我读了这本书并开始编写一些东西。我启用了 IDT,当我想编写一个中断处理程序时,我有那个代码:
extern "C" __attribute__((interrupt)) void test (void* ptr)
{
}
int main (void)
{
return 0;
}
当我使用 i686-elf-g++ -Wall -Wextra -O2 -c -m32 main.cpp 编译时,我收到以下警告:main.cpp:6:60: warning: 'interrupt' attribute directive ignored,但是当我使用 g++ -Wall -Wextra -O2 -c -m32 main.cpp 编译时,编译运行良好,生成的代码就像最后应该使用 iret 指令(这就是我想要的):
Disassembly of section __TEXT,__text:
_test:
0: 55 push ebp
1: 89 e5 mov ebp, esp
3: fc cld
4: 5d pop ebp
5: cf iretd
6: 66 2e 0f 1f 84 00 00 00 00 00 nop word ptr cs:[eax + eax]
有人知道为什么我的跨平台版本 gcc 会出现此警告吗? (我也想知道为什么中断处理程序必须有一个 gcc 参数指针)
【问题讨论】:
-
您是否在 Windows 上设置了“常规”
g++来构建 Windows 目标文件?一开始我很困惑,因为你不需要特殊的i686版本的 gcc 来制作 32 位 x86 代码。 -
@PeterCordes 我在 macOS 上,我的 g++ 是 clang++ 9.0.0。说实话,刚开始的时候根本不知道自己在做什么,所以就跟着 OSDev link 上的教程。但我想如果我没有将前缀值设置为 null gcc 将其值设置为目标架构(在我的情况下它是 i686- 而精灵是因为教程但也许我不需要那个)
-
@PeterCordes :我从这个问题(使用中断指令)中假设他正在做操作系统开发并使用交叉编译器(这是在 OSDev wiki 上推荐的,因为过去一些发行版用来绑定/修补 libgcc 以使用某些主机操作系统功能)。同样,在 OS/X 上,LD 不支持许多允许您进行 OS 开发所需的选项(如链接器脚本)(因此 GNU Binutils 也更方便)。
-
@MichaelPetch 你是对的,即使我不会假装说我正在开发一个操作系统 ^^ 我只是想让 CPU 处于可用模式,但我会如果这个小项目最终能在一个运行良好的操作系统中结束,那就太高兴了
标签: gcc x86 attributes interrupt interrupt-handling