//------------------------------------------------------------------- // mem64.c // // This module creates a pseudo-file (named '/proc/mem64') that // shows a map of virtual memory use (based on 'level4' table). // // programmer: ALLAN CRUSE // written on: 22 JUN 2008 // revised on: 23 APR 2009 -- for Linux kernel version 2.6.26.6 //------------------------------------------------------------------- #include // for init_module() #include // for create_proc_read_entry() #include // for utsname() #include // for phys_to_virt() char modname[] = "mem64"; struct new_utsname *uts; unsigned long cr3; char title[] = "Linux memory-map for 64-bit kernel"; int my_info( char *buf, char **start, off_t off, int count, int *eof, void *data ) { unsigned long *level4; int i, len = 0; asm(" mov %%cr3, %%rax \n mov %%rax, cr3 " ::: "ax" ); level4 = phys_to_virt( cr3 ); len += sprintf( buf+len, "\n %54s \n", title ); len += sprintf( buf+len, "\n\t\t CR3=%08lX ", cr3 ); len += sprintf( buf+len, "---> Level_4=%p \n", level4 ); for (i = 0; i < 512; i++) { int prot = level4[i] & 0x7; prot = ( prot == 0 ) ? '-' : prot + '0'; if ( (i % 64)==0 ) len += sprintf( buf+len, "\n %03X ", i*8 ); len += sprintf( buf+len, "%c", prot ); } len += sprintf( buf+len, "\n" ); len += sprintf( buf+len, "\n Legend:" ); len += sprintf( buf+len, " '7'=user-accessble " ); len += sprintf( buf+len, " '3'=supervisor-only " ); len += sprintf( buf+len, " '-'=not-present " ); len += sprintf( buf+len, "\n" ); len += sprintf( buf+len, "\n " ); len += sprintf( buf+len, "Linux kernel-version %s ", uts->release ); len += sprintf( buf+len, "on station \'%s\' \n", uts->nodename ); len += sprintf( buf+len, "\n" ); return len; } static int __init mem64_init( void ) { printk( "<1>\nInstalling \'%s\' module\n", modname ); uts = utsname(); create_proc_read_entry( modname, 0, NULL, my_info, NULL ); return 0; //SUCCESS } static void __exit mem64_exit(void ) { remove_proc_entry( modname, NULL ); printk( "<1>Removing \'%s\' module\n", modname ); } module_init( mem64_init ); module_exit( mem64_exit ); MODULE_LICENSE("GPL");