是否可以将地址映射到函数的结果?
我正在用C/C++编写Mac OS的NES模拟器(我已经写了一个,所以我知道基础知识)。由于许多硬件寄存器都映射到内存位置,所以我想知道是否有一些系统调用可以用来将地址映射到函数的结果:当它被访问时,函数将被调用。 (我敢肯定,我不能,但嘿,这是值得一问。)是否可以将地址映射到函数的结果?
这里是我想要做什么:
int getStatusRegisterValue()
{
return 0xCAFEBABE;
}
// obviously, more parameters than just this would be involved I suppose
int* statusRegister = syscall_to_map_function_to_address(getStatusRegisterValue);
// from here on, doing (*statusRegister) should call getStatusRegisterValue and
// return its value
*statusRegister == 0xCAFEBABE;
该项目将是我在尝试LLVM ,我的目标是重新编译ROM到LLVM字节码。这就是为什么简单的内存访问可能会触发该功能会很方便(就像真正的NES硬件一样)。解决我的问题的另外两个明显的可能性是缓存寄存器值并将它们存储在实际内存中,或者从重新编译的代码中调用函数来将内存位置映射到他们真正的内容。
谢谢!
也许你可以尝试安装SEGV处理程序并检查那里的错误地址。因为我不使用Mac OS,所以我无法帮助你。
在C++中,您可以为用户定义的类重载*
和->
运算符。这会让你达到你想要的吗?
这是个好主意,但执行引擎需要的功能比C++低得多。我将尝试将ROM重新编译为LLVM字节码,这就是为什么如果唯一的内存访问可以执行该功能会更简单。 – zneak 2010-06-20 17:42:15
这几乎听起来就像正常的函数指针:
typedef int(*function_type)(void);
function_type = &getStatusRegisterValue; // store
int i = function_type(); // call
不同的语法,同样的想法?
不完全:NES有几个内存位置可以访问硬件寄存器而不是实际的RAM地址,我试图模仿这种行为。我不打算自己调用函数(因此这不是一个语法问题):这个项目是使用LLVM的借口,因此我会尝试将ROM重新编译为LLVM字节码。如果我可以让我的程序的地址空间像NES的地址空间那样行事,我会认为我会有更少的事情需要担心。当然,还有一些明显的选择,比如使用函数将位置映射到他们真正需要做的事情。 – zneak 2010-06-20 17:51:16
这不能在C(或C++,但为了简单起见我们只是坚持C)完成。
你可以用运算符重载和仿函数来“模拟”(ha)这种效应,但是它不会是真实的。关于目标函数通常需要做太多的假设。
1)您认为它始终返回相同的值。
其实,就是这样。尽管如此,这是一个很大的假设!
其实,我不想让它总是返回相同的值。这将是愚蠢的:我不需要每次访问内存位置时计算函数的结果,如果我可以将它放在那里并让它代替。这个例子中的平等只是它做的一个例子。除此之外,很明显,为了简洁起见,它假设了各种各样的事情,但我可以想象一个更灵活的设计。 – zneak 2010-06-20 23:09:58
除非使用内存断点(如果在系统上可用,则实际只是用于调试),否则不能触发内存访问执行的函数。
这也是独立于编程语言,你的问题是针对现代计算机平台的。
我指定的编程语言只是因为如果有解决方案,发布它的人会知道使用哪种语言。 – zneak 2010-06-20 23:00:39
没有C/C++这样的东西。 – 2010-06-20 16:15:10
@wowus:“C/C++”听起来像是一个总结“C++与C交互”的好方法。我还应该补充说,将会有Objective-C和一小部分涉及该语言的程序集。 – zneak 2010-06-20 16:57:37
你能展示一些示例代码吗?或用例?我无法想象这一点。 – 2010-06-20 17:09:24