Как изменить набор инструкций процессора, который VirtualBox эмулировал для гостевой ОС, например, отключив набор инструкций SSE4.2?

Я хочу отключить набор инструкций SSE4.2 для ЦП, который VirtualBox эмулировал для моей гостевой ОС Linux для целей отладки, хотя реальный ЦП поддерживает набор инструкций SSE4.2, на котором основан VirtualBox. Я сослался на страницу руководства VirtualBox, есть несколько команд, которые могут быть связаны с этой проблемой:

VBoxManage setextradata "VM name" VBoxInternal/CPUM/SSE4.2 0

Вышеупомянутая команда не сработала.

VBoxManage list hostcpuids

Вышеупомянутая команда может использоваться для dumps the CPUID parameters for the host CPUs. This can be used for a more fine grained analyis of the host's virtualization capabilities.. Результат:

Host CPUIDs:

Leaf no.  EAX      EBX      ECX      EDX
00000000  00000016 756e6547 6c65746e 49656e69
00000001  000906e9 02100800 7ffafbff bfebfbff
00000002  76036301 00f0b6ff 00000000 00c30000
00000003  00000000 00000000 00000000 00000000
00000004  1c004121 01c0003f 0000003f 00000000
00000005  00000040 00000040 00000003 00142120
00000006  000027f7 00000002 00000001 00000000
00000007  00000000 029c6fbf 00000000 00000000
00000008  00000000 00000000 00000000 00000000
00000009  00000000 00000000 00000000 00000000
0000000a  07300804 00000000 00000000 00000603
0000000b  00000001 00000001 00000100 00000004
0000000c  00000000 00000000 00000000 00000000
0000000d  0000001f 00000440 00000440 00000000
0000000e  00000000 00000000 00000000 00000000
0000000f  00000000 00000000 00000000 00000000
00000010  00000000 00000000 00000000 00000000
00000011  00000000 00000000 00000000 00000000
00000012  00000000 00000000 00000000 00000000
00000013  00000000 00000000 00000000 00000000
00000014  00000001 0000000f 00000007 00000000
00000015  00000002 0000011c 00000000 00000000
00000016  00000d48 00000ed8 00000064 00000000
00000017  00000d48 00000ed8 00000064 00000000
80000000  80000008 00000000 00000000 00000000
80000001  00000000 00000000 00000121 2c100800
80000002  65746e49 2952286c 726f4320 4d542865
80000003  35692029 3035372d 50432030 20402055
80000004  30342e33 007a4847 00000000 00000000
80000005  00000000 00000000 00000000 00000000
80000006  00000000 00000000 01006040 00000000
80000007  00000000 00000000 00000000 00000100
80000008  00003027 00000000 00000000 00000000
80000009  00000d48 00000ed8 00000064 00000000

Я знаю, что вывод может быть тесно связан с инструкцией CPUID X86, но я до сих пор не могу понять, что означают эти строки Leaf no. EAX EBX ECX EDX. Какая связь между этими строками и выводом инструкции CPUID? Я думаю, что только зная взаимосвязь между этими строками и выводом инструкции CPUID, мы сможем правильно использовать следующую команду:

VBoxManage modifyvm --cpuid <leaf> <eax> <ebx> <ecx> <edx>

Приведенная выше команда - единственный известный мне способ достижения моей цели. Итак, какова связь между выводом VBoxManage list hostcpuids, содержимым, за которым следует Leaf no. EAX EBX ECX EDX, и выводом инструкции CPUID? Как отключить набор инструкций SSE4.2 для процессора, который VirtualBox эмулировал для моей гостевой ОС Linux, даже если реальный процессор поддерживает набор инструкций SSE4.2, на котором основан VirtualBox? Достигнет ли VBoxManage modifyvm --cpuid <leaf> <eax> <ebx> <ecx> <edx> моей цели? И если у вас есть другой способ добиться этого, пожалуйста, скажите мне.

Я был бы очень удивлен, если бы SSE4 можно было отключить на программном уровне. См. Также обсуждения это и это. С помощью AVX можно включить / отключить поддержку ОС, но не поддержку ЦП. Обратите внимание, что SSE4 не требует специальной поддержки ОС, кроме стандартной поддержки SSE. Также обратите внимание, что ЦП выполняет инструкции процессора, то есть инструкции не эмулируются виртуальным боксом.

wim 10.09.2018 21:55

Возможно, вы сможете привлечь больше внимания к своему вопросу, добавив теги x86 и / или simd.

wim 10.09.2018 22:01

@wim: [sse] - это базовый / общий тег для x86 SIMD, которому люди склонны следовать, если они не следуют sse*.

Peter Cordes 11.09.2018 05:06

@wim: должна быть возможность изменить поведение CPUID, чтобы он не отчет SSE4.2 был доступен (поскольку CPUID сам может инициировать выход виртуальной машины), поэтому вы можете протестировать случай не-SSE4.2 для диспетчеризации времени выполнения. Но, как вы говорите, это не поможет вам проверить, не выполняет ли ваше программное обеспечение никаких инструкций SSE4.2 после того, как обнаружит, что они недоступны. Для этого вам понадобится BOCHS или qemu для эмуляции вместо аппаратной виртуализации. Или ПИН-код Intel.

Peter Cordes 11.09.2018 05:15

@PeterCordes: Ничего страшного, если мое приложение выполняет инструкции SSE4.2 или нет. Я просто хочу, чтобы VirtualBox имитировал ЦП без SSE4.2 для целей отладки. Точнее, я просто хочу создать ситуацию, когда приложение выполняет инструкции SSE4.2 на процессоре, эмулированном VirtualBox, который не поддерживает инструкции SSE4.2.

cong 11.09.2018 05:41

И вы хотите, чтобы инструкции SSE4.2 вызывали исключение #UD (недопустимая инструкция)? Как и я, \ @wim, этого не произойдет с виртуализацией HW. Нет бита, который вы можете установить с помощью аппаратной виртуализации, который приводит к ошибке инструкций SSE4.2, не вызывая также сбоев всех инструкций SSE1 / 2/3. Вам нужен эмулируемый процессор, например BOCHS / qemu / Intel-Pin. Я думаю, что с VBox все, что вы можете сделать, это изменить то, что сообщает CPUID. Так что это процессор, который по-прежнему поддерживает SSE4.2, но никому об этом не говорит.

Peter Cordes 11.09.2018 05:46

@PeterCordes: Да, я хочу вызвать исключение недопустимой инструкции. И, может, нормально отключить все SSE1 / 2/3/4. Вы знаете, как этого добиться?

cong 11.09.2018 06:37

Самый простой способ - это BOCHS, qemu или Intel PIN, как я уже сказал. Чтобы полностью отключить SSE, возможно, попробуйте просто загрузиться с CPUID, для которого задано значение, не указывающее даже SSE1, чтобы операционная система не включала биты в CR0 и CR4, которые делают инструкции SSE не ошибочными. Как включить SSE для моего автономного загрузочного кода?. (Но это, вероятно, влияет только на инструкции, которые читают / записывают регистры XMM, возможно, не на prefetch или popcnt. Обратите внимание, что popcnt имеет свой собственный бит функции, отдельный от SSE4.2.) Поэтому вы захотите написать несколько тестовых программ для проверки.

Peter Cordes 11.09.2018 06:40

@PeterCordes Интересно. Я не знал, что существует так много инструментов эмуляции процессора.

wim 11.09.2018 11:52

@PeterCordes, для достижения цели отладки я должен сделать это с моим VirtualBox, что означает, что я хочу сгенерировать VirtualBox без поддержки SSE4.2 или всего SSE1 / 2/3/4 для запуска приложения, которое выполняет SSE4. 2 инструкция.

cong 11.09.2018 13:05

@cong: Возможно, будет невозможно сделать ошибку popcnt и crc32 внутри виртуального бокса, если только вы не можете заставить его эмулировать вместо использования HW virt. Если вам просто нужны pcmpistri xmm, xmm/mem и другие векторные инструкции SSE4.2 XMM для отказа, я думаю, что ваша единственная надежда внутри VBox - полностью отключить поддержку SSE в CPUID, поэтому ОС (вероятно) не будет включать биты регистра управления.

Peter Cordes 11.09.2018 20:31

@PeterCordes, Значит, вы имеете в виду, что невозможно просто сделать ошибку crc32, не отключив все SSE1 / 2/3/4 ...?

cong 12.09.2018 03:32

Нет, я не думаю, что вообще каким-либо образом может вызвать ошибку crc32 на реальном оборудовании, которое его поддерживает (голое железо или виртуализация оборудования). Он не использует регистры XMM, поэтому я не ожидаю, что установка этих битов в CR0 и CR4 приведет к ошибке. Если вы хотите протестировать свое программное обеспечение на (виртуальном) x86, который дает сбой на crc32, я думаю, вам нужна программная эмуляция или что-то вроде ПИН-кода Intel, который может динамически перекомпилировать, чтобы большая часть кода работала изначально, но инструкции, которые вы хотите исправить, заменяются на инструкция по ловушке. (Я думаю, он может это сделать.)

Peter Cordes 12.09.2018 03:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
13
1 893
0

Другие вопросы по теме