task4 finished

This commit is contained in:
2025-05-29 11:15:51 +08:00
parent f0aaffb0b6
commit 8fb0212778
2 changed files with 180 additions and 25 deletions

View File

@@ -126,38 +126,40 @@ sys_uptime(void)
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;
{
// lab pgtbl: your code here.
struct proc *p = myproc();
uint64 mask = 0;
unsigned int abits=0;
for (int i = 0; i < n; i++) {
uint64 v = va + i * PGSIZE;
pte_t *pte = walk(p->pagetable, v, 0);
uint64 addr;
argaddr(0, &addr);
if (!pte || (*pte & PTE_PS))
continue;
int num;
argint(1,&num);
if ((*pte & PTE_V) && (*pte & PTE_A)) {
mask |= (1 << i); // Set bit i in mask
*pte &= ~PTE_A; // Clear the Accessed bit
uint64 dest;
argaddr(2, &dest);
for(int i=0;i<num;i++){
uint64 query_addr = addr + i * PGSIZE ;
pte_t * pte=walk(p->pagetable, query_addr, 0);
if(*pte&PTE_A)
{
abits=abits|(1<<i);
*pte=(*pte)&(~PTE_A);
}
}
if (copyout(p->pagetable, user_mask_addr, (char*)&mask, sizeof(mask)) < 0)
if(copyout(p->pagetable,dest,(char*)&abits, sizeof(abits)) < 0)
return -1;
return 0;
}
return 0;
}