task2 finished

This commit is contained in:
2025-05-27 15:59:57 +08:00
parent 5292fdc6ac
commit bd21012f73
6 changed files with 70 additions and 4 deletions

View File

@ -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;
}