2011-07-31 6 views
10

का उपयोग कर उपयोगकर्ता-मोड पर स्विच करना मैं एक छोटा ओएस लिख रहा हूं जो उपयोगकर्ता मोड (विशेषाधिकार स्तर 3) में कुछ कोड निष्पादित करेगा। उस उपयोगकर्ता स्तर कोड से, मैं ओएस पर एक इंटरप्ट को वापस कॉल करना चाहता हूं जो एक संदेश प्रिंट करता है। अभी मैं वास्तव में परवाह नहीं करता कि मेरा इंटरप्ट हैंडलर तर्क या कुछ ऐसा कैसे लेता है, मैं वास्तव में एक इंटरप्ट हैंडलर चाहता हूं कि मुझे सूचित करें कि उपयोगकर्ता (उपयोगकर्ता) को कोड निष्पादित किया गया है।आईरेट

मेरा प्रश्न है: मैं उपयोगकर्ता मोड में कोड कैसे चला सकता हूं? मेरे पास एक ऐसा फ़ंक्शन है जो एक कोड सेगमेंट और डेटा सेगमेंट (उपयोगकर्ता मोड विशेषाधिकार दोनों के साथ) के साथ एक स्थानीय वर्णनकर्ता तालिका सेट करता है। मुझे समझ में नहीं आता कि मैं इन खंडों को cs, ss, और ds में लोड करना चाहता हूं। मैंने सफलतापूर्वक अपना एलडीटी लोड किया है, लेकिन मुझे नहीं पता कि वास्तव में इसका उपयोग कैसे किया जाए। मैंने सुना है कि मुझे iret का उपयोग करना चाहिए, लेकिन मुझे बिल्कुल समझ में नहीं आता है।

मेरे पास एक और सवाल यह है कि मेरे इंटरप्ट हैंडलर को कैसे काम करना चाहिए। मान लें कि मैं वेक्टर नंबर 0x40 के लिए एक इंटरप्ट हैंडलर स्थापित करता हूं, जिसे मैं "हैलो, उपयोगकर्ता मोड" प्रिंट करना चाहता हूं। मुझे पता है कि एक इंटरप्ट हैंडलर कैसे सेट अप करें, लेकिन मुझे समझ में नहीं आता कि उपयोगकर्ता मोड से कर्नेल इंटरप्ट हैंडलर दर्ज करते समय संदर्भ कैसे स्विच किया जाएगा। मुझे पता है कि cs रजिस्टर बदलना चाहिए, क्योंकि मेरी दिनचर्या मेरी आईडीटी प्रविष्टि में निर्दिष्ट कोड सेगमेंट से चल रही है। मैं यह भी समझता हूं कि स्टैक चयनकर्ता शायद भी बदलता है, लेकिन मैं इसके बारे में निश्चित नहीं हो सकता।

क्या कोई मुझे बता सकता है कि एक इंटरप्ट गेट कहलाता है जब संदर्भ परिवर्तन किए जाते हैं?

उत्तर

20

रिंग 3 प्राप्त करना iret का उपयोग करके किया जा सकता है क्योंकि जिस तरह से यह काम करता है उसे दस्तावेज किया गया है। आप एक अवरोध प्राप्त करते हैं, प्रोसेसर धक्का:

  1. ढेर खंड और सूचक (एस एस: esp), 4 शब्द
  2. EFLAGS
  3. वापसी कोड खंड और अनुदेश सूचक के रूप में (सीएस: EIP), 4 शब्द
  4. यदि आवश्यक हो, तो एक त्रुटि कोड। नाश द्वारा

iret काम करता है कदम 1-3 (आईएसआर चरण 4 नाश यदि आवश्यक हो तो के लिए जिम्मेदार है)। हम इस तथ्य का उपयोग स्टैक पर आवश्यक जानकारी को दबाकर और iret निर्देश जारी करके 3 रिंग करने के लिए कर सकते हैं। सुनिश्चित करें कि आपके कोड में उचित सीपीएल है और खंडों को ढेर करें (कम दो बिट्स प्रत्येक में सेट किए जाने चाहिए)। हालांकि, iret किसी भी डेटा सेगमेंट को नहीं बदलता है, इसलिए आपको उन्हें मैन्युअल रूप से बदलना होगा। ऐसा करने के लिए आप mov निर्देश का उपयोग करते हैं, लेकिन आप इसे करने और रिंगों को बदलने के बीच के ढेर के बाहर डेटा को पढ़ने में सक्षम नहीं होंगे।

cli 
mov ax, Ring3_DS 
mov ds, eax 
push dword Ring3_SS 
push dword Ring3_ESP 
pushfd 
or dword [esp], 0x200 // Set IF in EFLAGS so that interrupts will be reenabled in user mode 
push dword Ring3_CS 
push dword Ring3_EIP 
iret 

आप एक पूरा, काम उदाहरण चाहते हैं, this tutorial देखते हैं।


जब एक अवरोध जारी किया जाता है, प्रोसेसर ISR के लिए उचित कोड खंड और अनुदेश सूचक पाने के लिए अपने IDT पढ़ता है। फिर यह नया स्टैक सेगमेंट और पॉइंटर ढूंढने के लिए आपके टीएसएस को देखता है। यह ss और esp उचित रूप से बदलता है, और फिर पुराने मान को नए ढेर में धक्का देता है। यह किसी भी डेटा सेगमेंट रजिस्ट्रार को बदलता है। यदि आपको अपने आईएसआर में मेमोरी एक्सेस करने की आवश्यकता है तो आपको इसे मैन्युअल रूप से करना होगा।

+1

ठीक है, आपने मेरे प्रश्न का उत्तर दिया और अधिक! अब मैं समझ रहा हूं कि मुझे एक टीएसएस होना चाहिए जिसमें मेरा कर्नेल स्टैक इत्यादि हो। सहायता के लिए धन्यवाद। –

+0

मैं बस इसे ऊपर उठाने के लिए लॉग इन किया है! धन्यवाद! इसके अलावा किसी और के लिए, मैं osdev, और इंटेल आईएसए मैनुअल की भी सलाह देता हूं। वे वास्तव में चीजों को साफ़ करते हैं। – Sid

+0

मेरा क्या मतलब है आईआरईटी डेटा सेगमेंट नहीं बदलता है? क्या आप सामान्य प्रयोजन रजिस्टरों के अंदर मूल्यों के बारे में बात कर रहे हैं? –

1

आप एक आरटीएफ भी कर सकते हैं।एक कम विशेषाधिकार प्राप्त कोड सेगमेंट तक पहुंचने से नया एसएस और एसपी विशेषाधिकार प्राप्त स्टैक से पॉप हो जाएगा।

बस यह सुनिश्चित करें कि आप दूर-दराज के लिए दूरदराज के रिटर्न और इंटरप्ट के लिए इरेट करते हैं। उनके बीच एकमात्र अंतर ढेर पर झंडे की उपस्थिति है, लेकिन यह समझदारी नहीं है कि उन्हें मिश्रण करें।

इसके अलावा, यह भी न भूलें कि अपवाद कभी-कभी स्टैक पर त्रुटि कोड दबाते हैं।

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

  • कोई संबंधित समस्या नहीं^_^