#!/bin/sh
XPID=`pidof X`

XMEM_BYTES=`cut -d' ' -f23 < /proc/$XPID/stat`
echo "X server at pid $XPID:"
echo "  Total VM                       : $XMEM_BYTES bytes"
# .../maps file format
# vm_start-vm_end mode physaddr dev inode file

MMAP_TOTAL=`mawk '
{
	if (($6 == "/dev/mem" || $6 ~ /\/dev\/nvidia[0-9]+/) && substr($2, 4, 1) == "s") {
		split($1, address, "-");
		s="0x"address[1];
		e="0x"address[2];
		total += (e - s);
	}
}
END {
	print total;
}
' < /proc/$XPID/maps`
echo "  Total mmap()ed of address space: $MMAP_TOTAL bytes"
echo "  Total RAM used                 : $((XMEM_BYTES - MMAP_TOTAL)) bytes ($(((XMEM_BYTES - MMAP_TOTAL) / 1024))kb)"
echo "  Addresses:"
mawk '{
	if (($6 == "/dev/mem" || $6 ~ /\/dev\/nvidia[0-9]+/) && substr($2, 4, 1) == "s") {
		split($1, address, "-");
		s="0x"address[1];
		e="0x"address[2];
		printf("    0x%08lx-0x%08lx: %9d bytes (%5.1fmb) @ 0x%s\n", s, e, e-s, (e-s)/(1024*1024), $3);
	}
}' < /proc/$XPID/maps

