编写一个程序来计算 xv6 中的进程内存页数

问题描述

我正在尝试编写一个系统调用,该调用返回当前进程正在使用的内存页数,但我不知道从哪里开始以及应该查看哪些变量。 我在 proc.h 中看到了两个变量 sz 和 pgdir。但我不知道它们分别代表什么。

解决方法

看看proc.c,你有所有你想了解的内存管理:

// Grow current process's memory by n bytes.
// Return 0 on success,-1 on failure.
int
growproc(int n)
{
  uint sz;
  struct proc *curproc = myproc();
  sz = curproc->sz;
    if((sz = allocuvm(curproc->pgdir,sz,sz + n)) == 0)
      return -1;
  curproc->sz = sz;
  switchuvm(curproc);
  return 0;
}

growproc 用于将进程内存增加 n 字节。此函数由 sbrk 系统调用使用,系统调用本身由 malloc 调用。

由此,我们断言 sz 中的 struct proc { 实际上是进程内存大小。

allocuvm读取vm.c,可以看到两个宏:

  • PGROUNDUP(size) 将内存大小转换为四舍五入到下一页大小的内存大小,
  • PGSIZE 是页面大小。

因此,一个进程实际使用的页面数是(PGROUNDUP(proc)->sz)/PGSIZE

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...