我正在尝试使用C++编写中断服务程序,以下是一些代码片段:
void handlerProxy(int intrNo) {}
typedef void(*IntrHandler)();
IntrHandler IDT[256];
我希望能像这样在运行时或编译时初始化IDT
:
for (size_t i = 0; i < 256; ++i) {
// It doesn't compile
IDT[i] = std::bind(handlerProxy, i);
// or
IDT[i] = [i] () {handlerProxy(i);};
}
问题是
- 带有捕获的lambda函数无法转换为函数指针
- 我的代码将使用
-fno-rtti
编译,因此std::function::target
不可用
是否有可能我能够完成这个任务?
我不想手动编写IDT[0]= ... IDT[1]=...
或使用其他程序来生成它。允许使用宏和内联汇编。可以更改IDT
的类型,但是IDT
的元素应该是函数地址,这意味着类似于jmp IDT[0]
的内容应该是有效的。
IDT[]
的类型定义为一个带有函数调用运算符重载(函数对象)的结构体是否可行? - Galikjmp IDT[0]
将不起作用。BIOS 只需push
寄存器和标志,然后jmp
到地址来调用这些函数。 - Shangtong Zhang