Viết một trình điều khiển thiết bị của Hello Hello World cho kernel 2.6 bằng Eclipse


9

Mục tiêu

Tôi đang cố gắng viết một trình điều khiển thiết bị đơn giản trên Ubuntu. Tôi muốn làm điều này bằng cách sử dụng Eclipse (hoặc một IDE tốt hơn phù hợp với lập trình trình điều khiển). Đây là mã:

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

Nỗ lực của tôi

Sau một số nghiên cứu, tôi quyết định sử dụng CTD Eclipse để phát triển trình điều khiển (trong khi tôi vẫn không chắc liệu nó có hỗ trợ các công cụ gỡ lỗi đa luồng không). Vì vậy, tôi:

  1. Đã cài đặt Ubuntu 11.04 máy tính để bàn x86 trên máy ảo VMWare,
  2. Đã cài đặt eclipse-cdtlinux-headers-2.6,38-8 bằng Trình quản lý gói Synaptic,
  3. Tạo một mã C Projectđược đặt tên TestDriver1và sao chép ở trên vào nó,
  4. Đã thay đổi lệnh xây dựng mặc định make, thành lệnh xây dựng tùy chỉnh sau:

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

Vấn đề

Tôi gặp lỗi khi tôi cố gắng xây dựng dự án này bằng nhật thực. Đây là nhật ký cho bản dựng:

**** Xây dựng cấu hình Gỡ lỗi cho dự án TestDriver1 ****

làm cho -C /lib/modules/2.6,38-8-generic / build M = / home / isaac / workspace / TestDriver1 tất cả

thực hiện: Nhập thư mục '/usr/src/linux-headers-2.6,38-8-generic'

thực hiện: *** Không có quy tắc để thực hiện mục tiêu vmlinux', needed bytất cả '. Dừng lại.

thực hiện: Rời khỏi thư mục '/usr/src/linux-headers-2.6,38-8-generic'

Thật thú vị, tôi không gặp lỗi khi tôi sử dụng shellthay vì eclipsexây dựng dự án này. Để sử dụng shell, tôi chỉ cần tạo một Makefilechứa obj-m += TestDriver1.ovà sử dụng makelệnh trên để xây dựng.

Vì vậy, một cái gì đó phải sai với nhật thực Makefile. Có thể nó đang tìm kiếm vmlinuxkiến trúc (?) Hoặc một cái gì đó trong khi kiến ​​trúc hiện tại là x86. Có lẽ đó là vì VMWare?

Theo tôi hiểu, việc eclipsetạo các tệp tạo tệp tự động và sửa đổi thủ công sẽ gây ra lỗi trong tương lai HOẶC gây makefilekhó khăn cho việc quản lý .

Vì vậy, làm thế nào tôi có thể biên dịch dự án này trên nhật thực?

Câu trả lời:


5

Tôi ở cùng vị trí với bạn. Theo hướng dẫn này, tôi đã thành công với việc xây dựng kernel và một mô-đun duy nhất.

Tôi đã thêm ba bước (40 ~ 42) vào bài viết chính để làm cho Eclipse biên dịch một trình điều khiển cụ thể, chứ không phải toàn bộ kernel.

  1. Tải xuống và cài đặt Eclipse cộng với CDT.
  2. Cấu hình và xây dựng kernel của bạn để xác định CONFIG_*và tạo autoconf.h. Điều này có thể được thực hiện trước hoặc sau khi tải xuống và cài đặt Eclipse.
  3. Đảm bảo rằng bạn có nguồn hạt nhân phù hợp (ví dụ: đảm bảo rằng bạn đang ở nhánh git phải). Nếu bạn kiểm tra một chi nhánh khác sau đó, điều đó ổn, nhưng bạn sẽ cần lập chỉ mục lại nguồn và mất khoảng 20 phút.
  4. Khởi động Eclipse.
  5. Bấm File-> New->C Project
  6. Điền vào một tên dự án như my_kernel
  7. Bỏ chọn hộp Sử dụng vị trí mặc định và nhập vào thư mục gốc của hạt nhân của bạn vào hộp Vị trí.
  8. Trong khung Project type:, bấm vào dự án Makefile và chọn dự án rỗng
  9. Ở bên phải, chọn Linux GCC
  10. Nhấp vào Advanced settings... và một hộp thoại Thuộc tính sẽ bật lên.
  11. Chọn Tài nguyên ở bên trái, rồi trong phần mã hóa tệp Văn bản, chọn Khác và ISO-8859-1trong hộp, sau đó bấm Áp dụng
  12. Mở vùng C/C++ Generalchọn bên trái.
  13. Bấm vào Preprocessor Include Paths
  14. Chọn GNU Ctrong danh sách Ngôn ngữ
  15. Chọn CDT User Setting Entriestrong danh sách Cài đặt mục nhập
  16. Nhấp vào Add.... Chọn Tệp Macros tiền xử lý từ menu thả xuống trên cùng bên trái, Đường dẫn dự án từ menu thả xuống trên cùng bên phải và nhập include/generated/autoconf.hvào hộp văn bản Tệp. (Lưu ý: đối với các nhân cũ hơn [trước 2.6.36?], Vị trí của autoconf.hinclude/linux/autoconf.h)
  17. Đồng thời thêm bất kỳ tệp macro nào khác mà bạn đang sử dụng.
  18. Bấm vào Indexer
  19. Đánh dấu vào ô Cho phép giải quyết cụ thể của dự án.
  20. Bỏ chọn tệp nguồn chỉ mục không có trong bản dựng
  21. Xóa các tập tin để lập chỉ mục hộp phía trước.
  22. Nhấp vào Đường dẫn và Biểu tượng ở bên trái.
  23. Chọn tab Bao gồm và sau đó chọn GNU C
  24. Nhấp vào Add...
  25. Nhấp vào Workspace... sau đó chọn thư mục bao gồm kernel của bạn
  26. Thực hiện thêm Thêm, Không gian làm việc và thêm arch/architecture/include, ví dụ:arch/powerpc/include
  27. Nhấp vào # Symbolstab
  28. Nhấp vào Add...
  29. Đặt tên thành __KERNEL__
  30. Đặt giá trị thành 1và nhấp vào OK
  31. Nhấp vào tab Vị trí nguồn
  32. Nhấp vào uốn lượn cho dự án của bạn.
  33. Chọn mục Bộ lọc và nhấp vào Chỉnh sửa Bộ lọc ...
  34. Nhấp vào Thêm nhiều ... và sau đó chọn tất cả các thư mục arch / * trong nguồn kernel của bạn sẽ không được sử dụng (tức là tất cả những thư mục không dành cho kiến ​​trúc bạn đang sử dụng)
  35. Nhấn OK và OK lần nữa để bỏ qua hộp thoại đó.
  36. Bấm OK trên hộp thoại Thuộc tính.
  37. Nhấp vào Kết thúc trên hộp thoại Dự án C.
  38. Nhấp chuột phải vào dự án và chọn Index sau đó chọn Rebuild
  39. Sẽ mất khoảng 20 phút hoặc lâu hơn để hoàn thành.
  40. Mở cài đặt dự án của bạn, đi đến C/C++ build -> Behaviour (tab)
  41. Kiểm tra Build (Incremental buil)hộp kiểm và thêm đường dẫn mô-đun của bạn vào hộp văn bản (trong trường hợp của tôi M=drivers/servo/dynamixel).
  42. Khi mô-đun của bạn đã sẵn sàng và bạn muốn biên dịch kernel, lặp lại 41 và thay thế M=..bằng all.

1

Nếu bạn muốn thực hiện phát triển trình điều khiển với nhật thực, bạn sẽ phải làm điều đó theo cách khác.

Bạn sẽ cần phải bắt kịp automake, autogen, pkg-config, v.v., tạo một dự án autotools và nhập nó vào nhật thực. Nhật thực-cdt sẽ cung cấp điều này nếu không bạn đã bỏ lỡ để cài đặt 'autotools-plugin' (không chắc chắn về tên chính xác, viết cái này từ bộ nhớ).

Chỉ cần từ bỏ ý tưởng rằng nhật thực-cdt có thể quản lý một Makefile đàng hoàng, C không phải là Java, thật không may hoặc rất may.


Cảm ơn. Tôi sẽ kiểm tra autotoolsplugin sớm. Bạn có biết IDE nào tốt hơn để lập trình trình điều khiển không? Bạn có nghĩ rằng tôi (một người dùng VS lười biếng không có kinh nghiệm về linux) có thể quản lý makefilekhông? Là makefilethực sự quản lý trong các dự án lớn?
Isaac

Tôi cũng là một người dùng VS lười biếng và tôi phải thừa nhận việc thành thạo các autotools có một đường cong học tập dốc nhưng nó rất đáng giá, không chỉ với linux. Eclipse là một trong những IDE tốt nhất xung quanh, nhưng các dự án autotools rất đa dạng đến nỗi không IDE nào có thể phân tích tất cả các khả năng. Hãy thử geany nếu bạn muốn làm đúng, hãy thử anjuta và codelite nếu bạn thích VS6 nhưng luôn thành thạo biên dịch dòng lệnh.
thủy thủ

1

Tôi cũng mới trong lập trình trình điều khiển Linux, tôi thấy rằng có một cách mới để triển khai các mô-đun hạt nhân (không có trong cây Linux chính thức) được gọi là DKMS. Mô-đun sẽ được cài đặt dưới dạng nguồn và DKMS sẽ đảm nhiệm việc biên dịch nó cho từng hạt nhân. Điều đó có nghĩa là Makefile cho mô-đun sẽ được viết thủ công và nguồn của nó sẽ không được bao gồm cho autotools.

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

đã cập nhật ...

DKMS đã chuyển đến http://en.community.dell.com/techcenter/os-appluggest/w/wiki/2463.linux-projects.aspx

Hướng dẫn này / giới thiệu nhanh về DKMS (các liên kết từ trang dự án Dell): bài viết Tạp chí Linux , giấy Giải pháp Power , giấy Hội nghị chuyên đề Linux Linux

DKMS được sử dụng để triển khai trình điều khiển nhanh. Ví dụ: các mô-đun hạt nhân sử dụng DKMS trong máy Ubuntu của tôi:

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

Đây là mã tôi đã viết trước đây, Nó có thể hữu ích như DKMS Hello World. https://github.com/sneetsher/RTD-DM5408-Driver-Port-for-Linux


1

1> bạn có thể thử với lệnh này

"làm" -> "/ usr / bin / làm"

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

2> trong thư mục lưu mã từ xin chào của bạn, tên tệp tạo "Makefile"

obj-m := NameofyourHelloWold.o 

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

PWD   := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.