# Linux Kernel Module Cheat

#### 17.12.2. virt_to_phys

Convert a virtual address to physical:

    insmod virt_to_phys.ko
    cat /sys/kernel/debug/lkmc_virt_to_phys

Source: kernel_modules/virt_to_phys.c

Sample output:

    *kmalloc_ptr = 0x12345678
    kmalloc_ptr = ffff88000e169ae8
    virt_to_phys(kmalloc_ptr) = 0xe169ae8
    static_var = 0x12345678
    &static_var = ffffffffc0002308
    virt_to_phys(&static_var) = 0x40002308

We can confirm that the `kmalloc_ptr` translation worked with:

    ./qemu-monitor 'xp 0xe169ae8'

which reads four bytes from a given physical address, and gives the expected:

    000000000e169ae8: 0x12345678

TODO it only works for kmalloc however, for the static variable:

    ./qemu-monitor 'xp 0x40002308'

it gave a wrong value of `00000000`.

Bibliography:

- https://stackoverflow.com/questions/5748492/is-there-any-api-for-determining-the-physical-address-from-virtual-address-in-li/45128487#45128487

- https://stackoverflow.com/questions/39134990/mmap-of-dev-mem-fails-with-invalid-argument-for-virt-to-phys-address-but-addre/45127582#45127582

- https://stackoverflow.com/questions/43325205/can-we-use-virt-to-phys-for-user-space-memory-in-kernel-module

- Userland physical address experiments