【发布时间】:2010-12-08 18:38:47
【问题描述】:
我们正在开发一个玩具操作系统,作为课堂作业。 我在编写内核恐慌函数时遇到了一些问题。
它应该保存所有寄存器,调用一些类似 printf 的函数,然后打印保存的寄存器并停止 cpu。现在它被定义为一个宏:
#define panic(...) \
do{ \
asm volatile("SAVE_REGISTERS %1\n\t" : "m="(_panic_context)); \
_panic_printk(&_panic_context, __VA_ARGS__); \
while(0)
_panic_context 是一个全局变量,其中包含已保存的线程寄存器和其他一些内容。问题在于SAVE_REGISTERS。它是在汇编头文件中某处定义的宏,但我不知道如何包含它。文件中的简单#include 显然不起作用。我试过用谷歌搜索和写有趣和绝望的东西(比如汇编字符串中的#include :-))但没有任何帮助。你有什么想法可以解决这个问题吗?
我们使用 GCC 并针对 MIPS 进行编译(在模拟器中运行 :-))
编辑:
SAVE_REGISTERS 是用 .macro SAVE_REGISTERS... 定义的。它不能在 C 宏中,因为它在其他汇编模块中使用。
我不能用它制作 .S 文件,因为恐慌必须是可变的。或者至少我想不出任何其他方法来做到这一点。
【问题讨论】:
-
SAVE_REGISTERS究竟是如何定义的?
标签: c gcc assembly operating-system inline-assembly