Eclipse kullanarak çekirdek 2.6 için “Hello World” Aygıt Sürücüsü yazma


9

Hedef

Ubuntu'da basit bir aygıt sürücüsü yazmaya çalışıyorum. Bunu Eclipse (veya sürücü programlama için uygun daha iyi bir IDE) kullanarak yapmak istiyorum. İşte 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 );

Benim gayretim

Bazı araştırmalardan sonra , sürücüyü geliştirmek için Eclipse CTD kullanmaya karar verdim (yine de çok iş parçacıklı hata ayıklama araçlarını destekleyip desteklemediğinden emin değilim). Yani ben:

  1. Yüklü Ubuntu 11.04 masaüstü x86 VMWare sanal makine üzerinde,
  2. Yüklü eclipse-cdtve linux-headers-2.6.38-8 Synaptic Paket Yöneticisi kullanarak,
  3. Üzerine C Projectadlandırılmış TestDriver1ve kopyalanmış bir kod oluşturduysa,
  4. Varsayılan derleme komutu, makeaşağıdaki özelleştirilmiş derleme komutuyla değiştirildi:

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

Sorun

Tutulmayı kullanarak bu projeyi oluşturmaya çalıştığımda bir hata alıyorum. Yapı günlüğü:

**** TestDriver1 projesi için hata ayıklama yapılandırma yapısı ****

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

make: '/usr/src/linux-headers-2.6.38-8-generic' dizinini girme

make: *** Hedefi yapmak için kural yok vmlinux', needed by'. Dur.

make: '/usr/src/linux-headers-2.6.38-8-generic' dizini bırakılıyor

İlginç bir şekilde, bu projeyi oluşturmak shellyerine kullandığımda hata eclipsealmıyorum. Kullanmak için shell, sadece bir Makefileiçeren oluşturmak obj-m += TestDriver1.ove oluşturmak için yukarıdaki makekomutu kullanın.

Bu nedenle, tutulma ile ilgili bir şeyler yanlış olmalı Makefile. Belki vmlinuxşu anki mimari x86 iken mimariyi (?) Falan arıyor . Belki de VMWare yüzünden?

Anladığım kadarıyla, eclipseotomatik olarak makefiles oluşturur ve manuel olarak değiştirmek gelecekte hatalara neden olur VEYA yönetimi makefilezorlaştırır.

Peki, tutulma üzerine bu projeyi nasıl derleyebilirim?

Yanıtlar:


5

Seninle neredeyse aynı pozisyondayım. Bu gelişmeleri takiben , çekirdeğin kendisini ve tek bir modülü oluşturmayı başardım.

Eclipse'in tüm çekirdeği değil, belirli bir sürücüyü derlemesini sağlamak için ana makaleye üç adım (40 ~ 42) ekledim.

  1. Eclipse plus CDT'yi indirip yükleyin.
  2. Tanımlamak ve oluşturmak için çekirdeğinizi yapılandırın ve CONFIG_*oluşturun autoconf.h. Bu, Eclipse'i indirip yüklemeden önce veya sonra yapılabilir.
  3. Doğru çekirdek kaynağına sahip olduğunuzdan emin olun (örn. Sağ git dalında olduğunuzdan emin olun). Daha sonra başka bir şubeye bakarsanız sorun olmaz, ancak kaynağı yeniden endekslemeniz gerekir ve bu işlem yaklaşık 20 dakika sürer.
  4. Eclipse'i başlatın.
  5. Tıklayın File-> New->C Project
  6. Gibi bir proje adı girin my_kernel
  7. Varsayılan konumu kullan kutusunun işaretini kaldırın ve Konum kutusuna çekirdeğinizin kök dizinini yazın.
  8. Proje türü: bölmesinde, Makefile projesini tıklatın ve Projeyi Boşalt'ı seçin.
  9. Sağ tarafta şunu seçin: Linux GCC
  10. Advanced settings... düğmesini tıkladığınızda Özellikler iletişim kutusu açılır.
  11. Soldan Kaynak'ı seçin ve ardından Metin dosyası kodlama bölümünde Diğer'i seçin ve ISO-8859-1kutuda Uygula'yı tıklayın.
  12. C/C++ GeneralSoldaki seçimi açın .
  13. Tıklamak Preprocessor Include Paths
  14. Seç GNU CDiller listesinde
  15. Seç CDT User Setting EntriesAyar Girişler listesinde
  16. Tıklayın Add... Sol üst açılır menüden Önişlemci Makroları Dosyası, sağ üst açılır menüden Proje Yolu'nu seçin ve include/generated/autoconf.hDosya metin kutusuna girin . (Not: eski çekirdekler [? Ön 2.6.36] için, yer autoconf.holan include/linux/autoconf.h)
  17. Ayrıca kullandığınız diğer makro dosyalarını da ekleyin.
  18. Dizin Oluşturucu'yu tıklayın
  19. Projeye özgü ayarları etkinleştir kutusunu işaretleyin.
  20. Derlemeye dahil olmayan Dizin kaynak dosyalarının işaretini kaldırın
  21. Ön dizine eklenecek dosyalar kutusunu temizleyin.
  22. Soldaki Yollar ve Simgeler'i tıklayın.
  23. İçerir sekmesini seçin ve ardından GNU C
  24. Tıklayın Add...
  25. Tıklayın Workspace... sonra çekirdeğinizin içerdiği dizini seçin
  26. Başka bir Ekle, Çalışma Alanı yapın ve ekleyin arch/architecture/include, örn.arch/powerpc/include
  27. Click # Symbolssekmesini
  28. Tıklayın Add...
  29. Adı şu şekilde ayarlayın: __KERNEL__
  30. Değeri olarak ayarlayın 1ve Tamam'ı tıklayın.
  31. Kaynak Konum sekmesini tıklayın
  32. Projenizin bükülmesini tıklayın.
  33. Filtre öğesini seçin ve Filtreyi Düzenle ... seçeneğini tıklayın.
  34. Birden Çok Ekle ... 'yi tıklayın ve ardından çekirdek kaynağınızda kullanılmayacak tüm arch / * dizinlerini seçin (yani kullandığınız mimari için olmayanlar)
  35. Bu iletişim kutusunu kapatmak için Tamam'ı ve tekrar Tamam'ı tıklayın.
  36. Özellikler iletişim kutusunda Tamam'ı tıklatın.
  37. C Projesi iletişim kutusunda Son'a tıklayın.
  38. Projeye sağ tıklayın ve Dizin'i seçin, ardından Yeniden Oluştur'u seçin
  39. Tamamlanması yaklaşık 20 dakika sürecektir.
  40. Proje ayarınızı açın, C/C++ build -> Behaviour (tab)
  41. Kontrol Build (Incremental buil)kutusunu ve (benim durumumda metin için modül yolunu eklemek M=drivers/servo/dynamixel).
  42. Sen modül hazırdır ve sen çekirdek derlemek 41 tekrarlamak ve değiştirmek istediğinizde M=..ile all.

1

Tutulma ile sürücü geliştirme yapmak istiyorsanız, bunu başka bir şekilde yapmanız gerekir.

Automake, autogen, pkg-config ve benzeri şeyleri yakalamanız, bir autotools projesi oluşturmanız ve tutulması içine almanız gerekir. Eclipse-cdt bunu sunmalıdır, aksi takdirde 'autotools-plugin' 'i yüklemeyi kaçırırsınız (tam addan emin değilseniz, bunu bellekten yazabilirsiniz).

Tutulma-cdt'ın iyi bir Makefile'yi yönetebileceği fikrinden vazgeç, C, ne yazık ki ya da neyse ki Java değil.


Teşekkürler. autotoolsEklentiyi yakında kontrol edeceğim . Sürücü programlama için daha iyi bir IDE biliyor musunuz? Sence (linux'da deneyimi olmayan tembel bir VS kullanıcısı) yönetebilir makefilemi? Mı makefilebüyük projelerde gerçekten yönetilebilir s?
Isaac

Ben de tembel bir VS kullanıcısıydı ve autotools usta dik öğrenme eğrisi vardır itiraf etmeliyim ama sadece linux için değil, çok değerli. Eclipse en iyi IDE'lerden biridir, ancak autotools projeleri o kadar çeşitlidir ki hiçbir IDE tüm olasılıkları ayrıştıramaz. Doğru yapmak istiyorsanız geany'yi deneyin, VS6'yı sevdiyseniz anjuta ve codelite'yi deneyin, ancak komut satırı derlemesinde her zaman yetkin olun.
aquaherd

1

Linux sürücü programlamasında da yeniyim, DKMS adı verilen çekirdek modüllerini (resmi Linux ağacında olmayan) dağıtmanın yeni bir yolunun olduğunu buldum. Modül kaynak olarak kurulacak ve DKMS her çekirdek için onu derlemeye özen gösterecektir. Bu, Makefile for module'ın elle yazılacağı ve kaynağının autotools için dahil edilmeyeceği anlamına gelir.

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

güncellenmiş...

DKMS, http://tr.community.dell.com/techcenter/os-applications/w/wiki/2463.linux-projects.aspx adresine taşındı.

Bu öğreticiler / DKMS'ye hızlı giriş (Dell proje sayfasından bağlantılar): Linux Journal makalesi , Power Solutions belgesi , Ottawa Linux Sempozyumu belgesi

DKMS, hızlı sürücü dağıtımı için kullanılır. Örneğin, Ubuntu makinemde DKMS kullanan çekirdek modülleri:

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

Bu daha önce yazdığım kod, DKMS Merhaba Dünya olarak yardımcı olabilir. https://github.com/sneetsher/RTD-DM5408-Driver-Port-for-Linux


1

1> bu komutla deneyebilirsiniz

"make" -> "/ usr / bin / make"

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

2> dizinde merhaba kelime kodunu saklayın, creat dosya adı "Makefile"

obj-m := NameofyourHelloWold.o 

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

PWD   := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.