Что такое совместимое подмножество версий Intel и AMD x86-64?

Во время обучения сборке x86-64 я столкнулся с моей первой несовместимостью между реализациями Intel 64 и AMD64 "x86-64": Почему сборка syscall скомпилирована в 32-разрядном выходе NASM и popa не компилируется в 64 бит? syscall действителен в режиме совместимости одного, но не другого.

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

Например, было бы намного проще, если бы был:

  • стандартное подмножество, которое как Intel, так и AMD требуют следовать
  • комментарии к руководству Intel о совместимости с AMD, поскольку AMD изобрела x86-64. Но, конечно, это будет сложно для Intel, и руководства Intel не содержат слова AMD.
  • какое-либо общее официальное или неофициальное руководство, обеспечивающее совместимость определенных частей. Например, что-то вроде: режим совместимости может быть несовместимым, но не 64-разрядным.
  • некоторый ухоженный список несовместимостей Intel, AMD или какой-либо третьей стороны.

Ответ 1

Примечание к истории: Intel реализовала свою 64-битную ISA, которую они назвали IA-64, которая была полной заменой 32-разрядной ISA-сервера x86 в их процессорах Itanium. IA-64 не был обратно совместим с x86 и никогда не стал популярным за пределами рынка серверов высокого класса.

AMD создала ISA AMD64 как постепенную эволюцию по сравнению с ISA x86. AMD64 быстро завоевала популярность и признание, и Intel также приняла его, но в разное время называла его IA-32e, EM64T и Intel64. Intel64 и AMD64 почти идентичны с несколькими отличиями.

Wikipedia перечисляет эти различия:

  • Команды Intel 64 BSF и BSR действуют иначе, чем AMD64, когда источник равен нулю, а размер операнда - 32 бита. Процессор устанавливает флаг нуля и оставляет верхние 32 бита адресата undefined.

  • AMD64 требует другого формата обновления микрокода и управления MSR (регистры, специфичные для модели), в то время как Intel 64 реализует обновление микрокода без изменений от своих 32-разрядных процессоров.

  • Intel 64 не имеет некоторых MSR, которые считаются архитектурными в AMD64. К ним относятся SYSCFG, TOP_MEM и TOP_MEM2.

  • Intel 64 разрешает SYSCALL/SYSRET только в 64-битном режиме (не в режиме совместимости) и позволяет SYSENTER/SYSEXIT в обоих режимах. AMD64 не имеет SYSENTER/SYSEXIT в обоих под-режимах длинного режима.

  • В 64-битном режиме рядом с ветвями с префиксом размера 62H (операнд размер) ведут себя по-разному. Intel 64 игнорирует этот префикс: инструкция имеет расширенное смещение 32-битного знака, а указатель инструкции не усечен. AMD64 использует 16-битное поле смещения в инструкции и очищает верхние 48 бит указателя инструкции.

  • Процессоры AMD повышают значение Invalid Exception с плавающей запятой при выполнении FLD или FSTP 80-битной сигнализации NaN, в то время как процессоры Intel не работают.

  • Intel 64 не имеет возможности сохранять и восстанавливать уменьшенную (и, следовательно, более быструю) версию состояния с плавающей запятой (с использованием инструкций FXSAVE и FXRSTOR).

  • Недавние процессоры AMD64 снова включили ограниченную поддержку сегментации с помощью бит Long Range Segment Limit Enable (LMSLE) для облегчения виртуализации 64-битных гостей.

  • При возврате к неканоническому адресу с использованием SYSRET процессоры AMD64 выполняют общий обработчик ошибок защиты на уровне привилегий 3, а на процессорах Intel 64 - на уровне привилегий 0.