Как стать автором
Обновить

Комментарии 7

Раз статья 0, позволю себе немного оффтопный вопрос.

Что будет, если при переходе в защищенный режим загрузить в SS селектор сегмента, который описан как сегмент данных (Бит ED = 0 в байте AR дескриптора, т.е. признак «рост вниз» отключен)? Точнее — я знаю, что ничего не случится, стек будет работать как обычно, но зачем тогда этот бит?
В документации говорится, что для стека можно использовать сегменты, растущие как вверх, так и вниз. Разница только в том, что expand-down удобнее для стеков, ёмкость которых планируется динамически изменять. Для статически выделенных оба значения бита E хороши.

Вот выдержка из Intel SDM, том 3A, глава 3, секция 3.4.5.1 «Code- and Data-Segment Descriptor Types», страницы 1997 и 1998:
If the size of a stack segment needs to be changed dynamically, the stack segment can be an expand-down data segment (expansion direction flag set). Here, dynamically changing the segment limit causes stack space to be added to the bottom of the stack. If the size of a stack segment is intended to remain static, the stack segment may be either an expand-up or expand-down type.
То-есть, сегмент, который «растет вниз» действительно растет вниз, от базового адреса в сторону младших, т.е. не last address=base + size, а last address = base-size, так что ли?
Ниже тов. CleverMouse совершенно правильно всё описал. Вообще в документации Intel вполне ясно это всё описывается, однако не объясняется, почему всё так, а не иначе.

Я планирую написать отдельную заметку про преобразования адресов IA-32 и в ней краешком упомянуть сегментацию. Но если этот вопрос интересен, то можно сделать и отдельный (и наверное довольно длинный) пост про сегментацию.
Ага, спасибо. Я изучал PM по русскоязычным учебникам ассемблера, там очень плохо было это описано. Потом уже добрался до англоязычного руководства по 386, но именно этот вопрос тогда уже не интересовал. А сейчас внезапно вспомнил. Писал тогда свою ОС, вспоминаю проект с теплотой.
Бит ED не имеет отношения к тому, как будет использоваться селектор — хоть для стека, хоть для данных. Он влияет на проверки сегментной защиты — если ED=0, то сегментная защита разрешает адреса от 0 до лимита, если ED=1, то сегментная защита разрешает адреса от лимита+1 до максимального. Во время проектирования — в 286-х — сегментная защита была единственным средством защиты, и expand-down сегменты предполагалось использовать для растущих стеков — условно, когда в начале работы программы ей выделяется N байт «вверху» сегмента с SS с выбросом исключения, когда SP опускается ниже выделенного размера, и при необходимости программа запрашивает у системы больше стекового пространства, уменьшая лимит. Отсюда и фразы в документации про «dynamic stack segments», хотя, я повторюсь, ED не имеет отношения к собственно стеку. Потом появилась страничная защита, которая, хоть и с двумя уровнями привилегий против 4-х сегментных, оказалась намного удобней, и flat-модель памяти, в которой сегментные проверки фактически отключены, но выкидывать разные странные биты было уже поздно в интересах совместимости.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий