【问题标题】:The cross-platform version of gcc ignore the attribute tag __attribute__((interrupt)) of my functiongcc的跨平台版本忽略了我的函数的属性标签__attribute__((interrupt))
【发布时间】: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


【解决方案1】:

interrupt 属性只是针对 x86/x86-64 架构时对 G++ 的最新添加,并且在 G++ 7.0 及更高版本中可用。我猜想您的 i686-elf-g++ 交叉编译器早于 7.0,而您的主机编译器 g++ 是 7.0 或更高版本。您必须将 i686 交叉编译器升级到更新版本。

【讨论】:

  • 真的吗?我的 g++ 常规版本是 clang++ 9.0.0(我在 macOS 上),我的 i686-elf-g++ 版本是 6.3.0。我在 g++ 的 6.3.0 文档中搜索时创建了中断属性,记录一个不存在的功能有点奇怪 oO
  • Apple 的 Clang/LLVM 在面向 x86/x86-64 时似乎只支持 interrupt 属性,因为版本 9。它支持其他目标(如 ARM 和 MIPS)的函数的中断属性的时间要长得多。
  • @Adrien :GCC 和 CLANG 是不同的项目。 Apple 拥有自己的 CLANG/LLVM 版本,以及后来的 XCode 版本。 interrupt 属性已经存在了一段时间,但仅适用于 ARM 和 MIPS 等架构。它只是最近才出现在 GCC/CLANG/Apple CLANG 中(大约从 2016 年开始)。适用于 x86 和 x86-64 平台。
  • 旧版本会忽略interrupt 属性,通常会在不受支持的平台上抛出警告,并且会被忽略。
  • 感谢它在 gcc 7+ 上运行良好,但我记得有一个建议说我不应该使用最后一个版本,而是一个稍旧的版本,因为最新版本没有经过足够的测试,所以也许我应该找到另一种在 C/C++ 中编写中断处理程序的方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 2018-04-17
  • 2016-03-28
  • 2015-05-23
  • 2021-08-23
  • 1970-01-01
相关资源
最近更新 更多