我目前正在编写一个简单的硬件仿真器,它具有与普通x86 PC不同的架构和CPU指令集。问题是如何模拟这个硬件的随机存取存储器。
我认为更好的方法是分配大量连续内存并将其映射到正在模拟的硬件的地址空间。但是这个硬件具有32位地址空间,应该能够运行贪婪的C ++程序甚至托管环境。此外,这个模拟内存中的大地址范围将更新,所以我需要稀缺。
我目前的方法是基于MS Windows功能VirtualAlloc():VirtualAlloc(NULL, physBytesToAllocate, MEM_RESERVE | MEM_TOP_DOWN, PAGE_NOACCESS)
当我第一次尝试从保留范围读取或写入地址后出现SEH异常时,我将指针提取到尚未存在的内存地址,并使用另一个VirtualAlloc()调用提交单个页面,不同的参数:VirtualAlloc(ptr, ..., MEM_COMMIT, PAGE_READWRITE);
。之后,我将控件返回到SEH异常最初出现的位置(EXCEPTION_CONTINUE_EXECUTION
)。
但是,IMO,整个方法的味道。它像hackery一样lloery,它首先是不便携的,并且需要SEH。那么有更好的方法吗?