2011-07-30 33 views
6

मैं एक छोटे ओएस पर काम कर रहा हूं जो प्रत्येक प्रक्रिया के लिए एक अलग स्थानीय वर्णनकर्ता तालिका का उपयोग करेगा। मैं समझता हूं कि मुझे अपने जीडीटी से एलडीटी सेगमेंट लोड करने के लिए lldt निर्देश का उपयोग करने की आवश्यकता होगी। मेरे पास पहले से ही मेरा कर्नेल एक वैध जीडीटी के साथ संरक्षित मोड में चल रहा है, लेकिन मैं यह नहीं समझ सकता कि मेरे एलडीटी के लिए जीडीटी प्रविष्टि कैसा दिखना चाहिए। मैं समझता हूं कि इसका मूल पता मेरे एलडीटी को इंगित करना चाहिए, लेकिन मुझे नहीं पता कि विशेषाधिकार स्तर और अन्य गुण क्या होना चाहिए। यहाँ एनएएसएम कोड है कि मेरे GDT में LDT प्रविष्टि का प्रतिनिधित्व करता है:एलएलडीटी का उपयोग करके और इसके लिए जीडीटी को कॉन्फ़िगर करना

localTable equ $-gdt   ; GDT entry #5 (selector 20h) 
dw 0x1FF      ; limit to 64 descriptors 
dw 0x8000      ; base address 
db 0x0 
db 0x89       ; probably incorrect... 
db 0x1f       ; possibly incorrect... 
db 0x0 

आप एनएएसएम वाक्य रचना से परिचित नहीं हैं, तो यह तालिका प्रविष्टि, 0x8000 का आधार पते और 511 की एक सीमा (512 बाइट्स कुल या 64 प्रविष्टियां)। मैंने i486 प्रोग्रामर के संदर्भ पुस्तिका में जीडीटी और एलडीटी के बारे में अनुभाग पढ़ा है, लेकिन मैं पूरी तरह से समझ नहीं पा रहा हूं कि मेरी जीडीटी प्रविष्टि कैसा दिखना चाहिए।

वैसे भी, मैं तो जैसे LDT लोड:

mov ax, 0x20 
lldt ax 

इस कोड को एक सामान्य संरक्षण गलती (मैं एक अवरोध के साथ संभाल) उत्पन्न करने के लिए प्रोसेसर का कारण बनता है। मैं दो चीजों को जानना चाहता हूं:

1) क्या मैंने जीडीटी में अपने एलडीटी का सही वर्णन किया? यदि नहीं, तो क्या बदलने की जरूरत है? 2) LLDT निर्देश विफल हो सकता है क्योंकि मेरे एलडीटी में अमान्य चयनकर्ता हैं? मैंने एलएलडीटी निर्देशक spec पढ़ा, और ऐसा लगता है कि यह एलडीटी की स्मृति भी नहीं पढ़ता है, लेकिन मैं बस यह सुनिश्चित करना चाहता हूं कि एलएलडीटी विफल नहीं हो रहा है क्योंकि मेरे पास मेरे एलडीटी के डेटा में एक टाइपो है।

उत्तर

3

ठीक है, मैंने इसे समझ लिया। जिस प्रकार का मैं उपयोग कर रहा था (1001b) मुझे वह चाहिए जो मुझे चाहिए था। मैंने पाया कि टाइप 2 (10b) एलडीटी प्रविष्टियों के लिए उपयोग किया जाता है। रिकॉर्ड के लिए, यह जानकारी i486 माइक्रोप्रोसेसर प्रोग्रामर के मैनुअल के अध्याय 6, पृष्ठ 4 में है। मेरी कार्यात्मक जीडीटी प्रविष्टि निम्नानुसार दिखती है:

localTable equ $-gdt   ; GDT entry #5 (selector 20h) 
dw 0x1FF      ; limit to 64 descriptors 
dw 0x8000      ; base address 
db 0x0 
db 0x82       ; 10000010b (segment present set, WTM) 
db 0x1f 
db 0x0