2016-05-28 14 views
0

Как я знаю, все регистры сегментов или селектора настроены на точный начальный адрес сегмента 4gb в плоской модели с защитой от 32 бит. Итак, как реализована функциональность сегмента стека, которая начинается с одного из верхних адресов и растет вниз, или функция сегмента кучи, которая растет вверх.Как различные сегменты установлены в 32-битном защищенном режиме?

Также как реализована часть памяти, принадлежащая ОС в адресном пространстве 4gb?

ответ

1

Сегмент стека (SS) ничем не отличается от других: он начинается с 0 и длиной 4 ГБ.

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

Таким образом, когда ОС запускает поток, он выделяет несколько страниц памяти для стека в плоском сегменте и делает регистр ESP/'RSP' для указания на него. Важной деталью является резервирование первой страницы чуть ниже стека и не, чтобы выделить ее. Таким образом, переполнение стека может быть легко обнаружено как ошибки страницы.

Память ядра обычно отображается на верхнюю часть карты памяти 4 ГБ, но она не поддается нормальному пользовательскому коду из-за битов защиты страницы.

+0

Я могу понять из вашего ответа. Итак, как OS устанавливает, что стек будет расти с более высокого адреса на более низкий адрес? А также как определяется начальный адрес стека для потока? – Kaustav

+0

В X86 стек всегда растет. Это потому, что 'push' уменьшает' ESP' и 'pop' iincreases. Это по дизайну. О том, где находится стек, это зависит от ОС. Помните, что 32-битный процесс имеет 4 ГБ адресного пространства и каждый стек потока обычно составляет 1 МБ, поэтому есть много свободного места. – rodrigo

+0

Что вы подразумеваете под каждым потоком стека? – Kaustav