当linux系统发生异常或者 echo 'm' > /proc/sysrq-trigger 我们会看到类似以下的信息,其中括号内字符代表什么含义呢?我们跟踪 sysrq-trigger,看看源码的解释
DMA: 1*4kB (M) 0*8kB 1*16kB (M) 2*32kB (UM) 2*64kB (UM) 1*128kB (U) 2*256kB (UM) 2*512kB (UM) 1*1024kB (M) 1*2048kB (M) 2*4096kB (ER) = 13140kB
DMA32: 294*4kB (UEM) 1052*8kB (UEM) 608*16kB (UEM) 398*32kB (UEM) 190*64kB (UEM) 82*128kB (UEM) 48*256kB (EM) 34*512kB (EM) 23*1024kB (UEM) 13*2048kB (UEM) 371*4096kB (MR) = 1654200kB
Normal: 158*4kB (UEM) 503*8kB (UEM) 266*16kB (UEM) 160*32kB (UEM) 80*64kB (UEM) 40*128kB (UEM) 30*256kB (UEM) 21*512kB (UEM) 9*1024kB (EM) 4*2048kB (EM) 147*4096kB (EMR) = 662224kB
部分源码如下,我们省略一些其他信息,找我们最终想要的
# drivers/tty/sysrq.c
__handle_sysrq()
sysrq_handle_showmem()
show_mem()
# lib/show_mem.c
show_mem()
show_free_areas()
show_migration_types()
# mm/page_alloc.c
show_migration_types(unsigned char type)
{
static const char types[MIGRATE_TYPES] = {
[MIGRATE_UNMOVABLE] = 'U',
[MIGRATE_RECLAIMABLE] = 'E',
[MIGRATE_MOVABLE] = 'M',
[MIGRATE_RESERVE] = 'R',
#ifdef CONFIG_CMA
[MIGRATE_CMA] = 'C',
#endif
#ifdef CONFIG_MEMORY_ISOLATION
[MIGRATE_ISOLATE] = 'I',
#endif
};
char tmp[MIGRATE_TYPES + 1];
char *p = tmp;
int i;
for (i = 0; i < MIGRATE_TYPES; i++) {
if (type & (1 << i))
*p++ = types[i];
}
*p = '\0';
printk("(%s) ", tmp);
}