【问题标题】:C/Posix QuestionsC/Posix 问题
【发布时间】:2011-06-17 13:25:14
【问题描述】:

我已经在 J​​amVM 上工作了两周,这是一个小而强大的 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 规范中找不到它...

谢谢,

亚恩

【问题讨论】:

  • 如果这是两个独立的问题,那么您就可以给每个问题一个有用的标题。
  • -1&)~( 甚至不是合法的 C(编译器应该抱怨缺少令牌),你确定它不是 -1)&~(?这意味着 AND NOT,(通常用于关闭特定位)
  • @Wiz:在这种情况下,OBJECT_GRAIN 可能是 2 的幂,所以如果代码是 -1)&~,那么它会将 mem+HEADER_SIZE 舍入到 OBJECT_GRAIN 的下一个倍数。跨度>
  • 是的,我确定,我复制了源代码!如果是错误,可能会出现 compile no 警告?
  • @scoobyclown:请接受可以解决您的问题的答案,而不是将其编辑到标题中。 Stackoverflow.com 不是论坛。

标签: c posix jamvm


【解决方案1】:

回答您的第一个问题。来自man page

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

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

【讨论】:

  • 谢谢!这就是为什么我说这是一个愚蠢的问题,我一开始没有阅读好的手册(我阅读了 3p)
【解决方案2】:

当您有一个想要映射到内存的打开文件时,您可以使用文件描述符。在这种情况下,您正在创建一个匿名映射(一个不受文件支持的映射),因此不需要文件描述符。一些实现忽略了匿名地图的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~00...00111<sub>2</sub>,即 ~11...11000<sub>2</sub>),当它与一个值进行与运算时,可用于将该值强制为 8 的倍数小于或等于它。

事实上,这绝对是某个地方的转录错误(不一定是你),因为当我从 here 下载 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 之前的-,这表明存在转录问题)。

【讨论】:

  • 谢谢,就是这样!但这很奇怪,因为我有最新版本,而且效果很好......
  • 下载 JamVM 的干净副本并应用差异后,唯一的区别似乎是与 heapbase 的行...我可能在阅读时进行了错误的编辑...感谢您的回答,抱歉!
  • @scooby,无需道歉,帮助人们是我们在这里的原因。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 2013-04-09
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
相关资源
最近更新 更多