Реализация расширений ЦП в модуле ядра
-
26-09-2019 - |
Вопрос
Я ищу информацию, относящуюся к реализации определенных расширений ЦП в модуле ядра. Я нашел что-то связанное: 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) или перекомпилировать объект, чтобы он не использовал их.