madvise() 在虚拟内存中做什么?

问题描述 投票:0回答:1

以下代码在 xv6(risc-v) 中执行。我有点困惑。为什么我们需要在 malloc() 之后调用 madvise() ? 是为了页表项的换入/换出吗?

PS。 vmprint() 打印页表。

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#include "kernel/vm.h"

#define PG_SIZE 4096
#define NR_PG 16

int main(int argc, char *argv[]) {
  vmprint();
  char *ptr = malloc(NR_PG * PG_SIZE);
  vmprint();
  madvise((uint64) ptr + 10*PG_SIZE, 2*PG_SIZE , MADV_NORMAL);
  vmprint();
  madvise((uint64) ptr + 10*PG_SIZE, 2*PG_SIZE , MADV_DONTNEED);
  vmprint();
  madvise((uint64) ptr + 10*PG_SIZE, 2*PG_SIZE , MADV_WILLNEED);
  vmprint();
  exit(0);
}
c operating-system riscv xv6
1个回答
0
投票

通过 malloc() 函数分配该内存块后,使用 madvise() 函数向内核通知特定内存区域的使用情况。 **第一个 madvise() 调用建议内核从 ptr + 10PG_SIZE 开始并扩展 2*PG_SIZE 字节的内存区域应被视为 MADV_NORMAL,指示正常的内存访问模式。此调用不会立即导致内存分配发生任何变化。 ***第二个表示指定的内存范围如果不使用可以丢弃。 ***第三个,表示指定的内存范围很快就会被访问,因此内核可以主动将页面放入内存,以最大限度地减少访问时的延迟。

© www.soinside.com 2019 - 2024. All rights reserved.