LOADING

加载过慢请开启缓存 浏览器默认开启

mit-6s081-lab02-sysinfo

像之前那样添加syscall,和$U/_sysinfotest

代码

kernel/syscall.h

#define SYS_sysinfo 23

kernel/syscall.c

extern uint64 sys_sysinfo(void);

[SYS_sysinfo] sys_sysinfo

kernel/sysproc.c

#include "sysinfo.h"

int sys_sysinfo(void) {
    struct sysinfo info;
    uint64 addr;
    struct proc *p = myproc();

    if (argaddr(0, &addr) < 0)
        return -1;

    info.freemem = kfreemem();
    info.nproc = nproc();

    if (copyout(p->pagetable, addr, (char *)&info, sizeof(info)) < 0)
        return -1;

    return 0;
}

kernel/kalloc.c

void *
kalloc(void)
{
  struct run *r;

  acquire(&kmem.lock);
  r = kmem.freelist;
  if(r)
    kmem.freelist = r->next;
  release(&kmem.lock);

  if(r)
    memset((char*)r, 5, PGSIZE); // fill with junk
  return (void*)r;
}
uint64
kfreemem(void)
{
struct run *r;
uint64 pages=0;
acquire(&kmem.lock);
for(r=kmem.freelist;r;r=r->next)
        pages++;
release(&kmem.lock);

return pages*PGSIZE;
}

kernel/proc.c

int
nproc(void)
{
        int count=0;
        struct proc* p;
        acquire(&pid_lock);
        acquire(&wait_lock);
        for(p=proc;p<&proc[NPROC];p++)
        {
                if(p->state!=UNUSED){
                        count++;
                }

        }
        release(&wait_lock);
        release(&pid_lock);

        return count;
}

然后输入sysinfotest

问答