Samuel,
On 07/11/2026 14:25, Samuel Thibault wrote:
1) There is a problem with my desktop machine with allocating memory for the
(large) vm_page array for the HIGHMEM memory. I've worked around it by
reducing he machine memory from 16G to 8G. The problem is that the vm_page
array is too large to fit into a contiguous space within the DIRECTMAP
memory available.
Is it physical room that is missing, or virtual room?
(I'm surprised that 8G memory would pose that much physical room issue,
struct vm_page is "just" a hundred bytes, so for 8G it's just 200MB (
With 16G in the machine, the allocation of vm_page[] is 378624k. This
doesn't fit in the heap available as determined by biosmem.c.
I did some deeper debugging and the reason that the heap is too small is
down to:
1) There is a 'reserved' region in the memory map from
0x20000000-0x20200000 which breaks the directmap segment approximately
in half:
0x100000-0x20000000 available (size 0x1ff00000)
0x20000000-0x20200000 reserved
0x20200000-0x40000000 available (size 0x1fe00000)
The first map entry starting at 0x100000 is reduced in size due to the
reserved parts (kernel and so on). That section is nevertheless chosen
as the available heap which initially shows as 0xd15b000-0x20000000.
This isn't large enough for the ~380M.
0x20200000-0x40000000 isn't chosen for the heap because the memory hole
at 0x20000000 causes multiboot's 'mem_upper' to report the limit as
0x20000000. From what I've read, 'mem_upper' hasn't really got any value
when there is a valid memory map available. Altering
biosmem_setup_allocator() to search the range BIOSMEM_END to
VM_PAGE_DIRECTMAP_LIMIT (regardless of mem_upper) succeeds on my machine.
I can supply a very simple patch for this if you agree.
Could that vm_page array be allocated from HIGHMEM and
mapped into the kernel outside of the normal kernel VM space?
If the missing room is virtual, the physical allocation change won't
matter.
If the missing room is physical, we could probably make
vm_page_bootalloc take highmem pages, since pmap_steal_memory maps the
pages anyway...
The missing room is physical as per above. The above proposal is
sufficient for my machine but given the fragmentation of the directmap
by the memory hole, it wouldn't boot with 32G, which isn't an
extraordinary memory total these days. Also on other machines, there
might be more memory holes preventing large contiguous allocations.
Mike.