Scrivere un comando physmap in grado ti mostrare tutti i mapping su indirizzi fisici (o la loro eventuale assenza) corrispondenti ad un range di indirizzi virtuali nello spazio di indirizzi attivo. Ad esempio potreste ustilizzare il comando 'physmap 0x3000 0x5000' per ottenere, nel kernel monitor, gli indirizzi fisici ed i corrispondenti bit dei permessi relativi alle pagine agli indirizzi virtuali 0x3000, 0x4000 e 0x5000. -------------------------------------------------- int mon_showmappings(int argc, char **argv, struct Trapframe *tf) { if (argc<3) { cprintf("USAGE: map [startVA] [endVA] \n"); return -1; } char * sstartVA = argv[1]; char * sendVA = argv[2]; //cprintf("[%s,%s]\n",sstartVA,sendVA); uintptr_t istartVA = strtol(sstartVA,NULL,16); uintptr_t iendVA = strtol(sendVA,NULL,16); //cprintf("int: [x,x]\n",istartVA,iendVA); int cnt = ((iendVA - istartVA)>>12)&0xFFFFFF; //cprintf("cnt %d\n",cnt); cprintf("virtual address physical address PTE_U PTE_W PTE_P\n"); for ( int i = 0 ; i < cnt ; i++) { uintptr_t curVA = istartVA + i * 0x1000; cprintf(" x ",curVA); pte_t * entry ; struct PageInfo *pginfo = page_lookup(kern_pgdir,(void *)curVA,&entry); if (!pginfo) { cprintf(" None "); cprintf(" None "); cprintf(" None"); cprintf(" None\n"); } else { physaddr_t pa = PTE_ADDR(*entry); cprintf(" x ",pa); cprintf(" %d %d %d\n",1-!(*entry&PTE_U),1-!(*entry&PTE_W),1-!(*entry&PTE_P)); } } return 0; }