2009-01-10 9 views
11

यह this question से संबंधित है।लिनक्स डिवाइस ड्राइवरों में फ़्लोटिंग-पॉइंट का उपयोग करने के लिए कोडिंग सम्मेलन क्या हैं?

मैं लिनक्स डिवाइस ड्राइवर या कर्नेल मॉड्यूल पर एक विशेषज्ञ नहीं हूं, लेकिन मैं रुबिनी & कॉर्बेट और कई ऑनलाइन स्रोतों द्वारा "लिनक्स डिवाइस ड्राइवर्स" [O'Reilly] पढ़ रहा हूं, लेकिन मेरे पास नहीं है अभी तक इस विशिष्ट मुद्दे पर कुछ भी खोजने में सक्षम है।

कर्नेल या ड्राइवर मॉड्यूल को फ़्लोटिंग-पॉइंट रजिस्टरों का उपयोग करने की अनुमति कब दी जाती है?
यदि हां, तो उनकी सामग्री को सहेजने और पुनर्स्थापित करने के लिए कौन जिम्मेदार है?
(x86-64 वास्तुकला मान लें)

अगर मैं सही ढंग से समझ, जब भी एक किलोमीटर चल रहा है, यह एक हार्डवेयर संदर्भ (या हार्डवेयर धागा या पंजीकृत सेट - जो कुछ भी आप इसे कॉल करना चाहते हैं) का उपयोग किया जाता है कि preempted कर दिया गया है कुछ आवेदन धागे से। यदि आप सी में अपना केएम लिखते हैं, तो संकलक सही ढंग से बीमा करेगा कि सामान्य प्रयोजन रजिस्ट्रार ठीक से सहेजे और पुनर्स्थापित किए जाते हैं (एप्लिकेशन में जितना अधिक), लेकिन यह स्वचालित रूप से फ़्लोटिंग-पॉइंट रजिस्टरों के साथ नहीं होता है। उस मामले के लिए, बहुत सारे केएम यह भी मान नहीं सकते कि प्रोसेसर में कोई फ़्लोटिंग-पॉइंट क्षमता है।

क्या मैं यह अनुमान लगाने में सही हूं कि एक केएम जो फ़्लोटिंग-पॉइंट का उपयोग करना चाहता है उसे फ़्लोटिंग-पॉइंट स्टेटस को सावधानीपूर्वक सहेजना और पुनर्स्थापित करना है? क्या ऐसा करने के लिए मानक कर्नेल फ़ंक्शन हैं?

क्या कोडिंग सम्मेलन इस वर्तनी के लिए कहीं भी बाहर हैं?
क्या वे एसएमपी-गैर एसएमपी ड्राइवरों के लिए अलग हैं?
क्या वे पुराने गैर-प्रीपेप्टिव कर्नल और नए प्रीपेप्टिव कर्नेल के लिए अलग हैं?

उत्तर

8

संक्षिप्त उत्तर: यदि यह उपयोग kernel_fpu_begin()/kernel_fpu_end() से घिरा हुआ है तो कर्नेल कोड फ़्लोटिंग पॉइंट का उपयोग कर सकता है। ये फ़ंक्शन fpu संदर्भ को सहेजने और पुनर्स्थापित करने में संभालते हैं। इसके अलावा, वे preempt_disable()/preempt_enable() पर कॉल करते हैं, जिसका अर्थ है कि उन कार्यों के बीच कोड में कोई नींद नहीं, पृष्ठ दोष आदि। अधिक जानकारी के लिए Google फ़ंक्शन नाम।

अगर मैं सही ढंग से समझ, जब भी एक किलोमीटर चल रहा है, यह एक हार्डवेयर संदर्भ उपयोग कर रहा है (या हार्डवेयर धागे या रजिस्टर सेट - जो कुछ भी आप यह कॉल करना चाहते हैं) है कि कुछ से रोका जाता कर दिया गया है आवेदन धागा

नहीं, एक कर्नेल मॉड्यूल उपयोगकर्ता संदर्भ में भी चलाया जा सकता है (उदाहरण के लिए जब उपयोगकर्ता स्पेस केएम द्वारा प्रदान किए गए डिवाइस पर सिस्को कॉल करता है)। हालांकि, यह फ्लोट मुद्दे से कोई संबंध नहीं है।

आप ग में अपने के.एम. लिखते हैं, संकलक सही ढंग से बीमा होगा कि सामान्य प्रयोजन रजिस्टरों ठीक से बचाया और (एक आवेदन में ज्यादा के रूप में) पुनर्स्थापित किए जाते हैं, लेकिन वह स्वचालित रूप से नहीं होता है फ़्लोटिंग-पॉइंट रजिस्टरों के साथ।

यह संकलक की वजह से नहीं है, लेकिन कर्नेल संदर्भ-स्विचिंग कोड के कारण है।

10

Linus's answer एक दिशानिर्देश के रूप में उपयोग करने के लिए इस बहुत स्पष्ट उद्धरण प्रदान करता है:

दूसरे शब्दों में: नियम है कि आप वास्तव में कर्नेल में एफपी उपयोग नहीं करना चाहिए है।

संबंधित मुद्दे