Вопрос к гуру: эти системы когданибудь использовали сегментацию или нет? В 64 битных системах сегментация не используется (она типа в процах не поддерживается?)?
Я под сегментацией понимаю ровно но что пинимает под ней Интел. Отдельные сегменты Данныхб Кодаб Стека каждый со своей базой и размером... Там на сколько я понимаю еще и некие механизмы защиты есть от записи в другой сегмент (хотя в этом я не очень уверен)
> Ну тогда flat mode уже не имеет отдельных сегментов.
сегментация в чистом виде (изменение дескрипторов в GDT и их кэширование в GS) используется для реализации TLS на x86 (sys_set_thread_area())
для x86_64 используется интерфейс sys_arch_prctl()
Сегментные регистры никуда ж не делись. Просто во флате сегменты кода, данных, и стека имеют одинаковую базу (0) и максимальный размер. А тот же GS - уже нет, как говорилось выше.
Тем не менее, смысл (основных) сегментных регистров поменялся, и говорить, что они никуда не делись и никак не поменялись со времён real mode - неверно.
А притом! Сегменты - это твой самый страшный кошмар. Это следствие ограниченности 16-разрядных систем, поганые дальние/короткие переходы и вызовы ф-ий, адресация не по указателю, а по сегмент:смещение, и куча, куча костылей для DOS.
Лечись электричеством, уважаемый. Может тогда ты вдуплишь отличия сегментов реального режима от дескрипторов защищенного. И поймешь, почему на x86 иногда не хватает защиты на уровне страниц и приходится возиться с сегментами (хинт: попробуй чисто на пейджинге сделать неисполняемый стек).
Во а че бы его по умолчанию не сделать неисполняемым разнеся сегменты кода/данных/стека... тогда фраза "при переполнении буфера злоумышленник может выполнить свой код" потеряла бы смысл накорню. Так нет в 64 битке сегментацию кастрировали - нельзя разнести сегменты кода и стека например для них база всегда 0! Я хочу понять почему так сделали?