Вопрос по – Сборка модулей ядра для разных версий Linux

7

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

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

  • other approach is to get the source for that specific kernel, but again problem is same source for patched kernel is not available ( its not necessary to get sources of linux-kernel-3.0.0-10 or even linux-kernel-3.0.0 and 10th patch). In some situation it is possible to get source of running kernel, but not always possible.

  • another is to build kernel other than the running kernel and place built kernel in the machine. But it requires to build the modules of that kernel that is time-consuming and space-consuming process.

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

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

Ваш Ответ

3   ответа
6

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

building kernel building modules and firmware building headers Moving all of above things in appropriate location (if your machine is not same on which you are going to develop module)

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

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

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

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

После перейдите к исходному коду модуля - & gt; Моя команда: make -C / androidsourcecode / common M = 'aw; pwd & apos; modules -------- Ошибка :::::::::::: ВНИМАНИЕ: отсутствует дамп версии символа /androidsourcecode/common/Module.symvers; Модули не будут иметь зависимостей и модификаций .-------- scripts / Makefile.build: 44 / androidsourcecode / common / pwd / Makefile: нет такого файла или каталога
-5

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

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

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

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

говоря о символах? К вашему сведению, я собираюсь провести все эти эксперименты внутри виртуальной машины, поэтому моя машина не беспокоится о панике ядра и об ошибках. :-) peeyush
Я также ищу такой способ: «Выключив определенную конфигурацию», так как без этого я не смогу узнать, что же такого опасного. Так что вы можете поделиться деталями peeyush
Это действительно маловероятно, чтобы паника ядра или случайные зависания действительно повредили ваш компьютер. Это тот факт, что ваш linux падает, что является проблемой. У меня есть вопрос, у вас есть это исправленное ядро или нет? Если да, то почему бы вам просто не использовать это? Если нет, то как вы собираетесь протестировать загрузку модуля на нем?
Если вы заинтересованы в знании опасности, вот она. Если определенная константа в ядре меняет значение, когда вы используете эту константу в другом ядре, функция может сделать что-то другое. Хуже того, если сигнатура функции изменяется, они ожидают в стеке аргументов, отличных от того, что ставит ваш код. Это означает, что запись по всему стеку, случайные адреса возврата и полная катастрофа. Также может случиться, что функция в одной версии выполняет определенное необходимое действие, которое в другой версии выполняет ее где-то еще. Ваш код будет не хватать этой функциональности и снова катастрофы.
Похоже, ты пытаешься обмануть меня, дав мне простой ответ, потому что ты действительно не заботишься об опасности. Ну, я, например, отказываюсь учить тебя чему-то плохому.
2

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

download the kernel-devel related to the image that you are running. It should have version as close as possible. Check that the functions you are using in the module are mapped with the header files you have in the kernel-devel. change the include/generated/utsrelease.h file for UTS_RELEASE value. change it to the version of kernel image running on your HW. Compile the module using this kernel tree. Now you can insert your module inside kernel.

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

Похожие вопросы