Обоснование сегмента кода и сегмента данных - PullRequest
0 голосов
/ 23 сентября 2018

Каково обоснование разделения памяти на сегмент кода и сегмент данных?В одном источнике я прочитал, что, поскольку инструкции и данные архитектуры фон-Неймана хранятся в одном месте, благодаря чему выполняется это разделение.

Но я хочу знать, какие возможные проблемы могут возникнуть из-за того, что инструкции и данные хранятся в одном месте, из-за чего возникает необходимость разделения на сегмент кода и сегмент данных?

А зачем дальше в сегмент bss, сегмент кучи и сегмент стека?

1 Ответ

0 голосов
/ 23 сентября 2018

Одним из самых больших преимуществ разделения программ на секции кода и данных является то, что он позволяет секции кода быть доступной только для чтения, в то время как секции данных могут быть доступны для записи.Это защищает раздел кода от случайного изменения программой, а также позволяет разделять его между процессами, выполняющими одну и ту же программу.

В последнее время появилась возможность разрешать только выполнение кода в разделе кодаважный.Это связано с тем, что количество эксплойтов зависит от возможности выполнения кода вне раздела кода.Еще одно недавнее преимущество разделения кода и данных заключается в том, что неупорядоченные ЦП могут в конечном итоге спекулятивно выполнять данные, что приведет к снижению производительности, если код и данные будут смешаны.

Раздел bss существует как расширение данных.раздел.Он содержит все данные программы, которые инициализируются до нуля.Разделив инициализированные нулями данные таким образом, это позволяет разделу bss фактически не сохраняться в исполняемом файле программы.Оба экономят дисковое пространство и ускоряют загрузку.Раздел bss в памяти просто заполняется нулями, а не считывается в память.

Куча и стек похожи в том, что они оба используются для динамического выделения объектов во время выполнения программы.Разница между ними заключается в том, что объекты, размещенные в куче, могут быть освобождены в любое время, тогда как все, что помещено в стек, может быть удалено только после того, как все помещено в стек после того, как оно удалено.Каждый раз, когда функция вызывается, пространство выделяется в стеке для таких вещей, как аргументы функции, адрес возврата и локальные переменные.Когда функция возвращает эти вещи удаляются из стека.Почти все, что динамически выделяется, выделяется в куче.

Традиционно в системах Unix куча располагалась в памяти после секции bss, которая появляется после секций кода и данных.По мере того как вещи распределялись в куче, они росли вверх, чтобы освободить место для них по мере необходимости.Стек помещался в конец памяти и рос вниз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...