2015-04-20 6 views
1

Я пытаюсь понять реализацию сегментов процесса в 64-разрядных архитектурах. Я наткнулся на эти 2 обсуждения:Сегментация в 64-разрядных процессорах Intel (и не Intel)

64 bit application: layout in memory

Process segments(stack,heap,data and code) are contiguous in memory?

Однако я до сих пор неясно. Сегментация была введена для преодоления ограничений использования 64-Кбайтной памяти с 16-разрядными адресами в Intel 80286/80386. После этого 32-разрядные компьютеры Intel по-прежнему продолжали его по соображениям совместимости.

Теперь перейдем на 64-разрядный: в руководствах говорится, что сегментация редко реализуется здесь (ref: http://en.wikipedia.org/wiki/X86_memory_segmentation). Виртуальная память и пейджинг могут обеспечить доступ ко всему адресному пространству вместе с защитой.

Так что мой вопрос: как 64-разрядная программа скомпилирована 64-битными компиляторами? По-прежнему ли они используют концепцию «сегментов» (потому что я все еще вижу упоминания сегмента данных, сегмента стека и т. Д.), Как и раньше, но с более высокими указателями сегмента бит # бит? Или слово «сегмент» относится к чему-то совершенно другому для 64-битных архитектур?

Любая помощь приветствуется.

+0

Я не перечитывал ссылки, которые вы предоставили, но если я правильно помню, это основное различие между компиляцией/запуском вашего кода в режиме реального режима или режиме защиты. Если вы специально не настроитесь на использование режима защиты, вы по умолчанию используете «реальный режим» со всеми традиционными ограничениями. –

+0

Уверен, но сегментация ортогональна реальному и защищенному режиму правильно? –

ответ

0

В 64-битном режиме нет сегментов (СПАСИБО БОГ!).

Сегментация на землях Intel всегда была kludge.

+0

хорошо, тогда вы могли бы объяснить, где хранятся разные части 64-разрядного скомпилированного кода? Куда идет код? как насчет переменных стека? и куча? Я тоже наткнулся на эту тему: http://reverseengineering.stackexchange.com/questions/2006/how-are-the-segment-registers-fs-gs-cs-ss-ds-es-used-in-linux В нем говорится, что окна x64 по-прежнему используют регистр GS для конкретных задач потока. Если вся память рассматривается как «плоская», может ли код чередоваться с данными и стековыми переменными в теории? –

+0

Операционная система устанавливает границы. Окончательное решение принимает линкер. Помните, что практически каждая система, кроме Intel с 1970-х годов, имела модель с плоской памятью. – user3344003

+0

Хорошо. Итак, если я правильно понимаю, эти границы определяют различные сегменты для различных частей голосования? Таким образом, по сути, не все еще используется сегментирование, даже если они не могут это назвать? Если это абсолютно плоская модель, не следует ли мне смешивать код, данные стека и данные кучи, если я захочу? –