Существует несколько причин разделения программ на части в памяти.
Одним из них является то, что память команд и данных может быть архитектурно отличной и разнородной, то есть считывать и записывать из / в различные инструкции и схемы внутри и снаружи ЦП, образуя два разных адресных пространства (т. Е. Считывание кода из адрес 0 и чтение данных с адреса 0 обычно возвращает два разных значения из разных запоминающих устройств).
Другое - это надежность / безопасность. Вы редко хотите, чтобы код программы и постоянные данные изменились. В большинстве случаев это происходит потому, что что-то не так (либо в самой программе, либо во входных данных, которые могут быть созданы злонамеренно). Вы хотите предотвратить это и знать, есть ли какие-либо попытки. Точно так же вы не хотите, чтобы области данных, которые могут изменяться, были исполняемыми. Если они есть и в программе есть ошибки безопасности, программа может быть легко вынуждена сделать что-то вредное, когда вредоносный код попадает в области данных программы в виде данных и вызывает эти ошибки безопасности (например, переполнение буфера).
Еще одним является хранилище ... Во многих программах ряд областей данных вообще не инициализируется или инициализируется одним общим предопределенным значением (часто 0). Память должна быть зарезервирована для этих областей данных, когда программа загружается и собирается запускаться, но эти области не нужно хранить на диске, потому что там нет значимых данных.
В некоторых системах у вас может быть все в одном месте (раздел / сегмент / и т. Д.). Одним из примечательных примеров здесь является MSDOS, где программы в стиле .COM не имеют никакой структуры, за исключением того, что они должны иметь размер менее около 64 КБ, а первая исполняемая инструкция должна появиться в самом начале файла и предполагать, что ее местоположение соответствует IP = 0x100 (где IP - регистр указателя инструкций). То, как код и данные размещаются и чередуются в программе .COM, неважно и зависит от программиста.
Существуют и другие архитектурные артефакты, такие как сегменты x86. Опять же, MSDOS является хорошим примером ОС, которая имеет с ними дело. Программы в .EXE-стиле могут содержать несколько сегментов, которые напрямую соответствуют сегментам процессора x86, схеме адресации реального режима, в которой память просматривается через «окна» длиной 64 КБ, известные как сегменты. Положение этих окон / сегментов относительно значения регистров сегмента ЦП. Изменяя значения регистров сегмента, вы можете перемещать «окна». Чтобы получить доступ к более чем 64 КБ, необходимо использовать разные значения регистров сегментов, и это часто подразумевает наличие нескольких сегментов в .EXE (может быть не только один сегмент для кода и один для данных, но также несколько сегментов для любого из них).