हम अपना OS: अंक 2 लिखते हैं

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



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



उपलब्ध स्मृति की छोटी मात्रा वास्तविक मोड में एकमात्र समस्या नहीं है। ऐसी स्थिति की कल्पना करें जहां मेमोरी में एक साथ ऑपरेटिंग सिस्टम और कई एप्लिकेशन प्रोग्राम हों। वास्तविक मोड में, कोई भी एप्लिकेशन प्रोग्राम को किसी अन्य प्रोग्राम या यहां तक ​​कि ऑपरेटिंग सिस्टम से संबंधित पते से संपर्क करने से रोकता है। इस प्रकार, एक कार्यक्रम में एक त्रुटि पूरे सिस्टम के पतन का कारण बन सकती है।



इन दो समस्याओं को हल करने के लिए, इंटेल ने एक समय में रैम को संबोधित करने का एक नया, अधिक जटिल तरीका विकसित किया। अधिक सटीक रूप से, इंटेल ने कई संबोधित करने के तरीके भी विकसित किए हैं, और उन सभी को सामूहिक रूप से संरक्षित मोड के रूप में जाना जाता है



तो, संरक्षित मोड में संबोधित करना तीन मोडों में से एक में हो सकता है (टॉटोलॉजी के लिए खेद है) - सेगमेंट, पेज और सेगमेंट-पेज में। इस अंक में, हम केवल खंडित विधा पर विचार करेंगे।



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



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







इसलिए, जैसा कि हमने पहले ही कहा था, विवरण में आधार (आधार पता), आकार (खंड सीमा) और किसी भी अतिरिक्त खंड विशेषता संग्रहीत हैं। चलो वर्णनकर्ता स्कीमा पर एक नज़र डालें।







कृपया ध्यान दें कि आधार के लिए 32 बिट्स आवंटित किए गए हैं, और केवल 20 सीमा के लिए। यह कैसे हो सकता है, आप पूछते हैं, क्या मेगाबाइट से बड़ा खंड बनाना वास्तव में असंभव है? आप कर सकते हैं। इसके लिए एक सरल ट्रिक का उपयोग किया जाता है। यदि बिट G को एक पर सेट किया जाता है, तो सीमा को बाइट्स में नहीं, बल्कि 4 Kbytes के ब्लॉक में माना जाता है। यह ध्यान दिया जाना चाहिए कि सीमा में खंड आकार माइनस एक होता है जो कि ग्रैन्युलैरिटी की इकाइयों में होता है, अर्थात। यदि सीमा 0 है, तो खंड 1 बाइट या 4 KB आकार का है। इसके अलावा, जैसा कि आप देख सकते हैं, विवरणक में कई और क्षेत्र शामिल हैं। उदाहरण के लिए उनमें से एक विस्तृत विवरण पाया जा सकता है, यहाँ



जैसा कि उल्लेख किया गया है, वर्णनकर्ता विशेष तालिकाओं में संग्रहीत होते हैं। कई तालिकाएं हो सकती हैं, लेकिन किसी भी स्थिति में, वैश्विक विवरणक तालिका, जीडीटी , स्मृति में मौजूद होना चाहिए। वह पूरे ऑपरेटिंग सिस्टम के लिए एक है। बदले में, प्रत्येक कार्य, अर्थात्, एक प्रक्रिया, शून्य, एक या अधिक एलडीटी - स्थानीय डिस्क्रिप्टर टेबल हो सकती है। GDT का पता और आकार GDTR रजिस्टर में संग्रहीत है, वर्तमान LDT LDTR रजिस्टर में है। जबकि हमें LDT की आवश्यकता नहीं है। इसके अलावा, इंटरप्ट डिस्क्रिप्टर के आईडीटी टेबल भी हैं, लेकिन हम अगली रिलीज तक उनके विचार को स्थगित कर देंगे।



चयनकर्ता नामक एक डेटा संरचना का उपयोग तालिका से एक विवरणक का चयन करने के लिए किया जाता है। यहाँ यह कैसा दिखता है:







चयनकर्ता में थोड़ा संकेत होता है कि किस तालिका में एक डिस्क्रिप्टर, स्थानीय या वैश्विक (एल / जी) और स्वयं डिस्क्रिप्टर नंबर की खोज करनी है। इसके अलावा, चयनकर्ता के पास एक आरपीएल फ़ील्ड है, लेकिन यह हमें अभी तक रुचि नहीं देता है।



तो चलो व्यापार के लिए नीचे उतरो!



;16- ,

use16

org 0x7c00

start :

jmp 0x0000 : entry ; CS=0, IP=0x7c00

entry :

mov ax , cs

mov ds , ax



;

mov ax , 0x0003

int 0x10



; A20

in al , 0x92

or al , 2

out 0x92 , al



; GDT GDTR

lgdt [ gdtr ]

;

cli

;

in al , 0x70

or al , 0x80

out 0x70 , al



;

mov eax , cr0

or al , 1

mov cr0 , eax



; CS:EIP

O32 jmp 00001000b : pm_entry



;32-

use32

;

pm_entry :

; ( SS)

mov ax , cs

mov ds , ax

mov es , ax



mov edi , 0xB8000 ; 0x3

mov esi , msg ;

cld

. loop ;

lodsb ;

test al , al ; 0

jz . exit ;

stosb ;

mov al , 7 ;

stosb

jmp . loop

. exit



jmp $ ;



msg :

db 'Hello World!' , 0



; .

; !

gdt :

db 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00

db 0xFF , 0xFF , 0x00 , 0x00 , 0x00 , 10011010b , 11001111b , 0x00

gdt_size equ $ - gdt



;, GDTR

gdtr :

dw gdt_size - 1

dd gdt



finish :

times 0x1FE - finish + start db 0

db 0x55 , 0xAA ;








अब कोड को थोड़ा समझाते हैं।



लाइनों में:

in al , 0x92 <br/>

or al , 2 <br/>

out 0x92 , al






पता पंक्ति A20 अनलॉक है। इसका क्या मतलब है? याद रखें कि वास्तविक मोड में, 1 एमबी मेमोरी को :



में संबोधित किया जा सकता है :



प्रारूप (प्रति पता 20 बिट)। हालाँकि, संपर्क करके, उदाहरण के लिए, पता FFFF:FFFF



, आप इस पट्टी की तुलना में थोड़ा अधिक "कूद" सकते हैं, और परिणामी पता 21 बिट लंबा होगा। 80286 तक के प्रोसेसर में, सबसे पुराना (बीसवीं, यदि आप शून्य से गिनती करते हैं) को छोड़ दिया गया था, और इसलिए, पुराने कार्यक्रमों के साथ संगतता के लिए, ए 20 एड्रेस लाइन लॉक पेश किया गया था। वर्तमान में, सभी ऑपरेटिंग सिस्टम संरक्षित मोड में काम करते हैं, और इसलिए, संबोधित करने की जरूरतों के लिए, आपको जल्द से जल्द इस बिट को अनलॉक करने की आवश्यकता है। ऐसी बातें।



GDTR रजिस्टर में वैश्विक डिस्क्रिप्टर तालिका के पते और सीमा को लोड करने के बाद, इंटरप्ट पर एक सार्वभौमिक प्रतिबंध है। यह इस तथ्य से समझाया गया है कि सभी अवरोध हैंडलर वास्तविक मोड में काम करते हैं, और संरक्षित मोड में समस्याओं को संबोधित करना शुरू हो जाएगा। इसलिए रूकावटों को सख्ती से मना करें।



संरक्षित मोड को सक्षम करना CR0



रजिस्टर के कम बिट को सेट करके किया जाता है। संरक्षित मोड में संक्रमण के तुरंत बाद, एक निश्चित अनिश्चितता उत्पन्न होती है: CS:EIP



आपको प्रारूप :



में सुरक्षित मोड में प्रवेश बिंदु सेट करना होगा :



, लेकिन हमारे पास अभी भी वहां वास्तविक मोड के वेस्टेज हैं। इसलिए, हम निम्नलिखित निर्देश पर अमल करते हैं:

O32 jmp 00001000b : pm_entry





यहां, O32



ऑपरेंड बिट गहराई रूपांतरण उपसर्ग का उपयोग किया जाता है, जो आपको 32-बिट ऑफसेट के साथ लंबी बिना शर्त कूद करने की अनुमति देता है। हुर्रे, हम अंततः संरक्षित शासन के आकर्षण का लाभ उठा सकते हैं!



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



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



All Articles