Написание драйвера устройства «Hello World» для ядра 2.6 с использованием Eclipse


9

Цель

Я пытаюсь написать простой драйвер устройства на 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. Вот журнал для сборки:

**** Сборка конфигурации 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?

Ответы:


5

Я почти в той же позиции, что и ты. После этого я успешно собрал само ядро ​​и один модуль.

Я добавил три шага (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

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

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

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


Спасибо. Я скоро проверю autotoolsплагин. Знаете ли вы лучше IDE для программирования драйверов? Как вы думаете, я (ленивый пользователь VS, не имеющий опыта в Linux), могу управлять makefile? Действительно ли makefileэто возможно в больших проектах?
Исаак

Я тоже был ленивым пользователем VS, и я должен признать, что освоение автоинструментов имеет крутую кривую обучения, но это очень полезно, не только для Linux. Eclipse - одна из лучших IDE, но проекты autotools настолько разнообразны, что ни одна IDE не может проанализировать все возможности. Попробуйте geany, если вы хотите сделать это правильно, попробуйте anjuta и codelite, если вам понравился VS6, но всегда хорошо разбирайтесь в компиляции из командной строки.
Аквахард

1

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

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


1

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.