Написание & ldquo; Hello World & rdquo; Драйвер устройства для ядра 2.6 с использованием Eclipse

Цель

Я пытаюсь написать простой драйвер устройства в Ubuntu. Я хочу сделать это с помощью Eclipse (или лучшей IDE, которая подходит для программирования драйверов). Вот код:

#include <linux/module.h>

static int __init hello_world( void )
{
  printk( "hello world!\n" );
  return 0;
}

static void __exit goodbye_world( void )
{
  printk( "goodbye world!\n" );
}

module_init( hello_world );
module_exit( goodbye_world );

Мои усилия

После некоторых исследований я решил использовать Eclipse CTD для разработки драйвера (хотя я все еще не уверен, если он поддерживает многопоточные инструменты отладки). Итак, я:

  1. Установил Ubuntu 11.04 desktop x86 на виртуальной машине VMWare,
  2. Установил eclipse-cdt и linux-headers-2.6.38 -8 с помощью Synaptic Package Manager,
  3. Создал C Project с именем TestDriver1 и скопировал в него указанный выше код,
  4. Изменил команду сборки по умолчанию, make, к следующей настраиваемой команде сборки:

make -C /lib/modules/2.6.38-8-generic/build M=/home/isaac/workspace/TestDriver1

Проблема

Я получаю сообщение об ошибке при попытке построить этот проект с использованием Eclipse. Вот журнал для сборки:

**** Сборка конфигурации Отладка для проекта TestDriver1 ****

make -C /lib/modules/2.6.38- 8-generic / build M = / home / isaac / workspace / TestDriver1 все

make: вход в каталог '/usr/src/linux-headers-2.6.38-8-generic'

make: *** Нет правила, чтобы сделать цель vmlinux', needed by all '. Стоп.

make: Leaving directory '/usr/src/linux-headers-2.6.38-8-generic'

Интересно, что я не получаю ошибку, когда использую shell вместо [ 118], чтобы построить этот проект. Чтобы использовать shell, я просто создаю Makefile, содержащий obj-m += TestDriver1.o, и использую команду make выше для сборки.

Итак, что-то должно быть не так с затмением Makefile. Может быть, он ищет архитектуру vmlinux (?) Или что-то еще, в то время как текущая архитектура - x86. Может быть, это из-за VMWare?

Как я понял, eclipse автоматически создает make-файлы, а изменение его вручную приведет к ошибкам в будущем ИЛИ затруднит управление makefile.

Итак, как я могу скомпилировать этот проект на Eclipse?

9
задан 1 October 2011 в 04:30

4 ответа

Если вы хотите заняться разработкой драйверов с помощью eclipse, вам придется делать это наоборот.

Вам нужно будет разобраться с automake, autogen, pkg-config и так далее, создать проект autotools и импортировать его в eclipse. Eclipse-cdt должен предложить это, в противном случае вы пропустили установку 'autotools-plugin' (не уверены в точном имени, записывая это по памяти).

Просто откажитесь от идеи, что eclipse-cdt может управлять приличным Makefile, C не является Java, к сожалению или к счастью.

0
ответ дан 1 October 2011 в 04:30

Я тоже новичок в программировании драйверов Linux, я обнаружил, что появился новый способ развертывания модулей ядра (которых нет в официальном дереве Linux), называемый DKMS. Модуль будет установлен как исходный код, и DKMS позаботится о его компиляции для каждого ядра. Это означает, что Makefile для модуля будет написан вручную, а его источник не будет включен для автоинструментов.

http://linux.dell.com/dkms/

обновлено ...

DKMS переехал на http://en.community.dell.com/techcenter/os-applications/w/wiki/2463.linux-projects.aspx

Это учебные пособия / краткое введение в DKMS (ссылки со страницы проекта Dell): статья в Linux Journal , статья Power Solutions , документ Ottawa Linux Symposium

DKMS используется для быстрого развертывания драйвера. Например, модули ядра, использующие DKMS на моем компьютере с Ubuntu:

dkms status

bcmwl, 6.20.155.1+bdcom, 3.5.0-41-generic, x86_64: installed
bcmwl, 6.20.155.1+bdcom, 3.5.0-42-generic, x86_64: installed
bcmwl, 6.20.155.1+bdcom, 3.5.0-43-generic, x86_64: installed
nvidia, 313.26, 3.5.0-42-generic, x86_64: installed
nvidia, 313.26, 3.5.0-43-generic, x86_64: installed
vboxhost, 4.3.0, 3.5.0-42-generic, x86_64: installed
vboxhost, 4.3.0, 3.5.0-43-generic, x86_64: installed

Это код, который я написал ранее. Он может быть полезен как DKMS Hello World. https://github.com/sneetsher/RTD-DM5408-Driver-Port-for-Linux [+1113]

0
ответ дан 1 October 2011 в 04:30

1> вы можете попробовать с помощью этой команды

«make» -> «/ usr / bin / make»

/usr/bin/make -C /lib/modules/2.6.38-8-generic/build M=/home/isaac/workspace/TestDriver1

2> в каталоге сохранить ваш приветственный код слова, имя создаваемого файла "Makefile"

obj-m := NameofyourHelloWold.o 

KDIR  := /lib/modules/2.6.38-8-generic/build

PWD   := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
0
ответ дан 1 October 2011 в 04:30
1175 Я нахожусь с вами почти в одном положении. После этой сборки у меня был успех при сборке самого ядра и одного модуля.

Я добавил три шага (40 ~ 42) в основную статью, чтобы Eclipse компилировал определенный драйвер, а не целое ядро.

  1. Загрузите и установите Eclipse плюс CDT.
  2. Сконфигурируйте и соберите ваше ядро, чтобы определить CONFIG_* и сгенерировать autoconf.h. Это можно сделать до или после загрузки и установки Eclipse.
  3. Убедитесь, что у вас правильный источник ядра (например, убедитесь, что вы находитесь в правой ветке git). Если вы проверите другую ветку позже, это нормально, но вам нужно будет переиндексировать источник, и это займет около 20 минут.
  4. Запустите Eclipse.
  5. Нажмите File -> New -> C Project
  6. Заполните имя проекта, например my_kernel
  7. Снимите флажок Использовать расположение по умолчанию и введите в корневой каталог вашего ядра в поле Location.
  8. В панели «Тип проекта»: щелкните проект Makefile и выберите «Пустой проект»
  9. . В правой части выберите Linux GCC
  10. Нажмите Advanced settings ... и откройте диалоговое окно «Свойства». появится.
  11. Выберите «Ресурс» слева, а затем в разделе «Кодировка текстового файла» выберите «Другое» и «118» в поле, затем нажмите «Применить»
  12. . Откройте выбор C/C++ General слева.
  13. Нажмите Preprocessor Include Paths
  14. . Выберите GNU C в списке языков
  15. . Выберите CDT User Setting Entries в списке настроек
  16. . Нажмите Add .. .. Выберите Файл макроса препроцессора в верхнем левом раскрывающемся меню, Путь к проекту в верхнем правом раскрывающемся списке и введите include/generated/autoconf.h в текстовое поле Файл. (Примечание: для более старых ядер [до 2.6.36?] Расположение autoconf.h равно include/linux/autoconf.h)
  17. Также добавьте любые другие файлы макросов, которые вы используете.
  18. Нажмите на индексатор
  19. Поставьте галочку в поле Включить расчеты для конкретного проекта.
  20. Снимите отметку с исходных файлов индекса, не включенных в сборку
  21. Очистите окно «Файлы для индексации».
  22. Нажмите на Пути и Символы слева.
  23. Выберите вкладку «Включения», затем выберите GNU C
  24. Нажмите Add ...
  25. Нажмите Workspace ... затем выберите каталог включения вашего ядра
  26. Сделайте еще один Добавить, Рабочее пространство и добавьте arch/architecture/include, например, arch/powerpc/include
  27. Перейдите на вкладку # Symbols
  28. Нажмите Add ...
  29. Установите имя __KERNEL__
  30. . Установите значение 1 и нажмите «ОК».
  31. Перейдите на вкладку «Местоположение источника»
  32. . Выберите поворот для вашего проекта.
  33. Выберите элемент «Фильтр» и нажмите «Редактировать фильтр ...»
  34. Нажмите «Добавить несколько», а затем выберите все каталоги arch / * в исходном коде ядра, которые не будут использоваться (т. Е. Все не для используемой вами архитектуры)
  35. Нажмите ОК и снова ОК, чтобы закрыть этот диалог.
  36. Нажмите «ОК» в диалоговом окне «Свойства».
  37. Нажмите Finish в диалоговом окне C Project.
  38. Щелкните правой кнопкой мыши по проекту и выберите «Индекс», затем выберите «Перестроить»
  39. . Для завершения потребуется около 20 минут.
  40. Откройте настройки проекта, перейдите к C/C++ build -> Behaviour (tab)
  41. Установите флажок Build (Incremental buil) и добавьте путь к модулю в текстовое поле (в моем случае M=drivers/servo/dynamixel).
  42. Когда ваш модуль готов и вы хотите скомпилировать ядро, повторите 41 и замените M=.. на all. ​​
0
ответ дан 1 October 2011 в 04:30

Другие вопросы по тегам:

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