Pisanie sterownika urządzenia „Hello World” dla jądra 2.6 za pomocą Eclipse

9

Cel

Próbuję napisać prosty sterownik urządzenia na Ubuntu. Chcę to zrobić za pomocą Eclipse (lub lepszego IDE odpowiedniego do programowania sterowników). Oto kod:

#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 );

Mój wysiłek

Po kilku badaniach zdecydowałem się użyć Eclipse CTD do opracowania sterownika (chociaż nadal nie jestem pewien, czy obsługuje narzędzia do debugowania wielowątkowego). Więc ja:

  1. Zainstalowałem Ubuntu 11.04 desktop x86 na maszynie wirtualnej VMWare,
  2. Zainstalowano eclipse-cdti linux-headers-2.6.38-8 za pomocą Synaptic Package Manager,
  3. Utworzono do niego C Projectnazwany TestDriver1i wklejony powyżej powyższy kod,
  4. Zmieniono domyślne polecenie kompilacji makena następujące niestandardowe polecenie kompilacji:

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

Problem

Podczas próby zbudowania tego projektu przy użyciu środowiska Eclipse pojawia się błąd. Oto dziennik kompilacji:

**** Kompilacja konfiguracji Debugowanie dla projektu TestDriver1 ****

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

make: Wpis do katalogu „/usr/src/linux-headers-2.6.38-8-generic”

make: *** Brak reguły, aby cel był vmlinux', needed bywszystkim ”. Zatrzymać.

make: Wyjście z katalogu „/usr/src/linux-headers-2.6.38-8-generic”

Co ciekawe, nie otrzymuję błędu, gdy używam shellzamiast eclipsebudować ten projekt. Aby użyć shell, po prostu utworzę Makefilezawierające obj-m += TestDriver1.oi użyj powyższego makepolecenia, aby zbudować.

Coś musi być nie tak z zaćmieniem Makefile. Może szuka vmlinuxarchitektury (?) Lub czegoś, podczas gdy obecna architektura to x86. Może to z powodu VMWare?

Jak zrozumiałem, eclipseautomatyczne tworzenie plików makefile i modyfikowanie ich ręcznie spowoduje błędy w przyszłości LUB utrudni zarządzanie makefile.

Jak mogę skompilować ten projekt zaćmieniem?

Izaak
źródło

Odpowiedzi:

5

Jestem z tobą prawie w tej samej pozycji. Po tych instrukcjach odniosłem sukces w budowaniu samego jądra i pojedynczego modułu.

Dodałem trzy kroki (40 ~ 42) do głównego artykułu, aby Eclipse skompilował określony sterownik, a nie całe jądro.

  1. Pobierz i zainstaluj Eclipse plus CDT.
  2. Skonfiguruj i skompiluj jądro, aby zdefiniować CONFIG_*i wygenerować autoconf.h. Można to zrobić przed lub po pobraniu i zainstalowaniu Eclipse.
  3. Upewnij się, że masz odpowiednie źródło jądra (np. Upewnij się, że jesteś na właściwej gałęzi git). Jeśli później zajrzysz do innej gałęzi, jest to w porządku, ale będziesz musiał ponownie zaindeksować źródło, a to zajmie około 20 minut.
  4. Uruchom Eclipse.
  5. Kliknij File-> New->C Project
  6. Wpisz nazwę projektu, np my_kernel
  7. Odznacz pole Użyj domyślnej lokalizacji i wpisz katalog główny jądra w polu Lokalizacja.
  8. W okienku Typ projektu: kliknij projekt Makefile i wybierz Opróżnij projekt
  9. Po prawej stronie wybierz Linux GCC
  10. Kliknij Advanced settings..., a pojawi się okno dialogowe Właściwości.
  11. Wybierz Zasób po lewej stronie, a następnie w sekcji Kodowanie pliku tekstowego wybierz Inne, a następnie ISO-8859-1w polu kliknij Zastosuj
  12. Otwórz C/C++ Generalzaznaczenie po lewej stronie.
  13. Kliknij Preprocessor Include Paths
  14. Wybierz GNU Cz listy Języki
  15. Wybierz CDT User Setting Entriesz listy Ustawienia wpisów
  16. Kliknij Add.... Wybierz Plik makr Preprocesora z menu po lewej stronie u góry, Ścieżka projektu z menu po prawej u góry i przejdź include/generated/autoconf.hdo pola tekstowego Plik. (Uwaga: w przypadku starszych jąder [wcześniejszych niż 2.6.36?] Lokalizacja autoconf.hto include/linux/autoconf.h)
  17. Dodaj także wszelkie inne używane pliki makr.
  18. Kliknij Indexer
  19. Zaznacz pole wyboru Włącz rozliczenia specyficzne dla projektu.
  20. Odznacz Pliki źródłowe indeksu nie zawarte w kompilacji
  21. Wyczyść pole Pliki do indeksowania z góry.
  22. Kliknij Ścieżki i symbole po lewej stronie.
  23. Wybierz kartę Zawiera, a następnie wybierz GNU C
  24. Kliknij Add...
  25. Kliknij Workspace..., a następnie wybierz katalog dołączania jądra
  26. Wykonaj kolejne dodawanie, obszar roboczy i dodaj arch/architecture/includenp.arch/powerpc/include
  27. Kliknij # Symbolszakładkę
  28. Kliknij Add...
  29. Ustaw nazwę na __KERNEL__
  30. Ustaw wartość na 1i kliknij OK
  31. Kliknij kartę Lokalizacja źródła
  32. Kliknij twisty dla swojego projektu.
  33. Wybierz element Filtr i kliknij Edytuj filtr ...
  34. Kliknij Dodaj wiele ..., a następnie wybierz wszystkie katalogi arch / * w źródle jądra, które nie będą używane (tj. Wszystkie te, które nie są dla używanej architektury)
  35. Kliknij OK i ponownie OK, aby zamknąć to okno dialogowe.
  36. Kliknij OK w oknie dialogowym Właściwości.
  37. Kliknij przycisk Zakończ w oknie dialogowym Projekt C.
  38. Kliknij projekt prawym przyciskiem myszy i wybierz Indeks, a następnie Przebuduj
  39. Wykonanie zajmie około 20 minut.
  40. Otwórz ustawienia projektu, przejdź do C/C++ build -> Behaviour (tab)
  41. Zaznacz pole Build (Incremental buil)wyboru i dodaj ścieżkę modułu do pola tekstowego (w moim przypadku M=drivers/servo/dynamixel).
  42. Gdy moduł jesteś gotowy i chcesz skompilować jądro, powtórz 41 i wymienić M=..z all.
sorush-r
źródło
1

Jeśli chcesz opracować sterowniki za pomocą Eclipse, musisz to zrobić na odwrót.

Będziesz musiał nadrobić zaległości w automake, autogen, pkg-config itd., Utwórz projekt autotools i zaimportuj go do środowiska eclipse. Eclipse-cdt powinien to zaoferować, w przeciwnym razie nie zainstalowałeś wtyczki „autotools-plugin” (niepewny co do dokładnej nazwy, zapisującej to z pamięci).

Porzuć pomysł, że eclipse-cdt może zarządzać porządnym Makefile, C nie jest Javą, niestety lub na szczęście.

aquaherd
źródło
Dzięki. autotoolsWkrótce sprawdzę wtyczkę. Czy znasz jakieś lepsze IDE do programowania sterowników? Czy myślisz, że ja (leniwy użytkownik VS, który nie ma doświadczenia w Linuksie) mogę zarządzać makefile? Czy makefilenaprawdę można sobie poradzić w dużych projektach?
Izaak
Byłem też leniwym użytkownikiem VS i muszę przyznać, że opanowanie autotools ma stromą krzywą uczenia się, ale jest to bardzo opłacalne, nie tylko dla Linuksa. Eclipse jest jednym z najlepszych dostępnych IDE, ale projekty autotools są tak różnorodne, że żadne IDE nie może przeanalizować wszystkich możliwości. Spróbuj geany, jeśli chcesz to zrobić poprawnie, wypróbuj anjuta i kodelit, jeśli lubisz VS6, ale zawsze bądź biegły w kompilacji wiersza poleceń.
aquaherd
1

Jestem również nowy w programowaniu sterowników dla Linuksa. Odkryłem, że istnieje nowy sposób wdrażania modułów jądra (które nie znajdują się w oficjalnym drzewie Linuksa) o nazwie DKMS. Moduł zostanie zainstalowany jako źródło, a DKMS zajmie się jego kompilacją dla każdego jądra. Oznacza to, że plik Makefile dla modułu zostanie zapisany ręcznie, a jego źródło nie zostanie dołączone do autotools.

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

zaktualizowano ...

DKMS został przeniesiony na http://en.community.dell.com/techcenter/os-applications/w/wiki/2463.linux-projects.aspx

To tutoriale / szybkie wprowadzenie do DKMS (linki z Dell widoku projektu): Linux Journal artykuł , papier Power Solutions , Ottawa Linux Symposium papieru

DKMS służy do szybkiego wdrażania sterowników. Na przykład moduły jądra używające DKMS na moim komputerze 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

To jest kod, który napisałem wcześniej. Może być pomocny jako DKMS Hello World. https://github.com/sneetsher/RTD-DM5408-Driver-Port-for-Linux

user.dz
źródło
1

1> możesz spróbować z tym poleceniem

„make” -> „/ usr / bin / make”

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

2> w katalogu przechowuj swój kod powitalny, nazwa pliku twórczego „Makefile”

obj-m := NameofyourHelloWold.o 

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

PWD   := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
namphamtien
źródło