2012-04-25 36 views
5

से दिया जाता है KEXT में फ़ाइल के लिए, मैं सुन रहा या गुंजाइश श्रोता फ़ाइल। कुछ (बहुत कम) फ़ाइलों के लिए, मुझे अपने सिस्टम डिमन पर फ़ाइल पथ भेजने की आवश्यकता है जो कुछ प्रोसेसिंग करता है (यह डिमन में होता है) और परिणाम को वापस KEXT पर वापस कर देता है। फ़ाइल क्लोज कॉल को तब तक अवरुद्ध करने की आवश्यकता है जब तक कि मुझे डेमन से प्रतिक्रिया न मिल जाए। परिणाम के आधार पर मुझे करीबी कॉल में कुछ ऑपरेशन की आवश्यकता है और बंद कॉल सफलतापूर्वक वापस करनी है। फोरम पर केएक्सटी संचार से संबंधित विषय पर बहुत सी चर्चा है। लेकिन वे निर्णायक नहीं हैं और बहुत पुराने (वर्ष 2002 के आसपास) दिखाई देते हैं। इस आवश्यकता को FtlSendMessage(...) Win32 API द्वारा नियंत्रित किया जा सकता है। मैं मैकसबसे अच्छा तरीका करने के लिए और परिणाम जब तक ब्लॉक vnode के माध्यम से करीब Daemon

पर कि के बराबर रहा हूँ

यहाँ है कि मैं क्या देखा और मेरी समझ संक्षेप में प्रस्तुत करना चाहते हैं:

  1. मच संदेश: इस का उपयोग करते हुए प्रदान करता है द्विदिश संचार की बहुत अच्छी तरह से और बंदरगाहों जवाब queuing mechansim के साथ। हालांकि, मच संदेश API (उदा। mach_msg, mach_port_allocate, bootstrap_look_up) केपीआई नहीं दिखते हैं। मच एपीआई mach_msg_send_from_kernel का उपयोग किया जा सकता है, लेकिन वह अकेले द्विपक्षीय संचार में मदद नहीं करेगा। क्या मेरी समझ सही है?
  2. IOUserClient: ऐसा लगता है कि उपयोगकर्ता स्थान से KEXT तक संचार करने के साथ और फिर केएक्सटी से कुछ कॉलबैक होने के साथ ऐसा लगता है। मुझे केएक्सटी से डेमन तक संचार शुरू करने का कोई तरीका नहीं मिला और फिर डेमॉन से परिणाम की प्रतीक्षा करें। क्या मैं कुछ भूल रहा हूँ?
  3. सॉकेट: यह आखिरी विकल्प हो सकता है के बाद से मैं KEXT से Daemon करने के लिए पूरे द्विदिश संचार चैनल को लागू करने के लिए होगा।
  4. ioct एल/sysctl: मैं उनके बारे में ज्यादा पता नहीं है। मैं क्या पढ़ा है से, अपनी नहीं अनुशंसित विकल्प विशेष रूप से द्विदिश संचार के लिए
  5. RPC-मिग: फिर मैं उनके बारे में ज्यादा पता नहीं है। मैंने जो देखा है उससे जटिल दिखता है। सुनिश्चित नहीं है कि यह अनुशंसित तरीका है।
  6. KUNCUserNotification: यह सिर्फ KEXT से उपयोगकर्ता के लिए अधिसूचना प्रदान प्रतीत होता है। यह मेरी आवश्यकता को पूरा नहीं करता है।

समर्थित मंच (10.5 बाद) है। तो आवश्यकता को देखते हुए, क्या कोई इस विषय पर कुछ संकेतक सुझा सकता है और प्रदान कर सकता है?

अग्रिम धन्यवाद।

+0

क्या आपको सॉकेट के साथ इसे कार्यान्वित करने का एक उदाहरण मिला? आपके इनपुट के लिए – gbdavid

उत्तर

3

उस प्रक्रिया के लिए मैंने जिस पैटर्न का उपयोग किया है, वह है कि उपयोगकर्ता-स्पेस प्रक्रिया केएक्सटी के लिए सॉकेट कनेक्शन शुरू करे; केएक्सटी उस सॉकेट पर संदेशों को संभालने के लिए एक नया धागा बनाता है और धागे को सोता है। जब केएक्सटी किसी घटना का पता लगाता है तो उसे जवाब देने की आवश्यकता होती है, यह मैसेजिंग थ्रेड को जगाता है और डेटा को डिमन पर डेटा भेजने के लिए मौजूदा सॉकेट का उपयोग करता है। प्रतिक्रिया प्राप्त करने पर, ऑपरेशन को वीटो करने का निर्णय लेने के लिए अनुरोध थ्रेड को वापस भेज दिया जाता है।

मैं किसी एक संसाधन है कि है कि पूरे पैटर्न पूरी तरह से वर्णन करेंगे के बारे में पता नहीं है, लेकिन प्रासंगिक KPIs Mac OS X Internals में चर्चा कर रहे हैं (जो पुराने लगता है, लेकिन KPIs बहुत ज्यादा नहीं है, क्योंकि यह लिखा गया था बदल दिया है) और OS X and iOS Kernel Programming (जो मैं एक तकनीकी समीक्षक था)।

+0

धन्यवाद ग्राहम। मैं केएक्सटी और डेमॉन के बीच संवाद करने के लिए कर्नेल सॉकेट विकल्प का उपयोग कर अन्वेषण करूंगा। एक बार फिर धन्यवाद। – RHK

0

आप, सॉकेट KExt तरफ ctl_register() के साथ स्थापित उपयोग करने के लिए तो सावधान रहना चाहते हैं: संचार उपयोगकर्ता अंतरिक्ष के लिए kext से (ctl_enqueuedata() के माध्यम से) ठीक काम करता है। हालांकि विपरीत दिशा 10.5 पर छोटी है।एक्स और 10.6.x.

पूरी प्रणाली के लिए विनाशकारी परिणाम के साथ PF_SYSTEM डोमेन पूरा शुद्ध ढेर टूटता में SOCK_DGRAM साथ 70.000 के बारे में या 80.000 send() कॉल करने के बाद (हार्ड बंद करने के लिए एक ही रास्ता बाहर है)। यह 10.7.0 में तय किया गया है। मैं उपयोगकर्ता प्रोजेक्ट से केक्स्ट की दिशा के लिए हमारी परियोजना में setsockopt() का उपयोग करके कामकाज करता हूं क्योंकि हम केवल बहुत ही छोटा डेटा भेजते हैं (केवल कुछ ऑपरेशन को अनुमति/अस्वीकार करने के लिए)।

0

क्या इसके लायक है के लिए, autofs का उपयोग करता है कि मैं क्या मान लें कि आपके "RPC-मिग" द्वारा मतलब है, तो यह भी जटिल (MIG नहीं है RPC कॉल वर्णन करने के लिए प्रयोग किया जाता है, और ठूंठ कोड यह उचित बुला हैंडल उत्पन्न करता है मैक-संदेश कोड भेजना और प्राप्त करना; कर्नेल-मोड स्टब्स उत्पन्न करने के लिए विशेष विकल्प हैं)।

हालांकि, इसे किसी भी लुकअप करने की आवश्यकता नहीं है, जैसे automountd (उपयोगकर्ता-मोड डिमन जिस पर autofs kext संदेश भेजता है) में "होस्ट विशेष पोर्ट" असाइन किया गया है। मनमानी सेवा खोजने के लिए लुकअप करना कठिन होगा।