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