Сегментация памяти в современных операционных системах - PullRequest
8 голосов
/ 27 февраля 2012

При изучении операционных систем (главным образом с Linux в качестве эталона) есть несколько моментов, которые я не нахожу хорошо объясненными в материале, который я изучал.

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

Я видел, что malloc можно реализовать в Linux с помощью вызова sbrk, который увеличивает размер сегмента данных. Опять же, является ли этот «сегмент данных» просто областью памяти, которая по соглашению используется для данных, а не «реальным» сегментом? (Дополнительный вопрос: «sbrk», похоже, не способен уменьшить размер «сегмента». Означает ли это, что процесс не может освободить память для ОС, кроме выхода?)

Также мне интересно знать, почему современные операционные системы, похоже, не используют (постраничную) сегментацию. Разве это не помешает определенным видам атак размещать код в своем защищенном сегменте, тем самым повышая безопасность? С другой стороны, сделало бы это, например, Компиляция JIT невозможна / трудна?

Помимо ответов "да" / "нет" на поставленные выше вопросы, меня интересует любая глубокая проработка по этому вопросу.

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

Сегмент в «сегменте данных» не имеет ничего общего с аппаратной сегментацией, которая мало применима к современным операционным системам (т. Е. Избыточна по отношению к подкачке), которые используют пейджинг для реализации виртуальной памяти.Сегменты также имеют серьезные недостатки по сравнению с подкачкой (например, память, смежная в сегменте должна быть физически смежной) без какой-либо выгоды.«Сегмент» для программ пользовательского пространства буквально означает непрерывный раздел виртуального пространства процесса.

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

На ваш вопрос об освобождении памяти, полученной через sbrk, дан ответ здесь: Как освободить память, полученную с помощью sbrk ()?

0 голосов
/ 29 апреля 2018

Сегментация на самом деле является проблемой дизайна операционной системы, а не архитектура. В плоской модели есть только один сегментный адрес, то есть значения CS, DS, ... фиксируются операционной системой, а адреса программ имеют максимальные смещения 4 ГБ (для 32-битного ЦП). Я не знаю, существуют ли такие современные операционные системы, но возможно иметь не только адресное пространство 4 ГБ, но и адресное пространство 64 ТБ (2 ^ 46) 16 бит для сегментных регистров + смещение 32 бита.

...