Я пишу ядро и мне нужно (и хочу) поместить несколько стеков и куч в виртуальную память, но я не могу понять, как разместить их эффективно. Как нормальные программы это делают?
Как (или где) стеки и кучи помещаются в ограниченную виртуальную память, предоставляемую 32-разрядной системой, чтобы у них было как можно больше места для роста?
Например, когда в память загружается простая программа, структура ее адресного пространства может выглядеть следующим образом:
[ Code Data BSS Heap-> ... <-Stack ]
В этом случае куча может увеличиваться настолько, насколько позволяет виртуальная память (например, до стека), и я считаю, что именно так куча работает для большинства программ. Предопределенной верхней границы нет.
Многие программы имеют разделяемые библиотеки, которые размещаются где-то в виртуальном адресном пространстве. Затем есть многопоточные программы, у которых есть несколько стеков, по одному для каждого потока. А в программах .NET есть несколько куч, каждая из которых должна иметь возможность увеличивать одну так или иначе.
Я просто не понимаю, как это сделать достаточно эффективно без предопределенного ограничения на размер всех куч и стеков.