编写一个程序来计算 xv6 中的进程内存页数
Writing a program to count process memory pages in xv6
我正在尝试编写一个系统调用,returns 当前进程正在使用的内存页数,但我不知道从哪里开始以及我应该查看哪些变量。
我在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
.
调用
据此,我们断言 struct proc {
中的 sz
实际上是进程内存大小。
从vm.c
读allocuvm
,可以看到两个宏:
PGROUNDUP(size)
将内存大小转换为四舍五入到下一页大小的内存大小,
PGSIZE
这是页面大小。
所以一个进程实际使用的页数是(PGROUNDUP(proc)->sz)/PGSIZE
.
我正在尝试编写一个系统调用,returns 当前进程正在使用的内存页数,但我不知道从哪里开始以及我应该查看哪些变量。 我在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
.
据此,我们断言 struct proc {
中的 sz
实际上是进程内存大小。
从vm.c
读allocuvm
,可以看到两个宏:
PGROUNDUP(size)
将内存大小转换为四舍五入到下一页大小的内存大小,PGSIZE
这是页面大小。
所以一个进程实际使用的页数是(PGROUNDUP(proc)->sz)/PGSIZE
.