3

mmap()我对如何在 iOS 或 OSX 上使用框架感到有些困惑。

如果一个文件被映射到虚拟内存,mmap()并且从它请求数据,内核将数据中的数据页分配到 RAM。这实际上如何影响创建对象的方式?

alloc如果通常使用/创建对象init,则分配内存块并启动对象。但是,如果数据驻留在虚拟内存中,在mmap'ed 文件中呢?是否alloc需要在对象上调用?为对象分配的内存是否被虚拟内存中的数据填充?或者是否跳过alloc调用并只是将指针传递给虚拟内存中的数据?

例如图像或声音文件,如果我知道文件在虚拟内存中的位置,我将如何设置对象?

如果分配数据,如果数据已经分页到 RAM 中,它不会被复制吗?

我在想,使用来自虚拟地址的内存将消除在堆上分配的需要。

4

1 回答 1

1

如果您只有一个对象存储在 mmaped 空间中,那么您只需跳过分配并直接使用该位置。但是,通常您将拥有多个对象,现在您将自己管理它。通常,它的至少一部分将以固定的方式布局,以便两个进程都知道在哪里可以找到东西。代替指针,您可以从竞技场开始使用偏移量,因为这在两个进程的地址空间中都有效。

本质上,您获得了一大块内存,就好像您完成了一个大的 malloc/alloc 并且您可以在其中玩耍。

如果你有,说

void *p = mmap( <appropriate arguments> );

并且您想将 foo 类型的对象放在偏移量 200 处,您会说

foo *f = (foo *)p+200;

现在您可以以所有正常方式操作 f ,但 f 不包含任何指向映射空间的指针。将偏移量替换为此类指针通常是一种很好的纪律,然后当您需要跟随一个时,您可以将其转换为指针(通过添加 p)。

于 2012-04-04T17:13:59.653 回答