Menulis Driver Perangkat "Hello World" untuk kernel 2.6 menggunakan Eclipse

9

Tujuan

Saya mencoba menulis driver perangkat sederhana di Ubuntu. Saya ingin melakukan ini menggunakan Eclipse (atau IDE yang lebih baik yang cocok untuk pemrograman driver). Ini kodenya:

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

Usaha saya

Setelah beberapa penelitian, saya memutuskan untuk menggunakan Eclipse CTD untuk mengembangkan driver (sementara saya masih tidak yakin apakah itu mendukung alat debugging multi-threading). Jadi saya:

  1. Menginstal Ubuntu 11.04 desktop x86 pada mesin virtual VMWare,
  2. Diinstal eclipse-cdtdan linux-header-2.6.38-8 menggunakan Synaptic Package Manager,
  3. Membuat kode di atas yang C Projectdinamai TestDriver1dan disalin untuk itu,
  4. Mengubah perintah build default make,, ke perintah build kustom berikut:

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

Masalah

Saya mendapatkan kesalahan saat mencoba membangun proyek ini menggunakan gerhana. Berikut ini adalah log untuk build:

**** Membangun konfigurasi Debug untuk proyek TestDriver1 ****

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

make: Memasuki direktori '/usr/src/linux-headers-2.6.38-8-generic'

make: *** Tidak ada aturan untuk menjadikan target vmlinux', needed bysemua '. Berhenti.

make: Meninggalkan direktori '/usr/src/linux-headers-2.6.38-8-generic'

Menariknya, saya tidak mendapatkan kesalahan ketika saya menggunakan shellalih-alih eclipsemembangun proyek ini. Untuk menggunakan shell, saya hanya membuat yang Makefilemengandung obj-m += TestDriver1.odan menggunakan makeperintah di atas untuk membangun.

Jadi, pasti ada yang salah dengan gerhana Makefile. Mungkin sedang mencari vmlinuxarsitektur (?) Atau sesuatu sementara arsitektur saat ini adalah x86. Mungkin karena VMWare?

Seperti yang saya pahami, eclipsemembuat makefile secara otomatis dan memodifikasinya secara manual akan menyebabkan kesalahan di masa depan ATAU membuat pengelolaan menjadi makefilesulit.

Jadi, bagaimana saya bisa mengkompilasi proyek ini di eclipse?

Ishak
sumber

Jawaban:

5

Saya dalam posisi yang hampir sama dengan Anda. Mengikuti instruksi ini, saya berhasil membangun kernel sendiri, dan satu modul.

Saya menambahkan tiga langkah (40 ~ 42) ke artikel utama untuk membuat Eclipse mengkompilasi driver tertentu, bukan seluruh kernel.

  1. Unduh dan pasang Eclipse plus CDT.
  2. Konfigurasikan dan bangun kernel Anda untuk mendefinisikan CONFIG_*dan menghasilkan autoconf.h. Ini dapat dilakukan sebelum atau setelah mengunduh dan menginstal Eclipse.
  3. Pastikan Anda memiliki sumber kernel yang tepat (mis. Pastikan Anda berada di cabang git kanan). Jika Anda memeriksa cabang lain nanti, tidak apa-apa, tetapi Anda perlu mengindeks ulang sumbernya, dan itu membutuhkan waktu sekitar 20 menit.
  4. Mulai Eclipse.
  5. Klik File-> New->C Project
  6. Isi nama proyek seperti my_kernel
  7. Hapus centang pada kotak Use default location dan ketik direktori root kernel Anda ke dalam kotak Location.
  8. Di Jenis proyek: panel, klik proyek Makefile dan pilih Proyek Kosong
  9. Di sisi kanan, pilih Linux GCC
  10. Klik Advanced settings... dan dialog Properties akan muncul.
  11. Pilih Sumberdaya di sebelah kiri, dan kemudian di bagian penyandian file Teks, pilih Lainnya dan ISO-8859-1di dalam kotak, kemudian klik Terapkan
  12. Buka C/C++ Generalpilihan di sebelah kiri.
  13. Klik Preprocessor Include Paths
  14. Pilih GNU Cdalam daftar Bahasa
  15. Pilih CDT User Setting Entriesdalam daftar Entri Pengaturan
  16. Klik Add.... Pilih File Macro Preprocessor dari dropdown kiri atas, Project Path dari dropdown kanan atas, dan masukkan include/generated/autoconf.hke dalam kotak teks File. (Catatan: untuk kernel yang lebih tua [pra-2.6.36?], Lokasi autoconf.his include/linux/autoconf.h)
  17. Juga tambahkan file makro lain yang Anda gunakan.
  18. Klik pada Indexer
  19. Centang centang kotak Aktifkan penyelesaian khusus proyek.
  20. Hapus tanda centang file sumber Indeks tidak termasuk dalam membangun
  21. Kosongkan File untuk mengindeks kotak di muka.
  22. Klik pada Paths and Symbols di sebelah kiri.
  23. Pilih tab Termasuk dan kemudian pilih GNU C
  24. Klik Add...
  25. Klik Workspace... lalu pilih direktori include kernel Anda
  26. Lakukan Add lain, Workspace dan tambahkan arch/architecture/include, misalnya,arch/powerpc/include
  27. Klik # Symbolstab
  28. Klik Add...
  29. Tetapkan nama menjadi __KERNEL__
  30. Tetapkan nilainya ke 1dan klik OK
  31. Klik tab Lokasi Sumber
  32. Klik belok untuk proyek Anda.
  33. Pilih item Filter dan klik Edit Filter ...
  34. Klik Tambah Banyak ... dan kemudian pilih semua direktori lengkung / * di sumber kernel Anda yang tidak akan digunakan (yaitu semua yang bukan untuk arsitektur yang Anda gunakan)
  35. Klik OK dan OK lagi untuk mengabaikan dialog itu.
  36. Klik OK pada dialog Properties.
  37. Klik Finish pada dialog C Project.
  38. Klik kanan pada proyek dan pilih Index lalu pilih Rebuild
  39. Diperlukan sekitar 20 menit untuk menyelesaikannya.
  40. Buka pengaturan proyek Anda, buka C/C++ build -> Behaviour (tab)
  41. Periksa Build (Incremental buil)kotak centang dan tambahkan jalur modul Anda ke kotak teks (dalam kasus saya M=drivers/servo/dynamixel).
  42. Ketika modul Anda siap dan Anda ingin mengkompilasi kernel, ulangi 41 dan ganti M=..dengan all.
sorush-r
sumber
1

Jika Anda ingin melakukan pengembangan driver dengan eclipse, Anda harus melakukannya sebaliknya.

Anda perlu mengejar automake, autogen, pkg-config dan sebagainya, membuat proyek autotools dan mengimpornya ke gerhana. Eclipse-cdt akan menawarkan ini jika tidak Anda lewatkan untuk menginstal 'autotools-plugin' (tidak yakin tentang nama pasti, menulis ini dari memori).

Tinggalkan saja ide bahwa eclipse-cdt dapat mengelola Makefile yang layak, C bukan Java, sayangnya atau untungnya.

aquaherd
sumber
Terima kasih. Saya akan autotoolssegera memeriksa plugin. Apakah Anda tahu IDE yang lebih baik untuk pemrograman driver? Apakah Anda pikir saya (pengguna VS malas yang tidak memiliki pengalaman di linux) dapat mengelola makefile? Apakah makefilebenar-benar dapat dikelola dalam proyek-proyek besar?
Isaac
Saya adalah pengguna VS malas juga dan saya harus mengakui menguasai autotool memiliki kurva belajar yang curam tetapi sangat bermanfaat, tidak hanya untuk linux. Eclipse adalah salah satu IDE terbaik yang ada, tetapi proyek autotool sangat beragam sehingga tidak ada IDE yang dapat menguraikan semua kemungkinan. Coba geany jika Anda ingin melakukannya dengan benar, coba anjuta dan codelite jika Anda suka VS6 tetapi selalu mahir di kompilasi baris perintah.
aquaherd
1

Saya juga baru dalam pemrograman driver Linux, saya menemukan bahwa ada cara baru untuk menggunakan modul kernel (yang tidak ada dalam pohon Linux resmi) yang disebut DKMS. Modul akan diinstal sebagai sumber dan DKMS akan mengaturnya untuk setiap kernel. Ini berarti modul Makefile untuk akan ditulis secara manual dan sumbernya tidak akan disertakan untuk autotool.

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

diperbarui ...

DKMS pindah ke http://en.community.dell.com/techcenter/os-applications/w/wiki/2463.linux-projects.aspx

Tutorial / pengantar cepat ini ke DKMS (tautan dari halaman proyek Dell): artikel Linux Journal , makalah Power Solutions , makalah Simposium Linux Ottawa

DKMS digunakan untuk pemasangan driver cepat. Misalnya modul kernel menggunakan DKMS di mesin Ubuntu saya:

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

Ini adalah kode yang saya tulis sebelumnya, Bisa bermanfaat sebagai DKMS Hello World. https://github.com/sneetsher/RTD-DM5408-Driver-Port-for-Linux

user.dz
sumber
1

1> Anda dapat mencoba dengan perintah ini

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

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

2> di direktori simpan kode halo Anda, buat nama file "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
sumber