Реализация расширений ЦП в модуле ядра

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

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

4 ответа

Решение

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

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

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

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

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

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

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

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