【问题标题】:Writing a program to count process memory pages in xv6编写一个程序来计算 xv6 中的进程内存页数
【发布时间】:2021-04-22 23:10:38
【问题描述】:

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

【问题讨论】:

    标签: memory system-calls xv6


    【解决方案1】:

    看看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 调用。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多