Memory 在xv6中编写程序来计算进程内存页

Memory 在xv6中编写程序来计算进程内存页,memory,system-calls,xv6,Memory,System Calls,Xv6,我试图编写一个系统调用,返回当前进程正在使用的内存页数,但我不知道从何处开始以及应该查看哪些变量。 我在proc.h中看到了两个变量sz和pgdir。但我不知道它们各自代表的确切含义。看看,您已经了解了所有您想要了解的内存管理: // Grow current process's memory by n bytes. // Return 0 on success, -1 on failure. int growproc(int n) { uint sz; struct proc *cur

我试图编写一个系统调用,返回当前进程正在使用的内存页数,但我不知道从何处开始以及应该查看哪些变量。 我在proc.h中看到了两个变量sz和pgdir。但我不知道它们各自代表的确切含义。

看看,您已经了解了所有您想要了解的内存管理:

// 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
syscall使用,其本身由
malloc
调用

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

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

  • PGROUNDUP(size)
    将内存大小转换为四舍五入到下一页大小的内存大小
  • PGSIZE
    这是页面大小
因此,一个进程实际使用的页面数是
(PGROUNDUP(proc)->sz)/PGSIZE