2016-01-15 2 views
1

Я не знаю, как 32-битное приложение может работать на 64-битной ОС.x86 и x64 общий набор команд?

Мое понимание 32bit/64bit относится к размеру регистра. Набор инструкций должен отличаться, поскольку они имеют разные размеры регистра.

Но я знаю, что набор инструкций x86-64 является 64-разрядной версией набора инструкций x86.

  1. Является ли причина того, что мы можем запускать 32-битное приложение на 64-битной ОС из-за x86-64?

  2. Если да, то почему 32-разрядные приложения иногда несовместимы в 64-битных окнах? Зачем нам WOW64? (Иногда нам предлагается выбрать, какую версию установить.)

  3. Есть ли набор инструкций x64 для любого другого набора команд, кроме x86-64? Некоторые люди сказали мне, что x64 просто расширяет диапазон памяти, а набор команд у них идентичен. Это верно?

ответ

2

Есть причина, мы можем запустить приложение 32bit на 64-битной ОС из-за x86-64?

Да по большей части. Но позвольте мне вкратце объяснить, что 32bit/64bit не обязательно ссылается на размер регистра, потому что вопрос будет о том, какой регистр (тип) вы говорите? Точнее, 32bit/64bit относятся к ширине адресной шины (то есть, сколько памяти может быть адресовано) или, другими словами, размер указателя в C. Затем, в свою очередь, 32/64bit будет (косвенно) ссылаться на размер слова, а также размер основного «целочисленного» типа машины. В любом случае, 32-битный/64-битный должен делать больше с адресной памятью, но также связан с размером слова (sizeof (int)) и, в свою очередь, размером регистра. Итак, вернемся к вопросу. В 32 битных двоичных файлах все еще могут работать 64-битные системы. Да, потому что «новый» x86-64 только расширяет исходный x86 ISA (с большим количеством инструкций, конечно). Таким образом, ваш старый 32-битный двоичный файл (который состоит из инструкций x86) все еще может быть запущен в новой системе.

Если да, то почему 32-битные приложения иногда несовместимы в 64-битных окнах ? Зачем нам WOW64? (Иногда нас просят выбрать версия для установки.)

Да, существует целый ряд случаев, когда старый x86 32bit двоичный/приложение не будет работоспособной в новой 64-битной системе. Например, ваш двоичный файл может содержать одну или несколько инструкций, которые (по какой-либо причине) больше не поддерживаются (см. Примеры this). Или, если вашему двоичному файлу/приложению требуется использование 32-битной библиотеки, которая не существует в вашей новой системе. В этом случае ваша система будет жаловаться на то, что вы не сможете запустить это 32-битное приложение.

Имеет ли набор инструкций x64 любой другой набор команд, кроме x86-64? Некоторые люди сказали мне, что x64 просто расширяет диапазон памяти, а набор команд у них одинаковый. Это верно?

Во-первых, Intel64, AMD64, x86-64, x64 все в значительной степени (более или менее) относятся к одной и той же вещи! Да, набор инструкций x86-64 является ОГРОМНЫМ и регулярно получает расширения (подумайте о MMX, SSE, AVX .... и т. Д.).Каждое расширение представляет собой набор мини-инструкций. Посмотрите набор инструкций x86 в Википедии, вы должны получить массу информации.

+0

Большое вам спасибо за ваш ответ – jay

0

Процессоры x86 имеют несколько режимов, которые поддерживают разные варианты базового набора команд x86. Все они поддерживают 16-битный «реальный режим», который реализует исходную модель сегментированной памяти 8086, которая может обращаться только к 1 МБ. IIRC, они также могут поддерживать режим адресации 286, который является вариантом сегментированной модели памяти. Они поддерживают 386 защищенный режим, который расширяет регистры до 32 бит. До этого момента они в основном реализуют один и тот же набор команд (ISA), но с некоторыми дополнительными инструкционными префиксами и возможностью изменять интерпретацию размеров слов по умолчанию (инструкции арифметики и памяти могут по умолчанию равняться 16 или 32 бит, а затем префикс выберет значение, отличное от значения по умолчанию). Это называется «устаревшим режимом».

64-разрядное расширение (x86-64 или x64) не полностью обратно совместимо. Ряд однобайтовых кодов команд был переназначен для представления нового префикса «REX», который позволяет указать более широкие (64-разрядные) регистры и указать большее количество регистров. Чтобы использовать этот набор команд, процессор работает в еще одном режиме с названием «длинный режим».

Теперь, когда у вас есть 64-разрядное ядро ​​операционной системы, работающее в 64-разрядном режиме, а контекст ОС переключается на пользовательский процесс, он может одновременно изменять режимы. Таким образом, вы можете оставаться в 64-битном режиме, чтобы запустить 64-битный процесс, или вы можете перейти к устаревшему 32-битовому режиму для запуска 32-битного процесса. Когда 32-разрядный процесс вызывает вызов операционной системы, CPU автоматически переключается в режим 64 бит для запуска кода ядра. 64-битовое ядро ​​должно быть специально разработано, чтобы воспользоваться возможностями переключения режима.

Отъезд https://en.wikipedia.org/wiki/X86-64#Operating_modes для получения более подробной информации.

+0

Спасибо, ваш ответ мне очень помогает. – jay

+0

@jay Рассмотреть вопрос об ответах, которые помогли. –

Смежные вопросы