Dec 24, 2012 18:18
Очередная попытка подружить mem_kb и MemTotal pv_ops ядра.
Текущие наблюдения: различия гуляют от сборки ядра и всякой ерунды, вроде опций, частично зависят от static-max, но не точно.
Внутри ядра: totalram_pages = free_all_bootmem()=55801, то есть значение уже меньше, чем передано из xen'а (для VM выставлено 256Мб).
При этом:
[ 0.000000] Xen: [mem 0x0000000000000000-0x000000000009ffff] usable
[ 0.000000] Xen: [mem 0x00000000000a0000-0x00000000000fffff] reserved
[ 0.000000] Xen: [mem 0x0000000000100000-0x000000000fffffff] usable
Даже если мы положим, что reserved не используется, оставшееся будет 261759кб, то есть на 385кб меньше выделенного.
В нашем же случае мы имеем 223204кб (55801 страниц), что на 38940кб меньше ожидаемого. Куда оно теряется?
Сейчас дошёл до free_all_bootmem
unsigned long __init free_all_bootmem(void)
{
unsigned long total_pages = 0;
bootmem_data_t *bdata;
struct pglist_data *pgdat;
printk (KERN_ERR, "in free_all_bootmem\n");
for_each_online_pgdat(pgdat)
reset_node_lowmem_managed_pages(pgdat);
list_for_each_entry(bdata, &bdata_list, list)
total_pages += free_all_bootmem_core(bdata);
}
Поставил вывод каждого результата free_all_bootmem_core, ща посмотрим на вывод...
Ага, я ошибся файлом. Функция на самом деле в nobootmem.c
linux kernel,
xen,
memory on demand,
linux