Вы должны понимать, как работает виртуальная память, и как отображение MMU связано с реальной ОЗУ.
реальная оперативная память разделена на страницы, традиционно по 4 КБ каждая. каждый процесс имеет свое собственное отображение MMU, которое представляет этому процессу линейное пространство памяти (4 ГБ в 32-разрядной версии Linux). конечно, не все они на самом деле выделены. сначала он почти пустой, то есть ни одна реальная страница не связана с большинством адресов.
когда процесс сталкивается с нераспределенным адресом (либо пытается прочитать, записать или выполнить его), MMU генерирует ошибку (аналогично прерыванию), и вызывается система VM. Если он решает, что какая-то ОЗУ должна быть там, он выбирает неиспользуемую страницу ОЗУ и связывается с этим диапазоном адресов.
Таким образом, ядру все равно, как процесс использует память, а процессу на самом деле все равно, сколько у него ОЗУ, оно всегда будет иметь одинаковые линейные 4 ГБ адресного пространства.
теперь brk/sbrk
работает на несколько более высоком уровне: в принципе любой адрес памяти «за пределами» этой метки недопустим и не получит страницу ОЗУ, если к ней обращаются, вместо этого процесс будет уничтожен. библиотека userspace управляет выделением памяти в пределах этого предела и только при необходимости просит ядро увеличить его.
Но даже если процесс запустится, установив для brk
максимально допустимое значение, он не получит реальные страницы ОЗУ, пока не начнет получать доступ ко всем этим адресам памяти.