How to display physical memory

in OS kernel code, a physical address is uint64, but it is often being cast as a void, or char, then carry around. I think this makes a lot of interface like memset, memcpy, etc more convenient to use.

void vmprint_helper(pagetable_t *pagetable*, char* prefix, int level) {
  // there are 2^9 = 512 PTEs in a page table.
  for(int k = 0; k < 512; k++) {
    pte_t pte = pagetable[k];
    if(pte & PTE_V) {
      printf(“%s%d: pte %p pa %p\n”, prefix, k, pte, PTE2PA(pte));
      int next_level = level - 1;
      if (level > 0) {
        uint64 child = PTE2PA(pte);
        pagetable_t pt = (pagetable_t)child;
        vmprint_helper(pt, print_prefix(next_level), next_level);
      }
    }
  }
}

void vmprint(pagetable_t *pagetable*)
{
  printf(“page table %p\n”, pagetable);
  vmprint_helper(pagetable, “..”, 2);
}

Another reason cast uint64 to void* is easy to print. (see above code about how to print page tables)

Last updated

Was this helpful?