当您有一个想要映射到内存的打开文件时,您可以使用文件描述符。在这种情况下,您正在创建一个匿名映射(一个不受文件支持的映射),因此不需要文件描述符。有些实现忽略fd
匿名地图,有些要求它是-1。
第二个问题是语法错误(可能是错字)。它可能应该是这样的:
heapbase = (char*)(((uintptr_t)mem+HEADER_SIZE+OBJECT_GRAIN-1)
&~(OBJECT_GRAIN-1)) - HEADER_SIZE;
在这种情况下,OBJECT_GRAIN
将是 2 的幂,这是与该幂对齐的一种方式。例如,如果它是 8,那么~(OBJECT_GRAIN-1)
将是~7
( ,即),当它与一个值进行与运算时,可用于将该值强制为小于或等于它的 8 的倍数。~00...001112
~11...110002
事实上,这绝对是某个地方的转录错误(不一定是你),因为当我从这里下载 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
,其他一些指向转录问题的东西)。