我已经在JamVM上工作了两周,这是一个小巧但功能强大的Java虚拟机。

现在我试图弄清楚内存是如何实现的,我被困在两个c愚蠢的问题上:

char *mem = (char*)mmap(0, args->max_heap, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON, -1, 0);

-->-1参数代表文件描述符,这是什么意思?(我一直在阅读mmap man,但没有找到它,也许我误解了。..).

heapbase = (char*)(((uintptr_t)mem+HEADER_SIZE+OBJECT_GRAIN-1&)~(OBJECT_GRAIN-1)) HEADER_SIZE;

-->什么是1&?我没有在C规范中找到它。..

谢谢,

燕恩

有帮助吗?

解决方案

当您有一个要映射到内存中的打开文件时,可以使用文件描述符。在这种情况下,您正在创建一个匿名映射(一个不受文件支持的映射),因此不需要文件描述符。一些实现忽略 fd 对于匿名地图,一些 要求 它是-1。

第二个问题是语法错误(可能是拼写错误)。它可能应该是这样的:

heapbase = (char*)(((uintptr_t)mem+HEADER_SIZE+OBJECT_GRAIN-1)
    &~(OBJECT_GRAIN-1)) - HEADER_SIZE;

那样的话, OBJECT_GRAIN 将是两个的力量,这是一个与这个力量对齐的方法。例如,如果它是8,那么 ~(OBJECT_GRAIN-1) 会是 ~7 (~00...001112, ,这是 ~11...110002)当有一个值时,它可以用来强制该值为小于或等于它的8的倍数。

事实上,这绝对是一个转录错误的地方(不一定是你),因为,当我下载JamVM从 这里 看看里面 src/alloc.c, ,我得到:

void initialiseAlloc(InitArgs *args) {
    char *mem = (char*)mmap(0, args->max_heap, PROT_READ|PROT_WRITE,
                                               MAP_PRIVATE|MAP_ANON, -1, 0);
    :
    << a couple of irrelevant lines >>
    :    
    /* Align heapbase so that start of heap + HEADER_SIZE is object aligned */
    heapbase = (char*)(((uintptr_t)mem+HEADER_SIZE+OBJECT_GRAIN-1)&
               ~(OBJECT_GRAIN-1))-HEADER_SIZE;

(请注意,您的版本也缺少 - 紧随其后 HEADER_SIZE, ,指向转录问题的其他东西)。

其他提示

回答第一个问题。从手册页

除非设置了MAP_ANONYMOUS,否则

fd应该是有效的文件描述符。如果设置了MAP_ANONYMOUS,则在Linux上将忽略fd。但是,如果指定了MAP_ANONYMOUS(或MAP_ANON),则某些实现要求fd为-1,可移植应用程序应确保做到这一点。

所以它是-1,因为正在使用MAP_ANONYMOUS

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top