【发布时间】:2016-08-06 00:11:39
【问题描述】:
我正在尝试用 C++ 编写中断服务程序,这里有一些代码 sn-p
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[]的类型设为sturct与函数调用运算符重载(函数对象)是不可能的吗? -
@Galik 在这种情况下
jmp IDT[0]将不起作用。 BIOS 仅通过push寄存器和标志以及jmp地址调用这些函数
标签: c++ macros operating-system c++14