लिनक्स कर्नेल में फ्लोटिंग पॉइंट का उपयोग


83

मैं रॉबर्ट लव के "लिनक्स कर्नेल डेवलपमेंट" को पढ़ रहा हूं, और मैं निम्नलिखित मार्ग पर आया हूं:

नहीं (आसान) फ्लोटिंग पॉइंट का उपयोग

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

यूजर-स्पेस के विपरीत, कर्नेल में फ्लोटिंग पॉइंट के लिए सीमलेस सपोर्ट नहीं है क्योंकि यह आसानी से नहीं फंस सकता है। कर्नेल के अंदर एक फ्लोटिंग पॉइंट का उपयोग करके अन्य संभावित कामों के बीच फ़्लोटिंग पॉइंट रजिस्टरों को मैन्युअल रूप से सहेजने और पुनर्स्थापित करने की आवश्यकता होती है। संक्षिप्त उत्तर है: यह मत करो! दुर्लभ मामलों को छोड़कर, कोई भी फ्लोटिंग-पॉइंट ऑपरेशन कर्नेल में नहीं है।

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



2
पुस्तक "मोड" के बारे में बात करके समस्या को थोड़ा भ्रमित करती है। पूर्णांक निर्देश हमेशा उपलब्ध होते हैं, लेकिन FPU को पूरी तरह से या आंशिक रूप से अक्षम किया जा सकता है। कोई भी उपयोगी फ़ंक्शन कभी भी पूरी तरह से एफपी ऑप्स से युक्त नहीं होता है, उदाहरण के लिए, सभी नियंत्रण निर्देशों को "पूर्णांक" माना जाता है। अधिक के लिए नीचे देखें।
DigitalRoss

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

यह जानना दिलचस्प होगा कि कर्नेल में उपजी बिंदु ओप्स करने की इच्छा क्या है। यह कर्नेल में कुछ करने की कोशिश करने के अर्थ में "खराब डिजाइन" कहने के लिए आकर्षक है, जो इसके बाहर किया जाना चाहिए, लेकिन शायद कुछ चीजें हैं जो वास्तव में एक कर्नेल है जहां एफपीयू का लाभ उठाना एक अभिनव समाधान होगा?
क्रिस स्ट्रैटन

2
के बाद से कोई भी नहीं यह उल्लेख किया है, अगर आप कर्नेल के अंदर एफपी (या SIMD) का उपयोग करें, आप कॉल करने की जरूरत है kernel_fpu_begin()/ kernel_fpu_end()से पहले / अपने कोड के बाद यकीन है कि उपयोगकर्ता के अंतरिक्ष एफपीयू राज्य बनाने के लिए दूषित नहीं है। यह Linux का mdकोड RAID5 / RAID6 के लिए क्या करता है।
पीटर कॉर्ड्स

जवाबों:


86

चूंकि...

  • कई कार्यक्रम फ्लोटिंग पॉइंट का उपयोग नहीं करते हैं या किसी भी समय स्लाइस पर इसका उपयोग नहीं करते हैं; तथा
  • एफपीयू रजिस्टर और अन्य एफपीयू राज्य को बचाने में समय लगता है; इसलिये

... एक OS कर्नेल केवल FPU को बंद कर सकता है। प्रेस्टो, को बचाने और बहाल करने के लिए कोई राज्य नहीं है, और इसलिए तेजी से संदर्भ-स्विचिंग। (यह क्या मोड का मतलब है, यह सिर्फ मतलब है कि FPU सक्षम था।)

यदि कोई प्रोग्राम FPU ऑप का प्रयास करता है, तो प्रोग्राम कर्नेल में फंस जाएगा, कर्नेल FPU को चालू करेगा, पहले से मौजूद किसी भी सहेजे गए राज्य को पुनर्स्थापित करेगा, और फिर FPU सेशन को फिर से निष्पादित करेगा।

संदर्भ स्विच समय पर, यह वास्तव में राज्य के माध्यम से तर्क को बचाने के लिए जानता है। (और फिर यह FPU को फिर से बंद कर सकता है।)

वैसे, मुझे विश्वास है कि पुस्तक की व्याख्या के कारण गुठली (और न केवल लिनक्स) से बचें FPU ops है ... पूरी तरह से सही नहीं है। 1

कर्नेल अपने आप में फंस सकता है और कई चीजों के लिए ऐसा करता है। (टाइमर, पृष्ठ दोष, उपकरण बाधित, अन्य।) असली कारण यह है कि कर्नेल को विशेष रूप से FPU ऑप्स की आवश्यकता नहीं होती है और आर्किटेक्चर पर बिना FPU के चलने की आवश्यकता होती है। इसलिए, यह केवल ओप्स न करके अपने स्वयं के FPU संदर्भ को प्रबंधित करने के लिए आवश्यक जटिलता और रनटाइम से बचा जाता है जिसके लिए हमेशा कुछ सॉफ़्टवेयर समाधान होते हैं।

यह नोट करना दिलचस्प है कि अगर कर्नेल एफपी का उपयोग करना चाहते हैं तो कितनी बार एफपीयू राज्य को बचाया जाना होगा । । । हर सिस्टम कॉल, हर इंटरप्ट, कर्नेल थ्रेड्स के बीच हर स्विच। यहां तक ​​कि अगर कभी-कभी कर्नेल एफपी की आवश्यकता होती है, तो 2 इसे सॉफ्टवेयर में करना तेजी से संभव होगा।


1. वह, गलत गलत है।
2. कुछ मामलों में मुझे पता है कि कर्नेल सॉफ़्टवेयर में फ्लोटिंग पॉइंट अंकगणितीय कार्यान्वयन कहाँ है। कुछ आर्किटेक्चर हार्डवेयर में पारंपरिक FPU ऑप्स को लागू करते हैं, लेकिन कुछ जटिल IEEE FP सॉफ़्टवेयर को छोड़ देते हैं। (सोचो: असामान्य अंकगणित।) जब कुछ अजीब आईईईई कोने का मामला होता है तो वे सॉफ्टवेयर में फंस जाते हैं, जिसमें ऑप्स का एक पांडित्यपूर्ण रूप से सही अनुकरण होता है जो फंस सकता है।


16

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

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

जब आप किसी कार्य में पहली बार FP निर्देश का उपयोग करते हैं, तो इन कारणों (और कुछ और) के लिए कुछ हार्डवेयर FP योजनाएँ फँस जाएँगी। यदि आपको FP का उपयोग करने की अनुमति है तो फ़्लोटिंग-पॉइंट फ़्लैग को कार्य में चालू किया जाता है, यदि नहीं, तो आपको फायरिंग दस्ते द्वारा गोली मार दी जाती है।


लिनक्स में, यूजर-स्पेस FPU स्थिति को बचाने / पुनर्स्थापित करने के लिए / और अपने कोड के बाद kernel_fpu_begin()/ kernel_fpu_end()से पहले / का उपयोग करें (और मैं पूर्व कर्षण के खिलाफ आपके कर्नेल FPU राज्य का अनुमान लगाता हूं)।
पीटर कॉर्ड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.