доступ к 64 разрядным инструкциям

chirrsen

Есть ли доступ к 64 разрядным инструкциям из под 32 разрядной ОСи?

agaaaa

нет за редкими исключениями в число которых линуксы и windows не входят

apl13

Блин, а из 16-разрядной ДОС 32-битная Win 3.11 + Win32s запускалась на "Ура"... :(

vall

смотря что считать 64-разрядными. так-то и доступ к 128 разрядным есть без проблем :umn:

agaaaa

Из режима ядра можно перейти в 64 битный режим.
Но, если не постараться, ОС, скорее всего, упадёт.

agaaaa

Думаю он имел ввиду нечто вроде ADD RAX, RBX ;)
У самого стоит 64-битная винда, чтоб можно было тестировать компилятор в x64 на настоящем железе без чехарды с qemu

procenkotanya

И в чём с ними проблема? Мне вспоминается, что их вполне можно использовать.
Правда, при переключении процессов старшие половинки не будут записаны и восстановлены.

agaaaa

И в чём с ними проблема? Мне вспоминается, что их вполне можно использовать.
Нужен специальный драйвер, работающий в режиме ядра, который мог бы сделать сегмент кода со включенным long mode.

valodyr

Очень большой геморрой это. Чтобы ничего не уронить, надо возвращаться в натуральный 32-битный режим перед ядерными вызовами (compatibility mode не канает из-за разных форматов сохранения данных на стеке при вызовах по call gate и прерываниях). Это же относится и к обработке прерываний, которые, вообще говоря, предсказывать немного сложно )

SPARTAK3959

Прерывания не нужно предсказывать, их нужно просто все перехватывать. Какой уважающий себя драйвер не перехватывает все прерывания и половину Native и Kernel API? ;)

tokuchu

Я чего-то не понял. 64-битные команды только в особом режиме процессора работают что ли? :crazy: :confused:

klyv

Я чего-то не понял. 64-битные команды только в особом режиме процессора работают что ли?
ты не поверишь. 64-битном. а бывает ещё 32битный. и раньше бывал 16битный.

vall

да, АФАИК там для кодирования команд используется однобайтный префикс в котором остальные биты номера регистра и прочая лабуда. так вот эти префиксы частично пересеклись с какими-то однобайтными старыми командами.
так что скорее всего 64битные команды не получится поиметь без включения полного 64битного режима с новой адресацией памяти и прочими несовместимостями.

AlexV769

Судя по тому, как сегодня VmWare Server, увидя отключенный Intel Virtualisation Technology сильно матерился. При этом FreeBSD amd64 отказывалась грузиться.
Зашел в BIOS, включил упомянутую технологию, 64-разрядный гость взлетел на ура на 32-битном хосте.

karkar

64битные команды не получится поиметь без включения полного 64битного режима
А как у меня VMWare Workstation в 32-битной винде запускает гостевой 64-битный Линукс?

vall

точно так-же как она запускает 32битный без хардварной поддержки — магические пляски вокруг эмуляции адресного пространства.
ну в госте 64битный режим то включён так или иначе.
то что 64 > 32 не значит что один чем-то круче, просто в 64 битах эмулировать 32 проще чем наоборот.

AlexV769

без хардварной поддержки
она так не умеет, если что.

tokuchu

так вот эти префиксы частично пересеклись с какими-то однобайтными старыми командами.
Извините, а как тогда работали бы 32-битные проги под 64-битной ОС? Наверняка им не кто инструкции не куропатит.
так что скорее всего 64битные команды не получится поиметь без включения полного 64битного режима с новой адресацией памяти
Не вижу проблем, почему этот режим не может работать постоянно. Если только этот режим принципиально не отличается от 32битного. Но в любом случае такого различия, были бы поломаны 32битные, если только перед переключением контекста для них свой режим не выставляется, но там, я думаю, другие проблемы тогда возникают.
и прочими несовместимостями.
Какие-такие?

kill-still

Меня больше волнует когда компиляторы под 64 напишут....

tokuchu

Вообще, похоже, действительно это разными режимами реализовано:
http://en.wikipedia.org/wiki/Amd64

tokuchu

Меня больше волнует когда компиляторы под 64 напишут....
Это как?

valodyr

Есть два "больших" режима работы процессора: real и protected (v8086 и SMM не рассматриваем). Внутри protected есть legacy и long. Legacy — это режимы классической IA-32 (в сегменте кода выставляется размер операнда и адреса по умолчанию — 16 или 32, в сегменте стека — размер стека long — это режиме IA-32e (или AMD64). В long режимах несколько иные правила игры (с точки зрения системы чем в legacy. Например, работа со стеком всегда происходит через RSP, если я не ошибаюсь. Кроме того, не работают больше базы сегментов. Long режимы условно делятся еще на два: compatibility (это 32- или 16-битный long-режим, по биту D в дескрипторе CS) и 64-bit (по биту L в декскрипторе CS). В последнем доступны 64-битные инструкции, причем для использования 64-битного размера операнда (в большинстве из них) или расширенных регистров (во всех из них) необходимо пользоваться REX-префиксами, которые занимают в карте опкодов строку 0x40-0x4F, где раньше были однобайтовые INC и DEC.
32-битные аппликухи запускаются в compatibility mode (но общий режим устанавливается в long, т.е. EFER.LMA выставлен). 64-битные апликухи и ядро работают в 64-bit mode.
Вообще говорить именно о "режимах" здесь не совсем правильно. Режимы есть long и не long, остальное — флажки в дескрипторах.

klyv

Режимы есть long и не long, остальное — флажки в дескрипторах.
уж не в виде флажка ли определяется, long или не long сейчас? ;)

tokuchu

Есть два "больших" режима работы процессора: real и protected (v8086 и SMM не рассматриваем).
Ну так я же ссылку привёл, по которой то же самое прочитал (там правда немного по другому это называется). Так зачем ещё раз это дублировать? :)

vall

посмотрите кто пришёл! молодец, мощно задвинул. =)

valodyr

Это определяется битом LMA в MSR'е EFER.

klyv

Это определяется битом LMA в MSR'е EFER.
я к тому, что везде режим определяется каким-нить флажком ;)
Оставить комментарий
Имя или ник:
Комментарий: