Привет. Никто не видел в природе SSE эмулятора? А то тут Adobe устроил засаду, Adobe Bridge хочет SSE для работы. Притом не то что хочет, а даже не проверяет ничего, а так как у меня CPU SSE не поддерживает - он просто валится. В отладчике я посмотрел - конечно оптимизация супер, без SSE ну просто никак. 95% SSE кода это: movss xmm0,[mem1] movss [mem2],xmm0 Ну вот собственно я и подумал, что если сэмулировать SSE, производительность будет приемлемая, тем более что Photoshop работает без проблем. Собственно почему тема в WASM.OS.KERNEL? Ну я больше чем уверен что нет такого эмулятора, прийдётся писать :/ И есть пару вопросов: 1. Есть ли в адресном пространстве процесса ниже 2Gb адреса куда он не лезет? Т.е. ImageBase обычно 400000h, а что находится ниже? Просто надо где-то хранить для каждого процесса XMM регистры, и адресное пространство - самое подходящее место. Тогда не надо отслеживать переключение задач и отлавливать завершение процесса для освобождения памяти занимаемой виртуальными XMM регистрами. Вопрос есть ли какая-нибудь функция MemoryManager чтобы замапить страницу в адресное пространство процесса ниже 2Гб желательно с доступом только из Ring0, и по каким адресам лучше мапить? Руками не охота что-то таблицу страниц править... 2. Как из Ring0 проверить доступна ли память? Т.е. допустим в коде написана команда movss xmm0,[mem_addr] Я её буду эмулировать, и если прога бажная, mem_addr вообще говоря может быть недоступен. А BSOD ловить не охота... 3. Как перехватить CPUID чтобы прикинуться что есть поддержка SSE? Что-то кроме трассировки ничего в голову не приходит, но это убьёт производительность в разы. Ну это не обязательно, эмуляция преимущественно делается для наглых программ которые не проверяют наличие SSE. Хотя было бы полезно.
Было б легче я б не писал. Мне и без SSE нормально живётся, вполне MMX и 3DNow! хватает. А из-за одной проги покупать себе новый CPU не вижу никакого смысла. По теме что-нить можеш сказать?
нельзя предугадать правильность кода, работающего в контексте процесса из-за ошибки в коде может идти обращение к любой части адресного пространства первые несколько страниц линейного адресного пространства обычно используются для детекста доступа к данным по нулевому указателю, т. е при нормальной работе туда никто не лезет можно отобразить туда нужные физические страницы со сброшенным U/S битом в соответствующих PTE правда это может сказаться на правильности обработки #PF ядром в случае доступа к ним из пользовательского режима VAD? никак
cppasm раз ты говоришь (на краклабе), что sse-кода там не много, то не проще ли переписать функции, в которых он используется.
это понятно, потому и хочу с доступом только из R0 А какие с PF# могут быть проблемы? Вообще для этого есть функция какая-нибудь, или PTE прийдётся руками править? пошёл в Google... ну с тут я так и думал... Млин, впервые вижу коммерческий продукт который даже не говорит по человечески что хочу SSE, а тупо падает :/
У меня исходников нет Или ты имееш ввиду пропатчить? В принципе можно (это я первое начал делать), но там есть одна сложность. Код компилятором раскидан сильно. Т.е. есть к примеру Код (Text): xorps xmm0,xmm0 а потом через кучу кода call функции, в которой Код (Text): movss [mem1],xmm0 movss xmm0,[mem2] movss [mem3],xmm0 И эту же функцию вызывают из других мест, но перед вызовом уже xor нету. И что в XMM0 отследить напряжно. Я пока что придумал, так это прилепить к файлу ещё одну секцию, и в ней все эти команды реализовать в виде процедур, а вместо xorps xmm0,xmm0 патчить на call sw_xorps Но проблема в том что длины опкода может не везде хватить... Хотя можно выкрутиться. Я просто думал эмулятор сделать может кому ещё надо, но после советов купить новый проц я всё больше склоняюсь к мысли просто пропатчить прогу. А может и вообще забить ПС: ещё как вариант поставить свой SEH и в нём эмулировать нужную команду...
кто такой все? гигагерцовый атлон уже не процессор что-ли? дело не в средствах, а в принципе, и под Socket A с поддержкой SSE по-моему нифига нет. а менять всю систему я уж точно не буду.
к примеру неправильная интерпретация флагов в PTE т. е по-умолчанию PTE определяет набор флагов, которые предписывают обработчику #PF выполнение некоторых действий при возникновении #PF изменяем флаги - изменяется поведение
cppasm 1. Зачем тебе Bridge? Есть фотошоп и без него, прежние версии. И тормозить не так будет на твоём железе. Я больше сомневаюсь, что SSE не нужен самому фотошопу (разве что он проверяет и имеет код для работы без SSE). 2. Эмулятор-то написать можно теоретически, в ОС есть функционал, который тебе бы помог в этом. Но смысл? См п. 1. 2. Эмулировать CPUID тебе не понадобится, ты же говоришь, что прога не проверяет наличие SSE. А для общего случая ничего нет, кроме аппаратной эмуляции. Для частного можно придумать по обстоятельствам.
Ну Bridge в общем-то так, программа прикольная Особо не нужен. Дело ещё и в интересе. А Photoshop CS3 отлично работает, уже недели две пользуюсь. У него ядро есть - MMXCore или как-то так. Оно при старте проверяет какие есть расширения и использует максимальные из доступных. Я бы даже сказал нужные механизмы заложены в CPU в виде исключения UD# То что оно нафиг никому не надо я уже понял... Та про CPUID можно забыть уже... Для этой конкретной проги оно не надо, я просто думал если полнофункциональный эмулятор делать то можно было бы опционально "software sse" включать даже для прог которые проверяют поддержку. В общем это последнее в очереди на реализацию, да и эмулятор наверное писать я уже не буду...
cppasm если действительно хочется - пиши! просто дочерта разных тем, которые не только тебе одному интересны, и это всем пригодится. Сам решай что тебе интересно и нужно. Удачи!
Ну, это тоже. Я о Такое место уже есть: в контексте потока (было бы ошибкой хранить одну копию регистров на один процесс).
Насчёт процесса это я оговорился, конечно надо для потока. А можно по-подробней? По каким хоть ключевым словам в google искать. Т.е. как получить доступ к памяти хранящей текущий контекст. В принципе я предполагаю что где-то это должно быть, но я с ядром ОС не очень глубоко знаком. Обычно хранят в TSS, но в Win2k и выше физический TSS один на всех... К тому же тут вопрос: если у меня процессор не поддерживает SSE - в контектсе потока место под XMM регистры всё равно выделяется, но не используется? Может ведь ставиться другое ядро без поддержки SSE - и в контексте потока просто не будет места для регистров. Хотя это врядли... // Добавлено Обдумал немного. Основные вопросы: 1. какой аналог GetThreadContext для Ring0. 2. на каком IRQL работает обработчик исключения. 3. не меняется ли структура контекста в зависимости от наличия/отсутствия SSE.
в TSS контекст не хранится смотря как идет сохранение/восстановление FPU-контекста если посредством fxsave/fxrstor, то место есть, т. к эти инструкции в любом случае оперируют с 512-ти байтной областью памяти, в которой предусмотрено место под XMM регистры если SSE не поддерживается процессором, то это место просто им не используется проверить, использует ли ОС fxsave/fxrstor, можно через CR4.OSFXSR
Это понятно. Вопрос в том что если ОС не использует fxsave, а использует fsave - не меняется ли структура контекста. Ну это я думаю врядли, но всё же. Подскажите где найти структуру контекста и работает ли GetThreadContext из режима ядра.
Относительно простой метод: 1. Делаешь inject в процесс своей DLL 2. Хукаешь VEH 3. Запускаешь. 4. Произошел exception, смотришь какой. 5. Если нужный тебе (попали на SSE комманду), думаешь что с ней делать. Если размер позволяет, меняешь на CALL <твой обработчик>. Если нет - эмулируешь на месте, но будет тормозить :-\ Вариант - если SSE комманды идут "кучкой", то их в своем обработчике пачкой и обрабатываешь - большая вероятность замены на CALL. 6. Обработчик генерится от пропатченой комманды (какие регистры используются, etc) и вызывает generic handler конкретного опкода. Что то типа: ; Тут всякие push'ы для частей опкода (address там, или data) push mod/rm call handleMovSS ret Вобщем, гимморойно, но сделать можно. Edit: Да, thread-safety это отдельная тема.