2012-06-02 4 views
6

Я новичок в написании модулей ядра, поэтому сталкиваюсь с несколькими нетехническими проблемами.
Создание модулей ядра для разных версий Linux

Поскольку для создания модуля ядра для конкретной версии ядра (например, 3.0.0-10, 10 является номером патча) требуется одинаковые заголовки ядра, поэтому он выглядит прямо, чтобы установить заголовки ядра и начать разработку там. Но заголовки ядра для исправленной версии ядра недоступны. Поскольку у меня есть гостевое ядро ​​vmlinuz-3.0.0-10, работающее на машине, и после загрузки заголовков ядра это говорит, что не найден.

  • другой подход, чтобы получить источник для этого конкретного ядра, но опять-таки проблема в том же источник для ядра не доступен (его не нужно, чтобы получить источники Linux-ядра-3.0.0-10 или даже linux-kernel-3.0.0 и 10-й патч). В некоторой ситуации можно получить источник запущенного ядра, но не всегда это возможно.

  • другой - это создание ядра, отличного от работающего ядра, и помещение встроенного ядра в машину. Но для этого требуется, чтобы модули этого ядра занимали много времени и занимали много места.

Поэтому намерение просить об этом - узнать, какие предпочтения разработчиков драйверов ядра. Существуют ли другие альтернативы?

Можно ли скомпилировать модуль ядра в одной версии и работать в другой версии (хотя это будет давать ошибку, но есть ли обходной путь для этого?)

ответ

6

Таким образом, построить новое ядро, не является хорошим вариантом, поскольку это потребует:

  • здания ядра
  • строительных модулей и прошивок
  • строительных заголовков Перемещения всех вышеперечисленных вещей в соответствующем месте (если ваш аппарат не тот, на котором вы собираетесь разрабатывать модуль)

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

make -C /lib/modules/kernel-headers-x.y.z/build M=`pwd` modules 

и ваш модуль будет готов.

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

+0

После перехода к исходному коду модуля -> Моя команда: make -C/androidsourcecode/common M = 'pwd' modules -------- Ошибка :::::::::::: ПРЕДУПРЕЖДЕНИЕ: отсутствует версия dump dump /androidsourcecode/common/Module.symvers; модули не будут иметь никаких зависимостей и модификаций ./ scripts/Makefile.build: 44/androidsourcecode/common/pwd/Makefile: нет такого файла или каталога –

-3

Существует способ построения модуля на одно ядро ​​и вставить его в другое. Это отключает определенную конфигурацию. Я не говорю вам, какая именно конфигурация, потому что это АБСОЛЮТНО ОПАСНО. Причина в том, что между ядрами могут быть изменения, которые могут привести к тому, что ваш модуль будет вести себя по-разному, часто приводя к полному замораживанию.

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

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

Короче говоря, я настоятельно рекомендую вам создать ядро, которое вас интересует.

+3

Я также искал этот путь «Это, отключив определенную конфигурацию», так как без этого я не смогу узнать, что так опасно. Так что вы можете делиться деталями. – peeyush

+0

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

+0

Если вы заинтересованы в знании опасности, вот оно. Если определенная константа в ядре меняет значение, когда вы используете эту константу в другом ядре, функция может делать другую вещь. Хуже того, если сигнатура функции изменяется, они ожидают разные аргументы в стеке, чем ваш код. Это означает запись по всему стеку, случайные обратные адреса и полное бедствие. Также может случиться так, что функция в одной версии выполняет определенное необходимое действие, которое в другом делает это где-то в другом месте. Ваш код пропустит эту функциональность и снова, катастрофу. – Shahbaz

2

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

  1. скачайте файл kernel-devel, связанный с изображением, которое вы используете. Он должен иметь версию как можно ближе.
  2. Убедитесь, что функции, которые вы используете в модуле, сопоставляются с файлами заголовков, которые у вас есть в kernel-devel.
  3. изменить включить/сгенерировал/utsrelease.h файл для значения UTS_RELEASE. измените его на версию образа ядра, запущенную на вашем HW.
  4. Скомпилируйте модуль, используя это дерево ядра.
  5. Теперь вы можете вставить свой модуль внутри ядра.

Примечание: Это может привести к нежелательным событиям, которые произошли, как упоминалось выше Шахбаз. Но если вы делаете это только для экспериментов, я думаю, что это хорошо. :)

Смежные вопросы