ओएस विकास अनुसंधान में अपने प्रयासों को जारी रखते हुए, मैंने अपने सिर में लगभग पूरी तस्वीर बनाई है। एक चीज अभी भी मुझे बढ़ाती है।ऑपरेटिंग सिस्टम कर्नेल और प्रक्रियाओं को मुख्य मेमोरी में
यहाँ मेरी समझ से, बुनियादी बूट प्रक्रिया है:
1) BIOS/बूटलोडर आवश्यक जांच करते हैं, सब कुछ आरंभ कर देगा।
2) कर्नेल रैम में लोड किया गया है।
3) कर्नेल इसकी प्रारंभिकता करता है और शेड्यूलिंग कार्य शुरू करता है।
4) जब कोई कार्य लोड होता है, तो उसे वर्चुअल एड्रेस स्पेस दिया जाता है जिसमें यह रहता है। .text, .data, .bss, ढेर और ढेर सहित। यह कार्य अपने स्वयं के "वर्चुअल" स्टैक को इंगित करते हुए, अपने स्वयं के स्टैक पॉइंटर को "रखता है"।
5) संदर्भ स्विच केवल रजिस्टर फ़ाइल (सभी सीपीयू रजिस्टरों), स्टैक पॉइंटर और प्रोग्राम काउंटर को कुछ कर्नेल डेटा संरचना में धक्का देते हैं और किसी अन्य प्रक्रिया से संबंधित एक और सेट लोड करते हैं।
इस अमूर्तता में, कर्नेल एक "मां" प्रक्रिया है जिसमें अन्य सभी प्रक्रियाओं की मेजबानी की जाती है। मैं निम्न चित्र में मेरे सबसे अच्छे समझ व्यक्त करने की कोशिश की:
प्रश्न है, इस साधारण मॉडल सही है?
दूसरा, निष्पादन योग्य प्रोग्राम को इसके वर्चुअल स्टैक के बारे में पता कैसे लगाया गया है? क्या यह वर्चुअल स्टैक पॉइंटर की गणना करने और प्रासंगिक CPU रजिस्टर में रखने के लिए ओएस नौकरी है? क्या सीपीयू पॉप और पुश कमांड द्वारा किए गए बाकी स्टैक बुककीपिंग हैं?
क्या कर्नेल के पास अपना मुख्य ढेर और ढेर है?
धन्यवाद।
* "कर्नेल के पास स्वयं का ढेर नहीं है।" * गलत नहीं होने पर, मुझे लगता है कि मेरे उत्तर से यह बिंदु ओपी की गलतफहमी को साफ़ करता है: * "जबकि कर्नेल के अपने धागे हो सकते हैं ... कर्नेल को वास्तव में "एक मां प्रक्रिया" के बारे में नहीं सोचा जाना चाहिए जो स्वतंत्र रूप से चलता है ... "* यहां मुख्य टेकवे: ** धागे (कार्यों) में ढेर ** हैं, और उपयोगकर्ता-मोड प्रक्रियाओं और कर्नेल धागे दोनों (उर्फ' लिनक्स में kthread') धागे हैं। इसके अतिरिक्त, उपयोगकर्ता-मोड थ्रेड में वास्तव में एकाधिक स्टैक होंगे: एक उपयोगकर्ता-मोड में, और कर्नेल में दूसरा। –