December 24th, 2012

404

The Kernel

Очередная попытка подружить 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
</pre>
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);
}
</pre>
Поставил вывод каждого результата free_all_bootmem_core, ща посмотрим на вывод...

Ага, я ошибся файлом. Функция на самом деле в nobootmem.c