ग्रहण का उपयोग करके कर्नेल 2.6 के लिए "हैलो वर्ल्ड" डिवाइस ड्राइवर लिखना


9

लक्ष्य

मैं उबंटू पर एक साधारण डिवाइस ड्राइवर लिखने की कोशिश कर रहा हूं। मैं यह ग्रहण (या एक बेहतर आईडीई जो ड्राइवर प्रोग्रामिंग के लिए उपयुक्त है) का उपयोग करके करना चाहता हूं। यहाँ कोड है:

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

मेरा प्रयास

कुछ शोध के बाद, मैंने ड्राइवर को विकसित करने के लिए ग्रहण सीटीडी का उपयोग करने का फैसला किया (जबकि मुझे अभी भी यकीन नहीं है कि यह मल्टी-थ्रेडिंग डीबगिंग टूल का समर्थन करता है)। तो मैं:

  1. VMWare वर्चुअल मशीन पर Ubuntu 11.04 डेस्कटॉप x86 स्थापित किया गया,
  2. Synaptic Package Manager का उपयोग करके स्थापित eclipse-cdtऔर लिनक्स-हेडर-2.6.38-8 ,
  3. कोड के ऊपर एक C Projectनामांकित TestDriver1और कॉपी-पेस्ट किया गया,
  4. डिफ़ॉल्ट बिल्ड कमांड makeको निम्न अनुकूलित बिल्ड कमांड में बदल दिया:

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

समस्या

मुझे एक त्रुटि मिलती है जब मैं ग्रहण का उपयोग करके इस परियोजना का निर्माण करने की कोशिश करता हूं। यहाँ निर्माण के लिए लॉग है:

**** परियोजना TestDriver1 के लिए कॉन्फ़िगरेशन डिबग का निर्माण ****

Make -C /lib/modules/2.6.38-8-generic/build M = / home / isaac / कार्यक्षेत्र / TestDriver1

मेक: एंटरिंग डाइरेक्टरी '/usr/src/linux-headers-2.6.38-8-generic'

make: *** 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मेकफ़ाइल्स को स्वचालित रूप से बनाता है और इसे मैन्युअल रूप से संशोधित करने से भविष्य में त्रुटियां होती हैं या प्रबंध makefileकरना मुश्किल होता है।

इसलिए, मैं इस परियोजना को ग्रहण पर कैसे संकलित कर सकता हूं?

जवाबों:


5

मैं आपके साथ लगभग एक ही स्थिति में हूं। इस अलगाव के बाद मुझे कर्नेल के निर्माण के साथ सफलता मिली है, और एक एकल मॉड्यूल।

मैंने एक विशिष्ट ड्राइवर को ग्रहण करने के लिए तीन चरणों (40 ~ 42) को मुख्य लेख में जोड़ा, संपूर्ण कर्नेल नहीं।

  1. Eclipse और CDT को डाउनलोड और इंस्टॉल करें।
  2. परिभाषित करने CONFIG_*और उत्पन्न करने के लिए अपने कर्नेल को कॉन्फ़िगर करें और बनाएं autoconf.h। यह ग्रहण से पहले या डाउनलोड करने और स्थापित करने के बाद किया जा सकता है।
  3. सुनिश्चित करें कि आपके पास सही कर्नेल स्रोत है (उदाहरण के लिए सुनिश्चित करें कि आप सही गिट शाखा पर हैं)। यदि आप बाद में किसी अन्य शाखा की जांच करते हैं, तो यह ठीक है, लेकिन आपको स्रोत को फिर से अनुक्रमित करना होगा, और इसमें लगभग 20 मिनट लगते हैं।
  4. ग्रहण शुरू करें।
  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.... शीर्ष दाईं ओर ड्रॉपडाउन से प्रीप्रोसेसर मैक्रोज़ फ़ाइल चुनें, ऊपरी दाएँ ड्रॉपडाउन से प्रोजेक्ट पथ, और include/generated/autoconf.hफ़ाइल पाठ बॉक्स में दर्ज करें । (नोट: पुराने कर्नेल [? पूर्व 2.6.36] के लिए, के स्थान autoconf.hहै include/linux/autoconf.h)
  17. साथ ही आपके द्वारा उपयोग की जा रही किसी भी अन्य मैक्रो फ़ाइलों को जोड़ें।
  18. Indexer पर क्लिक करें
  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. Add एकाधिक पर क्लिक करें ... और फिर अपने कर्नेल स्रोत में सभी आर्च / * निर्देशिकाओं का चयन करें जिनका उपयोग नहीं किया जाएगा (अर्थात वे सभी जो आपके द्वारा उपयोग किए जा रहे आर्किटेक्चर के लिए नहीं हैं)
  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

यदि आप ग्रहण के साथ चालक विकास करना चाहते हैं, तो आपको इसे दूसरे तरीके से करना होगा।

आपको स्वचालित, ऑटोजेन, pkg-config और इतने पर पकड़ने की आवश्यकता होगी, एक ऑटोटूलस प्रोजेक्ट बनाएं और इसे ग्रहण में आयात करें। ग्रहण-सीडी को यह पेशकश करनी चाहिए अन्यथा आप 'ऑटोटूलस-प्लगइन' स्थापित करने से चूक गए (सटीक नाम के बारे में अनिश्चित, यह याद से लिखना)।

सिर्फ इस विचार को छोड़ दें कि ग्रहण-सीडीटी एक सभ्य मेकफाइल का प्रबंधन कर सकता है, सी जावा नहीं है, दुर्भाग्य से या शुक्र है।


धन्यवाद। मैं autotoolsजल्द ही प्लगइन की जांच करूंगा । क्या आप ड्राइवर प्रोग्रामिंग के लिए कोई बेहतर आईडीई जानते हैं? क्या आपको लगता है कि मैं (एक आलसी VS उपयोगकर्ता जिनके पास लिनक्स में कोई अनुभव नहीं है) प्रबंधित कर सकता है makefile? क्या makefileवास्तव में बड़ी परियोजनाओं में प्रबंधनीय है?
इसहाक

मैं एक आलसी VS उपयोगकर्ता भी था और मुझे यह स्वीकार करना चाहिए कि ऑटोटूलस में महारत हासिल करने के लिए एक कठिन सीखने की अवस्था है, लेकिन यह बहुत ही सार्थक है, न केवल लिनक्स के लिए। ग्रहण सबसे अच्छे आईडीई में से एक है, लेकिन ऑटोटूलस परियोजनाएं इतनी विविध हैं कि कोई भी आईडीई सभी संभावनाओं को पार्स नहीं कर सकता है। अगर आप इसे सही करना चाहते हैं, तो जीनी आज़माएं, अगर आपको वीएस 6 पसंद है तो अंजुता और कोडलाइट आज़माएं लेकिन कमांड लाइन कंपाइल में हमेशा कुशल रहें।
एक्वाहार्ड

1

मैं लिनक्स ड्राइवर प्रोग्रामिंग में नया हूं, मैंने पाया कि कर्नेल मॉड्यूल (जो कि आधिकारिक लिनक्स ट्री में नहीं हैं) को डीकेएमएस कहा जाता है। मॉड्यूल को स्रोत के रूप में स्थापित किया जाएगा और डीकेएमएस प्रत्येक कर्नेल के लिए इसे संकलित करने का ध्यान रखेगा। इसका मतलब है कि मॉड्यूल के लिए मेकफाइल मैन्युअल रूप से लिखा जाएगा और यह ऑटोटूलस के लिए स्रोत शामिल नहीं होगा।

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

अद्यतन ...

DKMS http://en.community.dell.com/techcenter/os-applications/w/wiki/2463.linux-projects.aspx पर चला गया

यह ट्यूटोरियल / डीकेएमएस का त्वरित परिचय (डेल प्रोजेक्ट पेज से लिंक): लिनक्स जर्नल लेख , पावर सॉल्यूशन पेपर , ओटावा लिनक्स सिम्पोजियम पेपर

डीकेएमएस का इस्तेमाल त्वरित चालक की तैनाती के लिए किया जाता है। उदाहरण के लिए मेरी उबंटू मशीन में DKMS का उपयोग कर कर्नेल मॉड्यूल:

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 हैलो वर्ल्ड के रूप में सहायक हो सकता है। https://github.com/sneetsher/RTD-DM5408-Driver-Port-for-Linux


1

1> आप इस कमांड के साथ कोशिश कर सकते हैं

"बनाओ" -> "/ usr / बिन / बनाओ"

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

2> डायरेक्टरी स्टोर में अपना हैलो शब्द कोड, क्रिएट फाइल का नाम "मेकफाइल"

obj-m := NameofyourHelloWold.o 

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

PWD   := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.