如何解决编写一个程序来计算 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
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。