2013-08-07 5 views
5

У меня есть простой объект ядра, который я создал для проверки в памяти ядра.Linux Kernel Module (* .ko) совместимость между ядрами

Если я построю его на своей 64-битной машине Ubuntu (3.2), он отлично работает на этой машине. Но это не будет insmod на моей 64-битной машине Ubuntu (3.9). И наоборот. Это дает мне ошибку «-1 Недопустимый модуль», если я пытаюсь запустить ее на Kernel rev, отличном от того, на котором я его построил.

Я думал, что insmod динамически связывает его с экспортируемой таблицей символов, а экспортированная таблица символов не изменяется между версиями ядра. (Он добавляется.)

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

Вот мой макияж файла:

ccflags-у = -g

OBJ-м + = access_mem.o

всего: делают -C/Библиотека/модули/$ (uname оболочки -r)/построить M = $ (PWD) модули

чистый: делают -C/Библиотека/модули/$ (uname -r оболочки)/построить M = $ (PWD) чистые

+0

Ваш Ubuntu 3.2 - это 32-битная или 64-битная версия? Тот же вопрос с вашим Ubuntu 3.9 – nouney

+0

Оба 64-битных. Thx, чтобы напомнить мне об этой важной точке данных. –

ответ

5

Joe, Ubuntu (3.2), возможно, используя версию ядра x.y.z, но Ubuntu (3.9), возможно, использует версию ядра x.y.z1. Если версии ядра отличаются друг от друга, вам необходимо собрать/скомпилировать ваш драйвер с этой конкретной версией ядра. Если версии ядра одинаковы, вам не нужно создавать драйвер. Важным моментом является то, что каждый модуль драйвера скомпилирован или построен с помощью модуля version.ko (который фактически вводит информацию о версии ядра, построенной с помощью модуля драйвера), а при загрузке модуля ядра он проверяет эту информацию и версию ядра, если отличается затем выбрасывает «-1 Неверный формат модуля» или, если он совпадает, модуль ядра загружается успешно. Чтобы разработать модуль ядра, который является будущим или обратно совместимым, вам нужно знать, на какой версии ядра была изменена подпись API или функций для ex: подпись ioctl изменена с версии ядра 2.3.36 и далее, поэтому ваш код должен быть ниже

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36) 
static long minor_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 
#else 
static int minor_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, 
                   unsigned long arg) 
#endif 

Если вы разработали таким образом, то ваш модуль ядра будет совместим с будущим или обратно. Совместимость - это только адаптация подписи API или функций и т. Д. Изменений для версии ядра, сохраняя более старую подпись API или подпись функции и т. Д. В вашем модуле ядра, как в приведенном выше примере, но все же вам нужно собрать/скомпилировать модуль ядра против версии ядра, на которую вы пытаетесь загрузить.

+0

Когда я писал «(3.2)» и «(3.9)« Я имел в виду «с ядром версии 3.2» и «с ядром версии 3.9», поэтому да thx. –

+0

В этом случае «insmod» действительно просто для разработчиков. Он никогда не предназначался для того, чтобы использоваться для вставки предварительно построенных двоичных модулей, которые были распределены от компании A непосредственно до существующего образа Linux конечного пользователя B. Согласовано? –

+0

Joe, insmod - это просто утилита для вставки предварительно построенного двоичного кода. Я думаю, что insmod достаточно умен, чтобы проверить зависимость версии. Если совпадение загружает или выдает ошибку. http://tuxthink.blogspot.in/2010/09/insmod-explained.html –

1

Я не xpert на эту тему, но я уверен, что вы должны создать свой драйвер для каждой версии ядра. Что касается символов, которые остаются неизменными между версиями ядра, я вполне уверен, что это не так после чтения https://www.kernel.org/doc/Documentation/stable_api_nonsense.txt.

+0

В этом случае «insmod» действительно просто для разработчиков. Он никогда не предназначался для того, чтобы использоваться для вставки предварительно построенных двоичных модулей, которые были распределены от компании A непосредственно до существующего образа Linux конечного пользователя B. Согласовано? –

+0

Я уверен, что вы можете принудительно загружать модули в ядро, т. Е. Модули, построенные для 3.9.10, могут принудительно загрузить в 3.10.4. – dklt

+0

Принудительная загрузка небезопасна; это может привести к краху вашей системы или, что еще хуже. – Michael

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