32 разрядные процессы не могут получить доступ к 64 разрядным процессором

Обновлено: 07.07.2024

Прежде чем приступить к тематике разработки кода 64-битных программ, остановимся на вопросе обратной совместимости 64-битных версий Windows с 32-битными приложениями. Обратная совместимость осуществляется за счет механизмов, реализованных в WoW64.

WoW64 (Windows-on-Windows 64-bit) - подсистема операционной системы Windows, позволяющая запускать 32-битные приложения на всех 64-битных версиях Windows.

Подсистема WoW64 не поддерживает следующие программы:

  • программы, скомпилированные для 16-разрядных операционных систем;
  • программы режима ядра, скомпилированные для 32-разрядных операционных систем.

Накладные расходы

Существуют различия WoW64 в зависимости от архитектуры процессора. Например, 64-битная версия Windows разработанная для процессора Intel Itanium 2 использует WoW64 для эмуляции x86 инструкций. Такая эмуляция весьма ресурсоемка по сравнению с WoW64 для архитектуры Intel 64, так как происходит переключение с 64-битного режима в режим совместимости при выполнении 32-битных программ.

WoW64 на архитектуре Intel 64 (AMD64 / x64) не требует эмуляции инструкций. Здесь подсистема WoW64 эмулирует только 32-битное окружение за счет дополнительной прослойки между 32-битным приложением и 64-битным Windows API. Где-то эта прослойка тонкая, где-то не очень. Для средней программы потери в производительности из-за наличия такой прослойки составят около 2%. Для некоторых программ это значение может быть больше. Два процента - это немного, но следует учитывать, что 32-битные приложения работают немного медленнее под управлением 64-битной операционной системы Windows, чем в 32-битной среде.

Компиляция 64-битного кода не только исключает необходимость в WoW64, но и дает дополнительный прирост производительности. Это связано с архитектурными изменениями в микропроцессоре, такими, как увеличение количества регистров общего назначения. Для средней программы можно ожидать в пределах 5-15% прироста производительности от простой перекомпиляции.

Преимущество 64-битной среды для 32-битных программ

Перенаправления

Подсистема WoW64 изолирует 32-разрядные программы от 64-разрядных путем перенаправления обращений к файлам и реестру. Это предотвращает случайный доступ 32-битных программ к данным 64-битных приложений. Например, 32-битное приложение, которое запускает файл DLL из каталога %systemroot%\System32, может случайно обратиться к 64-разрядному файлу DLL, который несовместим с 32-битной программой. Во избежание этого подсистема WoW64 перенаправляет доступ из папки %systemroot%\System32 в папку %systemroot%\SysWOW64. Это перенаправление позволяет предотвратить ошибки совместимости, поскольку при этом требуется файл DLL, созданный специально для работы с 32-разрядными приложениями.

Подробнее с механизмами перенаправления файловой системы и реестра можно познакомиться в разделе MSDN "Running 32-bit Applications".

Почему невозможно использовать в 64-битной программе 32-битные DLL? Можно ли это обойти?

Загрузить 32-битную DLL из 64-битного процесса и выполнить код из неё невозможно. Невозможно в силу дизайна 64-битных систем. В принципе, невозможно. Не помогут ни хитрости, ни недокументированные пути. Для этого нужно загрузить и проинициализировать WoW64, не говоря уже о структурах в ядре. Фактически нужно будет на лету превратить 64-битный процесс в 32-х битный. Подробнее эта тема рассмотрена в посте "Недокументированные функции; Загрузка 32-х битных DLL в 64-х битный процесс". Единственное, что можно порекомендовать, - это создание суррогатного процесса и взаимодействия с ним посредством технологии COM. Об этом рассказывается в статье "Accessing 32-bit DLLs from 64-bit code".

А вот загрузить ресурсы из 32-битной DLL в 64-битный процесс совсем несложно. Это можно сделать, если при вызове LoadLibraryEx указать флаг LOAD_LIBRARY_AS_DATAFILE.

Постепенный отказ от поддержки 32-битных программ

Вполне естественно, если компания Microsoft будет стимулировать переход на 64-битные системы, постепенно отказываясь от поддержки 32-битных программ в ряде версий операционной системы Windows. Конечно, это будет очень медленный процесс. Но все-таки первые шаги в этом направлении уже сделаны.

Многие администраторы знают про относительно новый режим установки и работы серверной версии операционной системы под названием Server Core. Это тот режим, о котором участники войн "Windows vs Linux" говорили очень давно. Одним из аргументов сторонников использования Linux на сервере была возможность установить серверную ОС без графического интерфейса (GUI). Но вот и в Windows Server появилась такая возможность. Установка в этом режиме позволяет получить только командную строку без пользовательского интерфейса.

start /w ocsetup ServerCore-WOW64

В обычном (Full Installation) режиме 32-битные приложения по умолчанию запускаются, а вот в Server Core уже нет.

Тенденция очевидна. Со временем все более рациональным будет создание 64-битных версий приложений, так как они смогут функционировать на большем числе версий операционных систем.

Дополнительная информация

Добрый день ) Сегодня скачал и установил Qscalp в ознакомительном режиме. Настроил Квик по мануалу и видеоинструкциям,но уперся в подключение привода к Квику. В меню привода просто нет кнопки ПОДКЛЮЧЕНИЕ . Что делать?

Владимир
выставляешь заявку и видишь как она попадает в стакан спустя 2-3 секунды, сначала грешил на без проводную клаву, но потом выяснилось что это привод . Что с этим делать, как вылечить?

Да извиняюсь подключение через квик.

Добрый день. Николай помогите настроить привод, ну уже спасу нет как достали эти тормоза . выставляешь заявку и видишь как она попадает в стакан спустя 2-3 секунды, сначала грешил на без проводную клаву, но потом выяснилось что это привод . Что с этим делать, как вылечить? Спасибо.

Игорь
я установил QScalp Trust 5.0.165 и подключил его к Quik,
но не могу выставить заявку на покупку и продажу. Горит зеленый и желтый индикатор

Науруз
После обновления версии квика (версия 8.3.2.4) пишет в qscalp, что «32-х разрядные процессы не могут получить доступ в 64-х разрядным процессам»
Что делать подскажите?

Необходимо обновить QScalp до актуальной версии.

Андрей
мне пришлось обновить КВИК до 8 версии (старый то и дело зависал), но при этом перестал работать QScalp 5 версия. Возможно ли его обновление?

Конечно. Для этого скачайте дистрибутив QScalp актуальной версии и установите из него программу поверх старой.

Вопрос уже задавался, прошу прощения! Разобрался, все получилось

Здравствуйте, обновился Quik до 8 версии, я установил QScalp Trust 5.0.165 и подключил его к Quik,
но не могу выставить заявку на покупку и продажу. Горит зеленый и желтый индикатор. Счет также настроил.

Владимир
При загрузке истории торгов с Цериха или Финама все загружается,но после загрузки доступны для просмотра кластеры с 21:50 до 23:50,более ранние не перелистываются.

Здравствуйте Николай.При загрузке истории торгов с Цериха или Финама все загружается,но после загрузки доступны для просмотра кластеры с 21:50 до 23:50,более ранние не перелистываются.

Максим
Не удалось установить связь с агентом

Необходимо установить и запустить агента QScalp в Квик, как это показано в руководстве пользователя.

Сергей
следует выставить заявку на покупку по цене 2р (или выше) или с отступом -10

В том то и дело, что при таком действии у меня идёт покупка именно по «плохой» цене, а лоты ниже остаются нетронутыми в стакане (quik, Сбербанк брокер)

следует выставить заявку на покупку по цене 2р (или выше) или с отступом -10

В том то и дело, что при таком действии у меня идёт покупка именно по «плохой» цене, а лоты ниже остаются нетронутыми в стакане (quik, Сбербанк брокер)

Андрей
Ответ от брокера:
В таблице обезличенных сделок по инструментам СПБ ИЦБ транслируется текущая цена рынка.

Евгений
как получить ключ в Qscalp?

Владимир
Здравствуйте. При загрузке Qscalp не загружается главное окно с панелями инструментов. Загружаются торговые окна по инструментам и сам я рлык отображается в панели задач, а вот главного окна нет и перезагружал комп и на другой монитор окна перетаскивал, думал может закрыто каким нибудь торговым окном, но нет, нигде его нет. Что можно сделать?

Вопрос решил сменой разрешения одного из мониторов, главное окно было за панелью задач. Вопрос снят.

Здравствуйте. При загрузке Qscalp не загружается главное окно с панелями инструментов. Загружаются торговые окна по инструментам и сам я рлык отображается в панели задач, а вот главного окна нет и перезагружал комп и на другой монитор окна перетаскивал, думал может закрыто каким нибудь торговым окном, но нет, нигде его нет. Что можно сделать?

Здравствуите, как получить ключ в Qscalp?

Андрей
при выставлении автоматического стоп лосса с проставленной опцией «внешняя заявка» — как сделать, чтобы этот стоп отображался на графике в Квике, какие настройки Квика за это отвечают (включил опцию «внешней заявки», а на графике и в таблице заявок Квика по-прежнему ничего не отображается)?

В чем разница между 32-битной и 64-битной ОС? Может ли 32-битная ОС работать на 64-битном процессоре?

4 ответа 4

Ваш вопрос зависит от архитектуры. x64 по сути является расширением архитектуры x86. Он поддерживает 64-битное адресное пространство. Он предоставляет некоторые новые инструкции и новые регистры.

Вы можете запустить 32-разрядную Windows x86 на компьютере x64. Обратите внимание, что вы не можете сделать это на 64-битных системах Itanium.

Разница в основном в размере указателя / ссылки. На 64-битных машинах вы можете ссылаться на адрес в 64-битном диапазоне адресов (что дает вам 2 ^ 64 байта памяти). На 32-битной вы можете адресовать только 2 ^ 32 байта (= 4 ГБ). Теперь, если вы посмотрите на современные компьютеры, становится очевидным, почему мир движется к 64-битным: 32-битные больше не могут легко обращаться ко всей оперативной памяти.

На x64 (AMD/Intel) у вас есть дополнительные преимущества 64 бит. Процессор имеет больше регистров и, следовательно, позволяет более эффективный код.

На других архитектурах различия между 64 и 32 битами менее очевидны. Например, Nintendo 64 (помните это?) была 64-битной машиной, но большая часть кода была 32-битной. Таким образом, в этом случае 64-битная игра стала маркетинговым ходом.

В настоящее время принятый ответ, как правило, правильный, но не совсем так. На самом деле не существует ни одной вещи, называемой «32-разрядным процессором» или «64-разрядным процессором» - это описание относится только к одной небольшой части архитектуры процессора. В частности, оно ссылается на число линий выбора адреса между процессором и памятью, то есть так называемое адресное пространство, доступное для операций памяти.

В былые времена, когда ЦП, когда люди привыкли сидеть и плести (обматывать) провода между процессором и памятью, вам пришлось бы использовать либо 32, либо (теоретически, потому что его не было в то время) 64 провода между процессором и контроллером памяти, которые будут использоваться для указания того, к какому адресу памяти вы хотите обратиться. Например, скажем, у нас есть 2-битная архитектура памяти: отправка 00 выберет адрес 0, 01 выберет адрес 1, 10 выберет адрес 2, а 11 выберет адрес 3. Этот 2-битный дает нам 2 ^ 2 байта оперативной памяти (4 байта).

Если вы берете 32-битный процессор и добавляете еще 32 провода между процессором и контроллером памяти, чтобы волшебным образом поддерживать больше памяти, у вас теперь есть «64-битный процессор», который может работать 32-битный код или 64-битный код. Что это значит и как это происходит? Хорошо, давайте возьмем наш 2-битный ЦП из предыдущей части этого ответа и добавим еще один провод, превратив его в 3-битный ЦП, перенеся нас с 4 байтов на 2 ^ 3 или 8 байтов оперативной памяти.

Будет запущен существующий «2-байтовый» код с настройками значений двух последних проводов, как указано выше (00-11). По умолчанию мы подключим дополнительное соединение к нулю, так что фактически, когда запускается 2-байтовый код, когда он выбирает 00, он фактически выбирает 000, а когда он выбирает 11, он фактически выбирает 011. Легко.

Теперь программист хочет написать "родной" 3-байтовый код и пишет свое программное обеспечение, чтобы воспользоваться дополнительным адресным пространством. Она сообщает процессору, что знает, что делает, и что она возьмет на себя ручное управление новыми, дополнительными проводами. Ее программное обеспечение знает о дополнительных проводах и правильно отправляет 000-111, предоставляя ей полный доступ к диапазону памяти, поддерживаемому этой новой архитектурой процессора.

Но так не должно быть. На самом деле, обычно это не так. Когда впервые были представлены 64-разрядные процессоры (а их было много), все они использовали совершенно новые архитектуры / конструкции. Они не просто подключили дополнительные 32 провода и сказали: «Вот, пожалуйста, это 64-битный процессор, который вы можете использовать в 32-битном или 64-битном режиме», а скорее сказали: «Это наш новый процессор и он берет программирование только на этом совершенно новом машинном языке, ведет себя совершенно по-новому, решает множество других проблем гораздо более элегантно, чем старые 32-битные процессоры x86 / i386, и это родная 64-битная архитектура. Повеселись."

Это была история Intel Itanium, теперь известной как "Итаник" из-за того, как сильно она затонула. Он должен был предвещать в новой 64-битной эре, и это было что-то, чтобы созерцать. Инструкции с переменной длиной, огромные кеши, 64-битное адресное пространство, тонны регистров, супер захватывающие, супер крутые и супер трудные, чтобы убедить всех перекомпилировать или переписать 20-летний устаревший код. Это было тогда, когда AMD и Intel фактически конкурировали, и у AMD была блестящая идея сказать: «Давайте забудем все это, решим все мировые проблемы» и просто добавим еще 32 провода к i386 и сделаем 32-битную совместимую 64-разрядную. bit CPU "и родилась архитектура процессора x86_64.

Фактически, если вы посмотрите на имена и источники ядра для основных операционных систем (Linux, Windows, BSD и т.д.), Вы обнаружите, что они завалены ссылками на процессоры AMD64 и архитектуру AMD64. AMD разработала выигрышную стратегию, позволяющую всем перейти на 64-битный мир, сохранив совместимость с 32-битными приложениями, чтобы 32-битная ОС могла работать на 64-битном оборудовании или даже 32-битных приложениях. может работать на 64-битной ОС на 64-битном оборудовании. Intel последовала за пакетом раньше, чем позже, с архитектурой Intel EM64T (которая была в основном идентична AMD64), и x86_64 победил, в то время как Itanic и другие, такие как MIPS64 и ALPHA64, больше не были замечены на рынке настольных ПК / серверов.

tl; dr amd64 aka x86_64 Процессоры совместимы как с 32-, так и с 64-битным ядром и кодом, но большинство 64-битных процессоров явно не имеют обратной совместимости одинаково. 32-разрядный ЦП может получить доступ максимум к 4 ГБ памяти, а 64-разрядный ЦП может получить доступ к потрясающим 16 EiB (16 × 1024 ^ 6 байт, или в 4 миллиарда раз больше памяти, чем 4 ГБ).

Рядовые пользователи не особо задумываются о таких вещах как архитектура процессора и разрядность операционной системы, по крайне мере до тех пор, пока не столкнуться с проблемами совместимости при установке приложений или операционной системы. Так, попытка установить 64-битное приложение на 32-битную систему неминуемо приведет к ошибке «32-bit Windows hosts are not supported…» .

32-bit Windows hosts are not supported

В связи с этим у пользователей 32-битных Windows может возникнуть вопрос: а нельзя ли каким-то образом обойти это ограничение?

Да, такой способ существует, но работать он будет только при одном условии, — если процессор поддерживает 64-разрядную архитектуру.

В Windows 10 и 8.1 проверить разрядность ЦП очень просто, достаточно выполнить в окошке Win + R команду control /name Microsoft.System .

Сведения о компьютере

Обратите внимание на пункт «Тип системы», в котором будет указана разрядность ОС и разрядность процессора. Наличие процессора x64 делает возможной установку 64-битных программ, если ЦП x86 , увы, запускать 64-битный софт вы не сможете даже при всём желании.

Тип системы

Примечание: если ЦП поддерживает архитектуру x64, установка 64-разрядной Windows возможна на ПК даже с 1 Гб оперативной памяти.

Более того, на машине с таким процессором возможна установка только 32-разрядной Windows или другой ОС. Для определения разрядности процессора в Windows 7 и более старых ОС можно воспользоваться встроенной консольной утилитой systeminfo или сторонним приложением CPU-Z.

Выполните в командной строке systeminfo и посмотрите, что указано в пункте «Процессор<ы>».

Systeminfo

x64 укажет на 64-разрядный ЦП, а x86 — на старый 32-битный. В CPU-Z на 64-разрядный ЦП укажут маркеры х86-64 или ЕМ64Т в блоке «Instructions», если процессор окажется 32-битным, указанные маркеры будут отсутствовать.

CPU-Z

С разрядностью разобрались, теперь что до установки 64-разрядного софта на 32-битные Windows.

Напрямую установить и запустить 64-битную программу на такую ОС не получится, но вы можете воспользоваться любым гипервизором, тем же VirtualBox, создав в нём 64-битную виртуальную машину и установив на нее 64-разрядную Windows.

VirtualBox

Другое дело, будете ли вы довольны результатом такой виртуализации.

Производительность виртуальной 64-битной OS, даже если это будет XP , окажется более чем низкой, впрочем, возможно именно это заставит пользователя задуматься о необходимости перехода на более производительную 64-битную систему.

Читайте также: