Написание драйвера устройства "Hello World" для ядра 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 и http://packages.ubuntu.com/linux-headers-2.6.38-8 с использованием диспетчера пакетов Synaptic,
  3. Создано C Project названный TestDriver1 и скопировать в него приведенный выше код,
  4. Изменена команда сборки по умолчанию, make, к следующей настроенной команде сборки:

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

Эта проблема

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

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

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

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

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

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

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

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

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

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

4 ответа

Решение

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

Я добавил три шага (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. Снимите флажок Использовать расположение по умолчанию и введите корневой каталог вашего ядра в поле Расположение.
  8. В панели Тип проекта: щелкните проект Makefile и выберите Пустой проект.
  9. На правой стороне выберите Linux GCC
  10. Нажмите Advanced settings... и появится диалоговое окно свойств.
  11. Выберите "Ресурс" слева, а затем в разделе "Кодировка текстового файла" выберите "Другой" и ISO-8859-1 в поле, затем нажмите Применить
  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. Нажмите Add Multiple... и затем выберите все каталоги arch/* в исходном коде вашего ядра, которые не будут использоваться (т.е. все, которые не для используемой вами архитектуры)
  35. Нажмите OK и снова OK, чтобы закрыть это диалоговое окно.
  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,

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

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

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

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

Я тоже новичок в программировании драйверов 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, статья о 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

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