Я читал об архитектуре памяти, и я немного смутился с пейджингом и сегментацией. Я читал, что современные системы ОС используют только пейджинг для управления доступом к памяти, но, глядя на разобранные коды, я вижу такие сегменты, как "ds" и "fs". Означает ли это, что ОС (видел, что на окнах и linux) использует как сегментацию, так и pagging, или просто сопоставляет все сегменты на одни и те же страницы (делая нерелеванты сегментов)?
Используют ли современные ОС пейджинг и сегментацию?
Ответ 1
Хорошо, основываясь на книге "Современные операционные системы" 3-го издания от Andrew S. Tanenbaum и материалах Open Training Training (opensecuritytraining.info), мне удается понять сегментацию и пейджинг, и ответ на мой вопрос:
-
Основные понятия:
1.1 Сегментация:.
Сегментация - это разделение памяти на куски (разделы), называемые сегментами. Эти сегменты независимы друг от друга, имеют переменные размеры и могут расти по мере необходимости.
1,2. Виртуальная память:
Виртуальная память - это абстракция реальной памяти. Это означает, что он отображает виртуальный адрес (используемый программами) в физический адрес (используемый аппаратным обеспечением). Если программа хочет получить доступ к памяти 2000 (mov eax, 2000), виртуальный адрес (2000) будет преобразован в реальный физический адрес (например, 1422), а затем программа получит доступ к памяти 1422, думая, что ГЭС обращаются к памяти 2000. Итак, если виртуальная память используется системой, программы больше не обращаются к реальной памяти напрямую, вместо этого они используют соответствующую виртуальную память.
1,3. Пейджинг:
Пейджинг - это схема управления виртуальной памятью. Как объяснялось ранее, он отображает виртуальный адрес в физический адрес. Пейджинг делит виртуальную память на части, называемые "страницами", а также делит физическую память на части, называемые "рамными страницами". Страница может быть привязана к одной или нескольким страницам фрейма (имейте в виду, что страница может отображать разные страницы фрейма, но только одну в то время)
-
Преимущества и недостатки
2,1. Сегментация:
Основным преимуществом использования сегментации является разделение памяти на разные линейные адресные пространства. С помощью этих программ может быть адресное пространство для его кода, другое для стека, другое для динамических переменных (куча) и т.д. Недостатком сегментации является фрагментация памяти. Рассмотрим этот пример. Одна часть памяти разделена на 4 сегмента, выделенных последовательно →
seg1(in use) --- seg2(in use)--- seg3(in use)---seg4(in use)
. Теперь, если мы освободим память из seg2, у нас будет →seg1(in use) --- seg2(FREE)--- seg3(in use)---seg4(in use)
. Если мы хотим выделить некоторые данные, мы можем сделать это с помощью seg2, но если размер данных больше размера seg2, мы не сможем это сделать, и пространство будет потрачено впустую, а фрагментация памяти. Другая проблема заключается в том, что некоторые сегменты могут иметь больший размер, и поскольку этот сегмент не может быть "разбит" на более мелкие части, он должен быть полностью выделен в памяти.2,1. Пейджинг:
Основные преимущества использования пейджинга - абстрагирование физической памяти, поэтому программам (и программистам) не нужно беспокоиться о адресах памяти. Вы можете иметь две программы, которые обращаются к (виртуальной) памяти 2000, потому что она будет отображаться в две разные физические памяти. Кроме того, можно использовать жесткий диск для обеспечения того, чтобы в память были выделены только нужные страницы. Основным недостатком является то, что пейджинг использует только одно линейное адресное пространство. Подкачка отображает виртуальные воспоминания от 0 до максимального адресуемого значения для всех программ. Теперь рассмотрим этот пример - две части памяти, "chk1" и "chk2" находятся рядом друг с другом в виртуальной памяти (chk1 выделяется с адреса от 1000 до 2000, а chk2 - с 2001 по 3000), если chk1 должен расти, ОС необходимо освободить место в памяти для нового размера chk1. Если это произойдет снова, ОС придется делать то же самое или, если не будет найдено места, появится исключение. Подпрограммы для управления такими видами операций очень плохи для производительности, потому что этот рост и сжатие памяти происходит очень много времени.
-
Сегментация и подкачка
3,1. Зачем сочетать оба?
Операционные системы могут сочетать как сегментацию, так и подкачку. Зачем? Потому что объединение тогда его возможно, чтобы иметь лучшее от обоих без их недостатков. Таким образом, память разделена на многие сегменты, и каждая из них имеет одну или несколько страниц. Когда программа пытается получить доступ к адресу памяти, сначала ОС переходит в соответствующий сегмент, там найдется соответствующая страница, поэтому он переходит на страницу и там найдет страницу фрейма, к которой программа хотела получить доступ. Используя этот подход, ОС делит память на различные сегменты, включая сегменты для ядра и пользовательских программ. Эти сегменты имеют переменные размеры и функции защиты доступа. Чтобы решить проблемы фрагментации и "большого сегмента", используется пейджинг. При пейджинге большой сегмент разбивается на несколько страниц, и в памяти остаются только необходимые страницы (и при необходимости в памяти может быть выделено больше страниц). Итак, в основном, современные ОС имеют две абстракции памяти, где сегментация больше используется для "обработки программ" и "Пейджинг" для "управления физической памятью".
3,2. Как это работает?
Операционная сегментация ОС и Пейджинг будут иметь следующие структуры:
3.2.1. Сегмент селектора:
Это представляет собой индекс в таблице глобальных/локальных дескрипторов. Он содержит 3 поля, которые представляют индекс в таблице дескриптора, бит, чтобы определить, присутствует ли этот сегмент в таблице глобальных или локальных дескрипторов и уровне привилегий.
3.2.2. Регистр сегментов:
Регистр CPU, используемый для хранения селектора сегментов. Обычно (на машине x86) есть как минимум регистр CS (сегмент кода) и DS (сегмент данных).
3.2.3. Дескрипторы сегмента:
Эта структура содержит данные относительно сегмента, такие как его базовый адрес, размер (на страницах или в байтах), привилегия доступа, информация о том, присутствует ли этот сегмент в памяти или нет и т.д. (для всех поля, поиск дескрипторов сегментов в google)
3.2.4. Таблица глобальных/локальных дескрипторов:
Таблица, содержащая несколько дескрипторов сегментов. Таким образом, эта структура содержит все дескрипторы сегмента для системы. Если таблица глобальна, она может содержать другие элементы, такие как дескрипторы таблиц дескрипторов дескрипторов дескрипторов дескрипторов дескрипторов дескрипторов состояний и дескрипторы дескрипторов дескрипторов задач (я не объясню их здесь, пожалуйста, google). Если таблица является локальной, она будет (только, насколько мне известно) содержать дескрипторы сегментов, связанных с пользователем.
3.3. Как это работает?
Итак, чтобы получить доступ к памяти, сначала программа должна получить доступ к сегменту. Для этого селектор сегментов загружается в регистр сегментов, а затем таблицу глобального или локального дескриптора (в зависимости от поля на селекторе сегмента). В этом причина полного адреса памяти
SEGMENT REGISTER: ADDRESS , like CS:ADDRESS -> 001B:0044BF7A
. Теперь ОС переходит к G/LDT и (используя поле индекса селектора сегментов) находит дескриптор сегмента адреса, пытающегося получить доступ. Затем он проверяет, есть ли сегмент, если он есть, защита, и если все в порядке, оно переходит к адресу, указанному в "базовом поле" (дескриптора) + смещение адреса. Если пейджинг не включен, система переходит непосредственно в реальную память, но с пейджингом по адресу рассматривается как виртуальный адрес, и он переходит в каталог страницы. Базовый адрес + смещение называется Linear Address и будет интерпретироваться как 3 поля: Directory + Page + offset. Таким образом, на странице "Каталог" он будет искать запись каталога, указанную в поле "каталог" линейного адреса, эта запись указывает на таблицу страниц, а поле "страница" линейного адреса используется для поиска страницы, это точки входа на страницу кадра, а смещение используется для поиска адреса, к которому программа хочет получить доступ.3.4. Современные операционные системы
Современные ОС не используют сегментацию. Его в кавычках, поскольку они используют 4 сегмента: Сегмент кода ядра, Сегмент данных ядра, Сегмент кода пользователя и сегмент пользовательских данных. Это означает, что все пользовательские процессы имеют одинаковые сегменты кода и данных (таким образом, один и тот же сегментный селектор). Сегменты изменяются только при переходе от пользователя к ядру. Итак, весь путь объяснен в разделе 3.3. но они используют одни и те же сегменты, и, поскольку таблицы страниц являются индивидуальными для каждого процесса, ошибка страницы затруднительна.
Надеюсь, что это поможет, и если есть какие-либо ошибки или некоторые подробности (я был разбит на некоторые части), пожалуйста, не стесняйтесь комментировать и отвечать. Спасибо, ребята,
Danilo PC
Ответ 2
Они используют только пейджинг для защиты памяти, в то время как они используют сегментацию для других целей (например, сохранение локальных данных потока).