メモリにマップする開いているファイルがある場合は、ファイル記述子を使用します。この場合、匿名のマップ (ファイルによってサポートされていないマップ) を作成しているため、ファイル記述子は必要ありません。fd匿名マップを無視する実装もあれば、-1 にする必要がある実装もあります。
2 番目の質問は構文エラーです (おそらくタイプミス)。おそらく次のようになります。
heapbase = (char*)(((uintptr_t)mem+HEADER_SIZE+OBJECT_GRAIN-1)
&~(OBJECT_GRAIN-1)) - HEADER_SIZE;
その場合、OBJECT_GRAINは 2 の累乗になり、その累乗に合わせる方法です。たとえば、8 の場合は~(OBJECT_GRAIN-1)( ~7、これは) になり、値と AND 演算すると、その値をそれ以下の 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