Вопрос

Я ищу информацию, относящуюся к реализации определенных расширений ЦП в модуле ядра. Я нашел что-то связанное: http://www.mirrors.docunext.com/lxr/http/source/arch/mips/kernel/unaligned.c. На самом деле, это единственный исходный код, который я могу найти, это даже близко.

По сути, у меня есть бинарный общий объект, построенный с определенными расширениями CPU, которые мне нужно для запуска на несколько более старого процессора, который имеет большую часть набора инструкций, но не причудливые новые материалы. Да, я знаю, что это будет довольно медленно, но это лучше, чем разбиться с SiGills.

Это было полезно?

Решение 4

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

Если я понимаю модули ядра справа, там не похоже, что будет проблемой для поддержки подключаемой эмуляции.

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

Я думаю, что вы можете сделать это в пользовательском языке. Установите обработчик для SIGILL с участием sigaction() и указать SA_SIGINFO. Отказ Поле si_code в siginfo_t позволяет отличить между несколькими причинами SIGILL. Отказ Например, пытаясь эмулировать инструкцию, когда сигнал пришел из kill() не имеет смысла. Третий аргумент к обработчику указывает на структуру, содержащую контекст CPU во время неисправности (см. Документацию). Возможно, вы можете изменить это и вернуть из обработчика сигнала, изменения вступают в силу; Если это не работает, попробуйте setcontext().

Очевидно, что это будет немного менее эффективно, чем делать это в ядре, но чище и безопаснее.

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

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

Я не думаю, что вы можете решить эту проблему с помощью модуля ядра. Я думаю, что вам нужно запускать это в VM, который позволяет пропустить инструкции (я бы попробую использовать XEN) или перекомпилировать объект, чтобы он не использовал их.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top