通过 gcc 的扩展 asm 调用的系统调用修改的寄存器
Registers modified by systemcall invoked through gcc's extended asm
我正在使用 gcc 的扩展 asm 来调用系统调用。我正在 PowerPC(飞思卡尔 MPC5200B)上开发专有 RTOS。
根据 gcc 的 documentation 我应该将汇编代码使用的所有寄存器——既不是输入也不是输出——添加到 clobbers 列表中,因为 gcc 不分析汇编代码,因此不知道哪些寄存器正在被更改。
问题是我不知道系统调用改变了哪个寄存器。事实上,我正在观察系统调用更改保存指针的寄存器的情况。系统调用返回后,正在使用寄存器中的指针,导致内存访问无效。
遇到这种情况应该怎么处理?
对于未来的读者:
一般的答案是,您可以在系统 ABI 的文档中找到被系统调用更改的寄存器。
对于我的系统 (Freescale MPC5200B),我发现答案是 IBM Application Note 'Developing PowerPC Embedded Application Binary Interface (EABI) Compliant Programs'。
所以我将标记为 volatile 的寄存器(即 R3..R12、F0..F13 和标志寄存器)添加到 clobbers 列表中。
我正在使用 gcc 的扩展 asm 来调用系统调用。我正在 PowerPC(飞思卡尔 MPC5200B)上开发专有 RTOS。
根据 gcc 的 documentation 我应该将汇编代码使用的所有寄存器——既不是输入也不是输出——添加到 clobbers 列表中,因为 gcc 不分析汇编代码,因此不知道哪些寄存器正在被更改。
问题是我不知道系统调用改变了哪个寄存器。事实上,我正在观察系统调用更改保存指针的寄存器的情况。系统调用返回后,正在使用寄存器中的指针,导致内存访问无效。
遇到这种情况应该怎么处理?
对于未来的读者:
一般的答案是,您可以在系统 ABI 的文档中找到被系统调用更改的寄存器。
对于我的系统 (Freescale MPC5200B),我发现答案是 IBM Application Note 'Developing PowerPC Embedded Application Binary Interface (EABI) Compliant Programs'。
所以我将标记为 volatile 的寄存器(即 R3..R12、F0..F13 和标志寄存器)添加到 clobbers 列表中。