การเขียนไดรเวอร์อุปกรณ์“ 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 desktop x86บนเครื่องเสมือน VMWare
  2. ติดตั้งeclipse-cdtและlinux-headers-2.6.38-8โดยใช้ Synaptic Package Manager
  3. สร้างรหัสที่มีC Projectชื่อTestDriver1และคัดลอกแล้ววางไว้ด้านบน
  4. เปลี่ยนคำสั่ง build เริ่มต้นเป็นคำสั่ง build makeที่กำหนดเองต่อไปนี้:

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

ปัญหา

ฉันได้รับข้อผิดพลาดเมื่อพยายามสร้างโครงการโดยใช้ eclipse นี่คือบันทึกสำหรับบิลด์:

**** โครงสร้างของการตั้งค่า Debug สำหรับโครงการ TestDriver1 ****

ทำให้ -C /lib/modules/2.6.38-8-generic/build M = / home / isaac / พื้นที่ทำงาน / TestDriver1 ทั้งหมด

ทำ: การป้อนไดเรกทอรี '/usr/src/linux-headers-2.6.38-8-generic'

ทำ: *** ไม่มีกฎที่จะทำให้เป้าหมายvmlinux', needed byทั้งหมด ' หยุด.

ทำให้: ออกจากไดเรกทอรี '/usr/src/linux-headers-2.6.38-8-generic'

ที่น่าสนใจฉันไม่มีข้อผิดพลาดเมื่อฉันใช้shellแทนที่จะeclipseสร้างโครงการนี้ หากต้องการใช้shellฉันเพิ่งสร้างMakefileที่มีobj-m += TestDriver1.oและใช้makeคำสั่งด้านบนเพื่อสร้าง

Makefileดังนั้นสิ่งที่จะต้องมีความผิดปกติกับคราส อาจจะมองหาvmlinuxสถาปัตยกรรม (?) หรือบางสิ่งในขณะที่สถาปัตยกรรมปัจจุบันคือ x86 อาจเป็นเพราะ VMWare

ดังที่ฉันเข้าใจแล้วeclipseสร้าง makefiles โดยอัตโนมัติและแก้ไขด้วยตนเองจะทำให้เกิดข้อผิดพลาดในอนาคตหรือจัดการmakefileยาก

ดังนั้นฉันจะรวบรวมโครงการนี้ใน eclipse ได้อย่างไร

คำตอบ:


5

ฉันเกือบจะอยู่ในตำแหน่งเดียวกับคุณ หลังจากการประมูลนี้ฉันประสบความสำเร็จในการสร้างเคอร์เนลและโมดูลเดียว

ฉันเพิ่มสามขั้นตอน (40 ~ 42) ในบทความหลักเพื่อทำให้ Eclipse รวบรวมไดรเวอร์เฉพาะไม่ใช่เคอร์เนลทั้งหมด

  1. ดาวน์โหลดและติดตั้ง Eclipse พร้อมกับ CDT
  2. การกำหนดค่าและสร้างเคอร์เนลของคุณที่จะกำหนดและสร้างCONFIG_* autoconf.hสิ่งนี้สามารถทำได้ก่อนหรือหลังการดาวน์โหลดและติดตั้ง Eclipse
  3. ตรวจสอบให้แน่ใจว่าคุณมีแหล่งเคอร์เนลที่ถูกต้อง (เช่นต้องแน่ใจว่าคุณอยู่ในสาขา git ที่ถูกต้อง) หากคุณตรวจสอบสาขาอื่นในภายหลังก็โอเค แต่คุณจะต้องทำดัชนีแหล่งที่มาอีกครั้งและใช้เวลาประมาณ 20 นาที
  4. เริ่มต้น Eclipse
  5. คลิกFile-> New->C Project
  6. กรอกชื่อโครงการเช่น my_kernel
  7. ยกเลิกการเลือกช่องใช้ตำแหน่งเริ่มต้นและพิมพ์ในไดเรกทอรีรากของเคอร์เนลลงในกล่องตำแหน่ง
  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... เลือกไฟล์มาโคร Preprocessor จากดรอปดาวน์ด้านซ้ายบนพา ธ โปรเจ็กต์จากดรอปดาวน์ด้านบนขวาและป้อน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. คลิกตกลงและตกลงอีกครั้งเพื่อปิดกล่องโต้ตอบนั้น
  36. คลิกตกลงในกล่องโต้ตอบคุณสมบัติ
  37. คลิกเสร็จสิ้นในกล่องโต้ตอบโครงการ C
  38. คลิกขวาที่โครงการและเลือกดัชนีจากนั้นเลือกสร้างใหม่
  39. จะใช้เวลาประมาณ 20 นาทีจึงจะเสร็จสมบูรณ์
  40. เปิดการตั้งค่าโครงการของคุณไปที่ C/C++ build -> Behaviour (tab)
  41. ตรวจสอบBuild (Incremental buil)ช่องทำเครื่องหมายและเพิ่มเส้นทางโมดูลของคุณไปยังกล่องข้อความ (ในกรณีของฉันM=drivers/servo/dynamixel)
  42. เมื่อคุณกำลังโมดูลพร้อมและคุณต้องการที่จะรวบรวมเมล็ดทำซ้ำ 41 และแทนที่ด้วยM=..all

1

หากคุณต้องการพัฒนาโปรแกรมควบคุมด้วย eclipse คุณจะต้องทำในลักษณะอื่น

คุณจะต้องติดตาม automake, autogen, pkg-config และอื่น ๆ สร้างโครงการ autotools และนำเข้าสู่ eclipse eclipse-cdt ควรเสนอสิ่งนี้ไม่เช่นนั้นคุณจะพลาดการติดตั้ง 'autotools-plugin' (ไม่แน่ใจเกี่ยวกับชื่อที่แน่นอนเขียนสิ่งนี้จากหน่วยความจำ)

เพียงแค่ละทิ้งความคิดที่ว่า eclipse-cdt สามารถจัดการ Makefile ที่เหมาะสม C ไม่ใช่ Java น่าเสียดายหรือขอบคุณ


ขอบคุณ ฉันจะตรวจสอบautotoolsปลั๊กอินในไม่ช้า คุณรู้จัก IDE ที่ดีกว่าสำหรับการเขียนโปรแกรมควบคุมหรือไม่ คุณคิดว่าฉัน (ผู้ใช้ VS ที่ขี้เกียจที่ไม่มีประสบการณ์ใน linux) สามารถจัดการได้makefileหรือไม่? คือmakefiles จัดการได้จริงๆในโครงการขนาดใหญ่?
Isaac

ฉันเป็นผู้ใช้ VS ที่ขี้เกียจเช่นกันและฉันต้องยอมรับว่าการควบคุมอัตโนมัติมีเส้นโค้งการเรียนรู้ที่สูงชัน แต่มันก็คุ้มค่ามากไม่ใช่แค่ลินุกซ์ Eclipse เป็นหนึ่งใน IDEs ที่ดีที่สุด แต่โครงการ autotools นั้นมีความหลากหลายที่ไม่มี 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 , Power Solutions paper , กระดาษOttawa Linux Symposium

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> ในไดเรกทอรีจัดเก็บรหัสสวัสดีของคุณชื่อไฟล์ creat "Makefile"

obj-m := NameofyourHelloWold.o 

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

PWD   := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.