2013-08-18 7 views
7

से शट डाउन (एम्बेडेड) लिनक्स मैं एक एआरएम 9 आधारित मंच ओलिनक्सिनो के 2.6.35 कर्नेल के संशोधित संस्करण पर काम कर रहा हूं। मैं पावर मैनेजमेंट ड्राइवर (आर्किटेक्चर विशिष्ट भाग) को संशोधित करने की कोशिश कर रहा हूं।कर्नेल-स्पेस

प्रोसेसर एक फ्रीस्केल i.MX23 है। इस प्रोसेसर में "विशेष" पिन होता है, जिसे पीएसविच कहा जाता है, जो बिजली प्रबंधन चालक द्वारा संचालित एक बाधा उत्पन्न करता है। यदि स्विच दबाया जाता है, तो सिस्टम स्टैंडबाय पर जाता है। यह pm_suspend(PM_SUSPEND_STANDBY) पर कॉल करके ड्राइवर में किया जाता है।

मेरे हार्डवेयर सेटअप को देखते हुए, मैं सिस्टम को बंद करना चाहता हूं। तो मेरा सवाल है:

क्लीन सिस्टम रोक/पावरऑफ को ट्रिगर करने के लिए कर्नेल-स्पेस प्रक्रिया के लिए पसंदीदा तरीका क्या है?

मुझे लगता है कि वहां एक अच्छा छोटा फ़ंक्शन कॉल है, लेकिन मुझे अब तक यह नहीं मिला। हालांकि मेरे सवाल का एक सामान्य लिनक्स कर्नेल दृष्टिकोण के लिए कहता है, github.com/spairal/linux-for-lobster:

मेरे कर्नेल कोड यहां पाया जा सकता है (फ़ाइल मैं पर काम कर रहा हूँ चाप/हाथ/मच-mx23/pm.c है)।

+0

आप 'init 0' पर 'स्ट्रेस' कर सकते हैं और देख सकते हैं कि कौन से सिस्कोल निष्पादित किए गए हैं। –

उत्तर

9

सबसे सामान्य तरह से अपने ड्राइवर एक यूज़रस्पेस सहायक के रूप में shutdown आह्वान करने के लिए के लिए होगा:

static const char * const shutdown_argv[] = 
    { "/sbin/shutdown", "-h", "-P", "now", NULL }; 

call_usermodehelper(shutdown_argv[0], shutdown_argv, NULL, UMH_NO_WAIT); 

(यह मानकर आप एक /sbin/shutdown द्विआधारी स्थापित होना)। यह उपयोगकर्ताओं को स्पष्ट रूप से बंद कर देगा, फाइल सिस्टम को अनमाउंट करेगा और फिर कर्नेल शटडाउन और पावर ऑफ का अनुरोध करेगा।

हालांकि, आप इससे बेहतर प्रदर्शन कर सकते हैं - उदाहरण के लिए यदि आप गारंटी दे सकते हैं कि कोई डिस्क फाइल सिस्टम पढ़ा/लिखना नहीं है, तो आप कर्नेल थ्रेड को kernel_power_off() फ़ंक्शन का आह्वान करने के लिए कह सकते हैं (यह नहीं किया जाना चाहिए संदर्भ में बाधा से)।

+0

यह खूबसूरती से काम करता है। मुझे आशा थी कि वहां एक समाधान होगा जिसमें उपयोगकर्ताओं को कॉल करने में शामिल नहीं होगा, लेकिन मुझे लगता है कि बहुत सारे उपयोगकर्ता स्पेस हैं जो करने की ज़रूरत है ... बस एक विवरण: shutdown_argv const char * const * या [] होना चाहिए। – pcarranzav

+0

@pcarranzav: आह हाँ, तय है कि टाइपो, धन्यवाद। – caf

+0

मैंने अपने एम्बेडेड पावरपीसी पर इसे करने के लिए kernel_halt() का उपयोग किया है, और यह init 0 प्रक्रिया के माध्यम से जाना प्रतीत होता है। क्या आपको लगता है कि मुझे कुछ याद आया? –