Реализация расширений ЦП в модуле ядра - PullRequest
2 голосов
/ 06 августа 2010

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

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

Ответы [ 4 ]

2 голосов
/ 17 февраля 2013

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

2 голосов
/ 06 августа 2010

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

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

1 голос
/ 17 ноября 2010

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

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

1 голос
/ 06 августа 2010

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

...