Размер стека в защищенном режиме
Каков максимальный размер сегмента стека в защищенном режиме? И почему именно такой (если вам известно)? Заранее предупреждаю, ответы типа "4 Гига" и "64 Кб" неверны.
Цитата: iXCept
Заранее предупреждаю, ответы типа "4 Гига" и "64 Кб" неверны.
почему неверны? Всё зависит от того чтобы поставишь в GDT и какой селектор загрузишь в регистр SS. максимальный размер сегмента стека 4 ГБ. НО ещё нельзя забывать об уровне страниц.
Кто задал вопрос и кто сказал что эти ответы не верны?
Правильный ответ: 4Gb - 4Kb!
блин, какой ты умный. А если я в регистр SS загружу обычный селектор сегмента данных, такой же какой в регистре DS? Что тогда будет?
Цитата: iXCept
Так как стек движется в обратном порядке то размер: 0fffffh - (limit + 1). Если хотим максимальный, то в limit = 0. Получаем 0fffffh - 1. При установленных битах атрибутов G и B умножаем выражение на 4 Кб. Получаем 0ffffffffh - 1000h, что есть:
Правильный ответ: 4Gb - 4Kb!
Правильный ответ: 4Gb - 4Kb!
А вот и не верно.
Note that when scaling
is used (G flag is set), the lower 12 bits of a segment offset (address) are not checked
against the limit; for example, note that if the segment limit is 0, offsets 0 through
FFFH are still valid. из манов интел.
Так что 4ГБ.
То что сегменты с установленным флагом "РАСТУЩИЙ ВНИЗ" могут иметь размер от 0 до 0xFFFFF единиц в отличии от сегментов с размером от 1 до 0x100000 единиц, для которых этот флаг не установлен, написано в любом подробном описании по IA32. А происходит это из-за того, что в подобных сегментах лимит ограничивает сегмент снизу, а не сверху, и все корректные внутрисегментные смещения должны быть строго больше значения лимита.
Ну и еще не стоит забывать о 64-битных процессорах которые сам автор никак не отмел.