task2 finished
This commit is contained in:
@ -123,3 +123,41 @@ sys_uptime(void)
|
||||
release(&tickslock);
|
||||
return xticks;
|
||||
}
|
||||
|
||||
uint64
|
||||
sys_pgaccess(void)
|
||||
{
|
||||
uint64 va;
|
||||
int n;
|
||||
uint64 user_mask_addr;
|
||||
argaddr(0, &va);
|
||||
argint(1, &n);
|
||||
argaddr(2, &user_mask_addr);
|
||||
if (va < 0 || n < 0 || user_mask_addr < 0)
|
||||
return -1;
|
||||
|
||||
if (n < 0 || n > 32)
|
||||
return -1;
|
||||
|
||||
struct proc *p = myproc();
|
||||
uint64 mask = 0;
|
||||
|
||||
for (int i = 0; i < n; i++) {
|
||||
uint64 v = va + i * PGSIZE;
|
||||
pte_t *pte = walk(p->pagetable, v, 0);
|
||||
|
||||
if (!pte || (*pte & PTE_PS))
|
||||
continue;
|
||||
|
||||
if ((*pte & PTE_V) && (*pte & PTE_A)) {
|
||||
mask |= (1 << i); // Set bit i in mask
|
||||
*pte &= ~PTE_A; // Clear the Accessed bit
|
||||
}
|
||||
}
|
||||
|
||||
if (copyout(p->pagetable, user_mask_addr, (char*)&mask, sizeof(mask)) < 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user