Сегментация памяти в современных операционных системах

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

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

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

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

Помимо ответов «да» / «нет» на вышеперечисленные вопросы, меня интересуют любые подробные разъяснения по этому вопросу.

8
задан Dharman 17 August 2019 в 10:35
поделиться