मैंने पढ़ा है कि टीएसएस में रजिस्टरों आदि के बारे में जानकारी है। अभी, मैं कर्नेल से उपयोगकर्ता मोड और वापस स्विच को लागू करने का प्रयास कर रहा हूं। मैंने इंटेल 80386 मैनुअल पढ़ा है, और इस संसाधन को देख रहा था: http://www। सामान्य कार्यप्रवाह के लिए Brokethorn.com/Resources/OSDev23.html। वे यह करते हैं:

void install_tss (uint32_t idx, uint16_t kernelSS, uint16_t kernelESP) {

    //! install TSS descriptor
    uint32_t base = (uint32_t) &TSS;
    gdt_set_descriptor (idx, base, base + sizeof (tss_entry),
        I86_GDT_DESC_ACCESS|I86_GDT_DESC_EXEC_CODE|I86_GDT_DESC_DPL|I86_GDT_DESC_MEMORY,
        0);

    //! initialize TSS
    memset ((void*) &TSS, 0, sizeof (tss_entry));

    TSS.ss0 = kernelSS;
    TSS.esp0 = kernelESP;

    TSS.cs=0x0b;
    TSS.ss = 0x13;
    TSS.es = 0x13;
    TSS.ds = 0x13;
    TSS.fs = 0x13;
    TSS.gs = 0x13;

    //! flush tss
    flush_tss (idx * sizeof (gdt_descriptor));
}

मैं उलझन में हूं कि RPL = 3 क्यों

मेरे मामले में, जब मैं उपयोगकर्ता मोड में हूं और मैं कर्नेल मोड में जाने के लिए ट्रैप गेट का उपयोग करना चाहता हूं, तो ट्रैप गेट में सीएस सेगमेंट में आरपीएल 0 (16 बिट सेगमेंट के अंतिम 2 बिट्स) और जीडीटी प्रविष्टि होगी। सीएस सेगमेंट के अनुरूप डीपीएल 0 भी होगा। और मैंने पढ़ा है कि एक अंतर-स्तरीय विशेषाधिकार स्विच टीएसएस को देखकर ढेर (केवल ??) स्विच करता है। मैं अनुमान लगा रहा हूं कि उपरोक्त कोड में एक TSS.ss = 0x10 होना चाहिए।

नोट: हम क्लासिक 0x08 = कर्नेल कोड, 0x10 = कर्नेल डेटा, .... GDT संरचना यहाँ मान रहे हैं

0
Suraaj K S 4 अप्रैल 2020, 07:53

1 उत्तर

सबसे बढ़िया उत्तर

TSS संरचना में बहुत सारे क्षेत्र हैं जो हार्डवेयर कार्य स्विचिंग के लिए उपयोग किए जाते हैं (उदाहरण के लिए TSS.ss, जहां पर ss रजिस्टर की सामग्री को सहेजा/लोड किया जाएगा यदि एक हार्डवेयर कार्य स्विच हुआ), साथ ही कुछ क्षेत्र जो कार्य को उच्च विशेषाधिकार स्तर पर स्विच करने के लिए उपयोग किया जाता है ((उदाहरण के लिए (e.g.TSS.ss0` CPL=0 पर स्विच करने के लिए)।

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

इसके बजाय, आप टीएसएस के TSS.esp0 और TSS.ss0 क्षेत्रों को देखना चाहते हैं, जो टीएसएस के केवल 2 क्षेत्र हैं जो सीपीएल = 0 पर स्विच करने के लिए महत्वपूर्ण हैं (और केवल 2 फ़ील्ड हो सकते हैं टीएसएस जो आप कभी भी उपयोग करते हैं)।

3
Brendan 4 अप्रैल 2020, 06:43