View on GitHub
Physical Address Space#
Page Tables#
make stackprint
./stackprint
cat /proc/$(cat stackprint.pid)/maps
VADDR="$(cat stackprint.addr)"
VADDR_HEX=${VADDR#0x}
VADDR=$((16#$VADDR_HEX))
PAGE_SIZE=4096
VPN=$(( VADDR / PAGE_SIZE ))
echo "VPN=${VPN}"
ENTRY=$(sudo dd if=/proc/$(pidof stackprint)/pagemap bs=8 count=1 skip=$VPN 2>/dev/null | od -An -t u8 | awk '{print $1}')
echo "ENTRY=${ENTRY}"
printf "ENTRY=%x\n" "$ENTRY"
PRESENT=$(( (ENTRY >> 63) & 1 ))
SWAPPED=$(( (ENTRY >> 62) & 1 ))
PFN_MASK=$(( (1 << 55) - 1 ))
PFN=$(( ENTRY & PFN_MASK ))
echo "PRESENT=$PRESENT"
echo "SWAPPED=$SWAPPED"
if [ "$PRESENT" -eq 1 ]; then
echo "PFN=$PFN"
printf "PFN=0x%x\n" "$PFN"
fi