Написання драйвера пристрою “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 настільний x86 на віртуальній машині VMWare,
  2. Встановлено eclipse-cdtта linux-заголовки-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 / робоча область / TestDriver1 все

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створення файлів автоматично, а їх зміна вручну може спричинити помилки в майбутньому АБО ускладнити управління makefile.

Отже, як я можу скласти цей проект на затемнення?

Відповіді:


5

Я майже в одному становищі з вами. Після цієї інструкції я мав успіх у створенні самого ядра та єдиного модуля.

Я додав три етапи (40 ~ 42) до основної статті, щоб змусити Eclipse компілювати конкретний драйвер, а не ціле ядро.

  1. Завантажте та встановіть Eclipse плюс CDT.
  2. Налаштування та побудова ядра для визначення CONFIG_*та створення autoconf.h. Це можна зробити до або після завантаження та встановлення Eclipse.
  3. Переконайтеся, що у вас є правильне джерело ядра (наприклад, переконайтеся, що ви знаходитесь у правій гітці git). Якщо ви переглянете іншу гілку пізніше, це нормально, але вам потрібно буде переіндексувати джерело, і це займе близько 20 хвилин.
  4. Запустіть затемнення.
  5. Клацніть File-> New->C Project
  6. Заповніть назву проекту, як my_kernel
  7. Зніміть прапорець Використовувати місце розташування за замовчуванням і введіть у кореневий каталог вашого ядра в поле Location.
  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. Клацніть Додати декілька ..., а потім виберіть усі каталоги arch / * у вашому джерелі ядра, які не будуть використовуватися (тобто всі ті, які не стосуються архітектури, яку ви використовуєте)
  35. Клацніть OK і OK ще раз, щоб закрити діалогове вікно.
  36. Клацніть OK у діалоговому вікні "Властивості".
  37. Клацніть Готово в діалоговому вікні проекту C.
  38. Клацніть правою кнопкою миші на проект і виберіть «Індекс», а потім виберіть «Перебудувати»
  39. Це займе близько 20 хвилин або близько того.
  40. Відкрийте налаштування свого проекту, перейдіть до C/C++ build -> Behaviour (tab)
  41. Поставте Build (Incremental buil)прапорець і додайте шлях свого модуля до текстового поля (у моєму випадку M=drivers/servo/dynamixel).
  42. Коли модуль готовий і ви хочете скласти ядро, повторіть 41 і замініть M=..на all.

1

Якщо ви хочете займатися розробкою драйверів із затемненням, вам доведеться робити це навпаки.

Вам потрібно буде наздогнати автоматичне, autogen, pkg-config та ін., Створити проект autotools та імпортувати його у затемнення. Eclipse-cdt повинен запропонувати це, інакше ви пропустили встановити "autotools-plugin" (не впевнений у точному імені, записуючи це з пам'яті).

Просто відмовтеся від думки, що eclipse-cdt може керувати гідним Makefile, C - це не Java, на жаль чи на щастя.


Дякую. Я незабаром перевірю autotoolsплагін. Чи знаєте ви якісь кращі IDE для програмування драйверів? Як ви думаєте, я (ледачий користувач VS, який не має досвіду роботи з Linux), можу керувати makefile? Чи makefileсправді керований у великих проектах?
Ісаак

Я теж був ледачим користувачем VS, і я повинен визнати, що в оволодінні автоінструментами є крута крива навчання, але це дуже варто, не тільки для Linux. Eclipse - один з найкращих IDE навколо, але проекти автоінструментів настільки різноманітні, що жоден IDE не може проаналізувати всі можливості. Спробуйте geany, якщо ви хочете зробити це правильно, спробуйте anjuta та codelite, якщо вам сподобався VS6, але завжди будьте досвідченим у складанні командного рядка.
aquaherd

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.