#!/usr/bin/perl # Walk the freelists in MDB to get the page_t structs. # *page_freelists+8/K | ::map *. | ::map .+8*N | /K | ::list page_t p_next | ::print page_t p_pagenum # NOTE: N must in hex! ($n) = @ARGV; if($n){ get_freelist($n); } else{ for $i (0..127){ $n = sprintf("%x", $i); get_freelist($n); } } sub get_freelist { my $n = shift; $cmd = "echo '*page_freelists+8/K | ::map *. | ::map .+8*" . $n . "| ::map *. | ::list page_t p_next | ::print page_t p_pagenum' | mdb -k |"; print "CMD: $cmd\n"; print $n, ":"; open(IN, $cmd); @pages = (); while( ){ ($dummy1, $dummy2, $page) = split; push @pages, $page; } close(IN); print join(" ", @pages), "\n"; }