Причина была банальной — загрузчик не активировал A20 gate. Нашёл причину случайно, заметив, что второй мегабайт физической памяти фактически совпадает с первым.
Теперь не знаю, что делать с qemu/kvm, ведь они действительно не поддерживают релокацию локального APIC.