题
我已经在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
。