Изначально большинство исполняемых файлов компоновались статически. В статически скомпонованном двоичном файле все библиотечные процедуры и заглушки для системных вызовов загружались в двоичный файл во время компиляции. В настоящее время большинство двоичных файлов используют динамическое связывание. Двоичный файл с динамическим связыванием содержит лишь код откомпилированного приложения и список нужных процедур (библиотечных и заглушек системных вызовов).
Чтобы начать выполнение, ядро отображает кодовую часть файла в нижнюю часть адресного пространства, начиная со второй страницы виртуального адресного пространства. Первая страница виртуального адресного пространства помечается как недействительная, чтобы попытки читать или записывать с использованием пустого указателя вызывали ошибку. Часть файла с инициализированными данными отображается в адресное пространство сразу за кодом. После области инициализированных данных создается область с размером неинициализированных данных из заполненной нулями памяти.
Каждый процесс начинает выполнение с тремя сегментами памяти: кода (text), данных и стека. Сегмент данных делится на инициализированные данные и неинициализированные данные (известные также как BSS). Сегмент text является сегментом только для чтения и обычно разделяется между всеми процессами, выполняющими файл, тогда как в области данных и стека может быть осуществлена запись и они индивидуальны для каждого процесса. Сегмент text и инициализированные данные для процесса считываются из исполняемого файла.
Ядро часто выделяет память, которая нужна лишь на протяжении одного системного вызова. В процессе пользователя такая кратковременная память была бы выделена в стеке времени выполнения. Поскольку у ядра ограниченный стек времени выполнения, нереально выделять в нем блоки памяти даже умеренного размера. Соответственно такая память должна выделяться посредством более динамического механизма. Например, когда система должна преобразовать имя пути, она должна выделить для хранения имени буфер в 1 Кб.