【问题标题】:C/C++ Windows or Linux map random memory blocks into consecutive orderC/C++ Windows 或 Linux 将随机内存块映射为连续顺序
【发布时间】:2017-06-08 04:55:45
【问题描述】:

我的要求是模拟旧的摩托罗拉内存控制器。

基本上,控制器将 8 x 8Kbyte 内存块映射到 64Kbyte 地址空间,以供 CPU 后续访问。控制器最多可以访问 1024 个这样的 8K 块。

目前我已经通过使用像这样的大型平面数组来实现这一点:

unsigned char Memory[1024][8192];
int MappedMemoryBank[8];
short int Address;

然后要访问任何特定的内存地址,我使用类似这样的东西

unsigned char aByte = Memory[MappedMemoryBank[Address>>13]][Address&0x1FFF];

这很好用,但由于内存引用占处理时间的 99%,因此效率非常低。

是否有一种内存映射机制,我可以分配一定数量 (1024) 的内存块,然后将它们(以任何顺序)映射到连续的内存空间中?

这将减少我对以下内容的记忆引用:

unsigned char *Memory;
Memory = pointed to first byte of (re-)mapped memory

unsigned char aByte = Memory[Address]; 

这会快一个数量级(我希望)

适用于 Windows 和/或 Linux 的解决方案都可以。

【问题讨论】:

    标签: c++ c linux windows memory-management


    【解决方案1】:

    您多久更改一次映射与访问内存的频率?

    假设访问它比重新排列它更常见,我可能会保留两个数据副本:一个“映射”数组和一个“物理数组”。

    您在两者之间使用“乒乓球”。也就是说,当您创建映射时,您以正确的顺序将数据从物理阵列复制到映射阵列。当您需要重新排列时,将其复制回物理数组,然后(再次以正确的顺序)复制到映射数组。

    这可能会使重新映射速度减慢 10 倍(或按该顺序),但也会将访问速度加快至少 10 倍。由于重新映射显然只花费了之前不到 1% 的时间,这应该是一个相当大的胜利。

    【讨论】:

    • 感谢您的反馈。这肯定会奏效,但这篇文章中包含了更好的答案。
    【解决方案2】:

    我设法在 Linux 中找到了 mremap() 函数。

    而在 Windows 中是 AWE Address Windowing Extensions MapUserPhysicalPages 函数允许这样做。

    我刚刚测试了 AWE 功能,它们运行良好。不确定它们的效率如何,但它们工作得很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      • 2015-10-05
      • 2013-09-02
      相关资源
      最近更新 更多