अन्य दो उत्तर (लेखन के समय) इंटरप्ट और आईडीटी के बारे में बात करते हैं। यह सही है, हालांकि, आधुनिक इंटेल-एस्क्यू सीपीयू पर, कर्नेल में कॉल करने के तीन से कम तरीके नहीं हैं।
विधि # 1: बाधित।
यह ऊपर बताया गया है। आप इंटरप्ट डिस्क्रिप्टर टेबल / इंटरप्ट वेक्टर में एक प्रविष्टि सेट करते हैं, और फिर कर्नेल में प्रवेश करने के लिए एक सॉफ्टवेयर इंटरप्ट निष्पादित करते हैं।
इस पद्धति का मुख्य लाभ यह है कि एक विशिष्ट कर्नेल को वैसे भी बाधित करने में सक्षम होने की आवश्यकता होती है, और यह पुरातन हार्डवेयर पर काम करता है।
विधि # 2: कॉल गेट्स।
एक कॉल गेट एक विशेष प्रकार का खंड चयनकर्ता है। कॉल के लक्ष्य को वैश्विक या स्थानीय खंड विवरण तालिका (GDT और LDT क्रमशः) में लोड करने की आवश्यकता है। यदि आप तब कॉल गेट का उपयोग करके एक दूर के कॉल निर्देश को सेगमेंट के रूप में करते हैं (कॉल ऑफ़सेट को अनदेखा किया जाता है), तो यह आपको अधिक विशेषाधिकार प्राप्त कोड को कॉल करने की अनुमति देता है। कॉल गेट्स बेहद लचीले हैं; IA-32 वास्तुकला में चार विशेषाधिकार स्तर हैं, और कॉल गेट्स आपको किसी भी स्तर पर कॉल करने देते हैं।
मैं नहीं मानता कि लिनक्स कभी कॉल गेट्स का इस्तेमाल करता था, लेकिन विंडोज 95 ने किया। Win95 कर्नेल सेवाएँ ( krnl386.exe
और kernel.dll
) वास्तव में उपयोगकर्ता मोड (रिंग 3) में चलती थीं। उच्चतम विशेषाधिकार स्तर (रिंग 0) का उपयोग केवल ड्राइवरों और एक माइक्रोकर्नल के लिए किया जाता था जो केवल प्रक्रिया स्विचिंग का प्रदर्शन करते थे। कॉल गेटों का उपयोग करके ड्राइवरों में कॉलिंग की गई। इसने 16-बिट कोड की अनुमति दी (जिसमें से बहुत कुछ था!) Win95 ड्राइवरों का उपयोग करने के लिए बस एक मानक दूर कॉल का उपयोग करना, जैसे उन्होंने हमेशा किया था।
वैश्विक डिस्क्रिप्टर तालिका की अपर्याप्त सुरक्षा कई विंडोज 95 कारनामों का कारण थी, जो स्मृति पर लिखकर अपने स्वयं के कॉल गेट स्थापित करने में कामयाब रहे।
विधि # 3: SYSCALL / SYSRET और SYSENTER / SYSEXIT
ये निर्देश के दो सेट हैं, स्वतंत्र रूप से एएमडी और इंटेल द्वारा आविष्कार किए गए हैं, लेकिन वे अनिवार्य रूप से एक ही काम करते हैं। SYSCALL / SYSRET पहले आया था और केवल AMD, SYSENTER / SYSEXIT इंटेल था, लेकिन AMD अब इसे लागू करता है। इसलिए मैं SYSENTER / SYSEXIT का वर्णन करने जा रहा हूं।
कॉल गेट्स के विपरीत, SYSENTER का उपयोग केवल रिंग 0 में ट्रांसफर करने के लिए किया जा सकता है, और केवल एक स्थान पर ट्रांसफर किया जा सकता है। हालाँकि, इसमें बेहद कम विलंबता होने का फायदा है क्योंकि कॉल या इंटरप्ट के विपरीत यह स्टैक को स्पर्श नहीं करता है।
स्थानांतरण स्थान को तीन मॉडल-विशिष्ट रजिस्टरों का उपयोग करके स्थापित किया गया है: एक खंड जानकारी के लिए, और एक निर्देश सूचक और कर्नेल कोड के स्टैक पॉइंटर के लिए। क्योंकि स्टैक पर कुछ भी "धक्का" नहीं दिया गया है, उपयोगकर्ता मोड कोड कर्नेल को यह बताने के लिए जिम्मेदार है कि रजिस्टरों में रिटर्न इंस्ट्रक्शन पॉइंटर और स्टैक पॉइंटर पास करके वापस लौटना है। स्टैक पॉइंटर को पुनर्स्थापित करने के लिए कर्नेल जिम्मेदार है, और SYSEXIT इंस्ट्रक्शन इंस्ट्रक्टर पॉइंटर को पुनर्स्थापित करता है।
SYSENTER और SYSEXIT निर्देशों के बारे में अधिक जानकारी।