внешние модули драйвера ядра не собираются полностью - PullRequest
3 голосов
/ 18 октября 2011

Я добавляю модуль внешнего драйвера в ядро ​​Android Gingerbread (работает аналогично Linux).Я делал это раньше, и это сработало, но на этот раз у меня проблема.Я следую рецепту, найденному в O'Reilly «Драйверы устройств Linux 3-е издание», а именно:

в локальном Makefile, вы добавляете следующие операторы:

   obj-m := GobiNet.o  
   GobiNet-objs :=  GobiUSBNet.o QMIDevice.o QMI.o  

На человеческом языке это означает построить мне GobiNet.ko из GobiUSBNet.c + QMIDevice.c + QMI.c.

Это для случая, когда make-файл вызывается при сборке всего ядра.Я кросс-компилирую на Ubuntu x86-64bit для системы ARM-EABI (Cortex-A8).

Каким-то образом система сборки понимает, что я хочу, так как она говорит во время компиляции:

/home/sylvain/Projects/android_gingerbread_realv210_ver_1_0/kernel  
   CHK     include/linux/version.h  
   CHK     include/generated/utsrelease.h  
make[1]: `include/generated/mach-types.h' is up to date.  
   CALL    scripts/checksyscalls.sh  
   CHK     include/generated/compile.h  
   LD      drivers/cell/OptionGobiNet/built-in.o  
   CC [M]  drivers/cell/OptionGobiNet/GobiUSBNet.o  
   CC [M]  drivers/cell/OptionGobiNet/QMIDevice.o  
   CC [M]  drivers/cell/OptionGobiNet/QMI.o  
   LD [M]  drivers/cell/OptionGobiNet/GobiNet.o  
   Kernel: arch/arm/boot/Image is ready  
   SHIPPED arch/arm/boot/compressed/lib1funcs.S  
   AS      arch/arm/boot/compressed/lib1funcs.o  
   LD      arch/arm/boot/compressed/vmlinux  
   OBJCOPY arch/arm/boot/zImage  
   Kernel: arch/arm/boot/zImage is ready       
   Building modules, stage 2.  
   MODPOST 5 modules  
ERROR: "usbnet_suspend" [drivers/cell/OptionGobiNet/GobiNet.ko] undefined!  
ERROR: "usbnet_resume" [drivers/cell/OptionGobiNet/GobiNet.ko] undefined!  
ERROR: "usbnet_disconnect" [drivers/cell/OptionGobiNet/GobiNet.ko] undefined!  
ERROR: "usbnet_probe" [drivers/cell/OptionGobiNet/GobiNet.ko] undefined!  
make[1]: *** [__modpost] Error 1  
make: *** [modules] Error 2   

Она также генерирует типичный "GobiNet.mod.c" и«GobiNet.o», который генерируется, когда вы хотите, чтобы драйвер был модулем, но он не дополняется «GobiNet.ko», как я ожидал.Я запустил "find -name * .ko" в домашнем каталоге, а "GobiNet.ko" нигде не нашел, но нашел.

Я также посмотрел на WEB и в ядре / Documentation / kbuild / *. Txt.Существует около 3 способов сделать это.Я выбрал описанную выше, потому что все переменные окружения установлены в верхнем скрипте сборки, и я не компилирую нативный, но я кросс-компилирую.В любом случае, другие ".ko" в дереве ядра генерируются, поэтому сценарий сборки должен быть хорош для генерации модулей ".ko".

Есть идеи, что заставляет этот процесс запускаться, а не заканчиваться файлом ".ko"?

1 Ответ

5 голосов
/ 19 октября 2011

Я нашел решение.Я действительно неправильно понял сообщения об ошибках и то, как модули ".ko" взаимодействуют с ядром.Внешний модуль разрешает внешние компоненты (по крайней мере, некоторые) во время компиляции / компоновки, а не во время выполнения.Вот почему я получаю 4 "ОШИБКИ".

Тем не менее, мой "GobiNet" ищет внешние символы, которых нет в моей настройке ядра.Несколько быстрых запросов позволили мне найти нужные «drivers / net / usb / usbnet.c».Для этого необходимо установить CONFIG_USBNET = y в файле «.config» (задается через «make xconfig»).Надеюсь, что это может помочь кому-то еще.

РЕДАКТИРОВАТЬ: Чтобы ответить на вопрос о "несколько быстрых greps".Я имел в виду, что я ищу все исходные файлы, содержащие пропущенные имена.Он скажет мне, какой файл определяет этот символ.Затем я могу найти, какая переменная должна быть установлена ​​в «y», чтобы включить ее в компиляцию.Вот пример:

grep -r --include="*.c" "usbnet_probe"

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

...