इमुलेटिंग लिनस टोरवाल्ड्स: स्क्रॅचपासून आपली स्वतःची ऑपरेटिंग सिस्टम तयार करा (सातवी)

बद्दल दुसर्‍या पोस्टमध्ये आपले स्वागत आहे आपली स्वतःची ऑपरेटिंग सिस्टम कशी तयार करावी (मालिकेतील मागील लेखः 1, 2, 3, 4, 5 y 6). शेवटच्या पोस्टपासून बराच काळ गेला आहे, मुख्यत: आज आपल्याकडे जे आहे त्यामध्ये मला सापडलेल्या बगमुळे. आपण पाहू x86 आर्किटेक्चर्स वर घड्याळ कसे हाताळायचे.

पूर्वी आम्ही सर्वसामान्य मार्गाने आयआरक्यू सक्रिय केले होते, परंतु आम्ही त्यांना योग्यरित्या सक्रिय न केल्यामुळे आणि आम्ही अतिरिक्त डेटा पास केल्यामुळे एक छोटी समस्या आली. आम्ही शेवटी ते निराकरण करतो कार्लोसॉर्टा आणि मी आणि मी कसे सुरू ठेवायचे यावर टिप्पणी करणे सुरू ठेवू शकतो.

बरं, घड्याळ एक आयआरक्यू आहे, विशेषत: प्रथम. हे कॉन्फिगर करण्यासाठी आम्ही एनआर_आयआरक्यू_इन्स्टॉलहँडलर, सामान्यपणे आयआरक्यू स्थापित करण्यासाठी आम्ही वर परिभाषित केलेले फंक्शन वापरू.

# ND_TIMER_TICKS = 0; शून्य एनडी :: टाइमर :: फेज (इंट हर्ट्ज) {इंट डिव्हिजर = 1193180 / हर्ट्ज; एनडी :: पोर्ट्स :: आउटपुटबी (0x43,0x36); एनडी :: पोर्ट्स :: आउटपुटबी (0x40, विभाजक आणि 0xFF); एनडी :: पोर्ट्स :: आउटपुटबी (0x40, विभाजक >> 8); N शून्य एनडी :: टाइमर :: थांबा (इंट टिक) {स्वाक्षरीकृत लांब एटिक्स; एटिक्स = एनडी_आइएमटी_टीएमआयटी + टीक; असताना (ND_TIMER_TICK <<<<<<<< = ND :: टाइमर :: सेटअप () D एनडी :: स्क्रीन :: सेट कलर (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); एनडी :: स्क्रीन :: पुटस्ट्रिंग ("et n सेटअप टाइमर ..."); एनडी_आयआरक्यू_इन्स्टॉलहँडलर (0, & एनडी_टीमर_हँडलर); एनडी :: स्क्रीन :: सेट कलर (एनडी_SIDE_FOREGROUND, एनडी_कॉलोर_ग्रीन); एनडी :: स्क्रीन :: पुटस्ट्रिंग ("पूर्ण"); } बाह्य "सी" रिकामे एनडी_टाइमर_हँडलर (स्ट्रिट रेग्स * आर) {एनडी_टीएमआर_टीआयकेएस ++; if (ND_TIMER_TICKS% 18 == 0) {// एनडी :: स्क्रीन :: सेट कलर (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // एनडी :: स्क्रीन :: पुटस्ट्रिंग ("second n आणखी एक सेकंद"); आम्ही एक रिफ्रेश स्क्रीन करावे DO}

कोड खालीलप्रमाणे चालतो: इनिशिएलायझेशन सिस्टम कॉल एनडी :: टाइमर :: सेटअप, जे कॉल करते एनडी_आयआरक्यू_इन्स्टॉलहँडलर प्रथम स्थितीत समाविष्ट करण्यासाठी, आयआरक्यू 0, जेव्हा एखादा कॉलबॅक फंक्शन येतो तेव्हा कार्यक्रम होतो एनडी_टाइमर_हँडलर त्या वाढवते ticks. ज्याप्रमाणे आपण घड्याळाची गती 18 हर्ट्झ वर सेट केली आहे त्याप्रमाणे आपण नंतर पाहू, जर आपण त्यास 18 ने भाग केले आणि पूर्णांक दिले तर एक सेकंद निघून गेला.

कार्य एनडी :: टाइमर :: फेज हे आम्हाला गती समायोजित करण्यास मदत करते टाइमर, ती असाधारण संख्या 1.19 मेगाहर्ट्झ आहे जी सामान्य मूल्य आहे. ठीक आहे, जर आपल्याला गती बदलवायची असेल तर आपण हे फंक्शन कॉल करावे टाइमर, डीफॉल्टनुसार ते 18,22 हर्ट्जपर्यंत जाते, एक विलक्षण मूल्य जे एखाद्याने निश्चित केले असेल IBM ते आजपर्यंत कायम आहे.

कार्य एनडी :: टाइमर :: थांबा हे खूप सोपे आहे, फक्त लूपसह थांबा तर जोपर्यंत ticks सुरू ठेवणे आवश्यक आहे.

प्रतिमेमध्ये आपण हे पाहू शकतो की जर आम्ही एनडी_टीमर_हँडलरच्या अंतर्गत कोड संपुष्टात आणला तर आम्हाला हे मिळते:

नेक्स्टडिव्हल मधील सेकंद

पुढील अध्यायात आपण कीबोर्ड इनपुट कसे वाचू आणि थोडे कसे करावे ते पाहू शेल आमच्या प्रणालीशी संवाद साधण्यासाठी. नेहमीप्रमाणे, कोड मध्ये उपलब्ध आहे GitHub परवान्याअंतर्गत GNU GPL v2.


14 टिप्पण्या, आपल्या सोडा

आपली टिप्पणी द्या

आपला ई-मेल पत्ता प्रकाशित केला जाणार नाही. आवश्यक फील्ड चिन्हांकित केले आहेत *

*

*

  1. डेटा जबाबदार: मिगुएल Áन्गल गॅटन
  2. डेटाचा उद्देशः नियंत्रण स्पॅम, टिप्पणी व्यवस्थापन.
  3. कायदे: आपली संमती
  4. डेटा संप्रेषण: कायदेशीर बंधन वगळता डेटा तृतीय पक्षास कळविला जाणार नाही.
  5. डेटा संग्रहण: ओकेन्टस नेटवर्क (EU) द्वारा होस्ट केलेला डेटाबेस
  6. अधिकारः कोणत्याही वेळी आपण आपली माहिती मर्यादित, पुनर्प्राप्त आणि हटवू शकता.

  1.   नोहा म्हणाले

    ट्यूटोरियलची अतिशय रोचक मालिका, वैयक्तिकरित्या मी स्क्रॅचवरुन लिनक्स वितरण तयार करण्याबद्दल, आणि स्पॅनिश भाषेपेक्षा कमी आणि इतकी पूर्ण देखील पाहिली नव्हती. मला असे वाटते की आपण यातून बरेच काही शिकू शकाल आणि वेळ मिळालाच मला हे ट्यूटोरियल शिकण्याची आशा आहे.
    मी एवढेच सांगतो की तुम्ही निराश होऊ नका आणि ट्यूटोरियल पूर्ण करू नका कारण मला असे बरेच चांगले ट्यूटोरियल सापडले आहेत जे कधीच संपत नाहीत.
    शुभेच्छा आणि धन्यवाद :).

    1.    रोडर म्हणाले

      हे लिनक्स वितरण नाही, ते कर्नल 😛 आहे.

    2.    desikoder म्हणाले

      आपण चुकीचे आहात. लिनक्स डिस्ट्रो तयार करणे म्हणजे कुठल्याही प्रोग्रामिंगचा अर्थ होत नाही, उदाहरणार्थ, स्क्रॅचच्या एका लिनक्समध्ये आपण प्रोग्राम करत नाही, आपण जे स्थापित करता (कंपाईलवर आधारित) मूलभूत पॅकेजेस जे डिस्ट्रॉ बनवतात. हे खूप वेगळे आहे. ही आपली स्वतःची ऑपरेटिंग सिस्टम तयार करीत आहे. याचा लिनक्सशी काहीही संबंध नाही. टॉरवल्ड्सने मिनीक्सच्या प्रेरणेने त्याच्या दिवसात हे केले आणि टॉरवाल्ड्स आणि अँड्र्यू एस यांच्यात ती चर्चेत आणि लोकप्रिय चर्चा झाली. मोनोलिथिक कर्नल वि मायक्रोकेनेलवर टॅनबॉम.

      ग्रीटिंग्ज!

  2.   इलुक्की म्हणाले

    धन्यवाद चे. आतापर्यंत मी आपल्या पोस्टकडे फारसे लक्ष दिले नाही परंतु मी एका प्रकल्पात आहे म्हणून मी त्यांच्याकडे लक्ष देणार आहे.
    ग्रीटिंग्ज

  3.   रोडर म्हणाले

    हे उल्लेखनीय आहे की इतर भाषा वापरल्या जाऊ शकतात, जसे की ऑब्जेक्टिव्ह-सी (++), सी ++, डी किंवा रस्ट.

    1.    अ‍ॅड्रियनअरोयोस्ट्रिट म्हणाले

      हे सी ++ मध्ये आहे, सी नाही. तथापि, बरेच सी ++ ऑपरेटरला नवीन आणि हटविलेले ऑपरेटर यासारख्या लायब्ररीचे समर्थन आवश्यक असल्याने फरक पाहणे अवघड आहे. रस्टमध्ये एक ऑपरेटिंग सिस्टम बनविणे खूप मनोरंजक असेल. रस्ट (irc.mozilla.net वर # रस्ट-ओसदेव) वर ऑपरेटिंग सिस्टमला समर्पित प्रत्यक्षात एक आयआरसी चॅनेल आहे. जो कोणी मशीन कोडची कंपाईल करतो तो खरोखरच वाचतो, आम्ही जीसीजे वापरत असल्यास जावा सहित.

      1.    रोडर म्हणाले

        होय, खरंच, ऑपरेटिंग सिस्टमसाठी रस्ट ही एक अतिशय मनोरंजक भाषा आहे, कारण सी किंवा सी ++ पेक्षा शिकणे केवळ सोपे नाही (अद्याप सतत बदल होत राहते परंतु ते अधिक सोपे आहे) परंतु ती अधिक सुरक्षित आहे.

  4.   रोडर म्हणाले

    70 च्या दशकात ओएसशिवाय हार्डवेअरवर थेट प्रोग्राम करणे सामान्य होते.

  5.   ख्रिस्तोफर म्हणाले

    उत्कृष्ट ... आता मला फक्त हे समजणे आवश्यक आहे: 3 ...

  6.   Mmm म्हणाले

    हाय. या लेखांबद्दल मनापासून आभार. परंतु, माझ्याकडे प्रोग्रामिंग ज्ञान नसल्यास, मला असे करावे असे वाटत नाही, बरोबर? म्हणजे, नाही तर ते "चांगले, आणि आता मी कॉपी आणि पेस्ट काय करावे?" ... किती वाईट, मला नेहमी इतके प्रोग्राम कसे करावे हे जाणून घ्यायचे होते, मी गाढव अधिक आहे!

    1.    desikoder म्हणाले

      स्वत: ला दोष देऊ नका, तुम्ही गाढव नाही. सर्वप्रथम, सर्व प्रोग्रामरना कर्नल कसे लिहावे हे माहित नाही, ही एक अगदी सोपी कार्य आहे, आणि प्रत्यक्षात ती मोठी आहे. उदाहरणार्थ येथे लेखक कीबोर्ड आणि स्क्रीनसाठी जेनेरिक ड्राइव्हर्स तयार करतात, स्क्रीन अ‍ॅरेमध्ये फेरफार करतात, ही एक पद्धत आहे जी आजकाल वापरली जात नाही. लिनक्समधील टीटी आज खूप, अतिशय गुंतागुंतीचे आहेत आणि x86 आर्किटेक्चरच्या स्क्रीनवर अ‍ॅरे ठेवण्यावर अवलंबून नाहीत. याव्यतिरिक्त, सी मधील बरेचसे कोड आर्किटेक्चरवर अवलंबून असतात, जेव्हा आर्किटेक्चर कोड एसेम्बलरमध्ये बनविणे आणि सी कोड कोणत्याही प्रोसेसरवर कार्य करतो. तथापि, मी लेखकापासून दूर नाही, कारण कर्नल आज आपल्याला लिनक्स कर्नलमध्ये सामान्य मानणारी वैशिष्ट्ये आत्मसात करतो, उदाहरणार्थ, हे सोपे काम नाही, आणि खात्री बाळगा की एकट्या व्यक्ती ते करण्यास असमर्थ आहे. एखाद्या गोष्टीसाठी लिनक्स, जीसीसी, ग्लिबिक इत्यादीसारखे मोठे प्रकल्प एकट्या व्यक्तीने बनविलेले नसून बर्‍याच सहयोगी आहेत.

      तसेच, आपण प्रोग्रामिंग सुरू करू इच्छित असल्यास, आपल्याकडे वेबवर काही मार्गदर्शक आहेत, तरीही सावधगिरी बाळगणे आवश्यक आहे, आणि चांगले मार्गदर्शक निवडा. मी डोक्यावर आणि पाण्याशिवाय (म्हणजे प्रिय सी भाषेसह) तलावात उडी मारण्याच्या लिनक्समध्ये प्रोग्रामिंग करण्यास सुरवात केली, जरी आता माझ्याकडे अजगर (मूलभूत भाषा देखील आहे) याबद्दल काही मूलभूत कल्पना आहेत. अशी काही सी पुस्तके आहेत ज्यात आपण पृष्ठ 6 वर जितकी डोकेदुखी मिळवितो तितके सोडले आहे, परंतु पुस्तकांपेक्षा या गोष्टी अनुभवाने घेतल्या गेल्या आहेत. हे OSI नेटवर्क मॉडेल प्रमाणेच होते. ओसी मॉडेलबद्दलचे दस्तऐवजीकरण नवोदितासाठी समजणे पूर्णपणे अशक्य आहे, परंतु नेटवर्क थरांचे चांगले स्पष्टीकरण असलेली एखादी साइट आपल्याला आढळल्यास आपल्याला आरएफसी सारख्या तांत्रिक कागदपत्रांसह त्वरित संकल्पना येतील.

      थोडक्यात, तेथे चांगल्या वेबसाइट्स आणि मॅन्युअल बाहेर आहेत, त्यास खाली उतरणे आणि चांगली सामग्री शोधणे ही बाब आहे.

      कोट सह उत्तर द्या

  7.   स्वातंत्र्य म्हणाले

    हॅलो, "त्रुटी सोडविण्यासाठी खूप प्रयत्न करूनही: कोणतेही मल्टीबूट हेडर सापडले नाही." आणि «त्रुटी आपल्याला प्रथम कर्नल लोड करण्याची आवश्यकता आहे since, कारण माझ्यासारख्या काहीजणांच्यासारख्या पहिल्या लेखाच्या समस्येचे निराकरण मला कोठेही सापडले नाही ... हे समाधान एखाद्याचे कार्य करत असल्यास, येथे आहे ...

    त्रुटीच्या कारणास्तव माझा सिद्धांत योग्य आहे की नाही हे मला माहित नाही परंतु तरीही, प्रश्न असा आहे की 32-बीट ऑपरेटिंग सिस्टममध्ये फायली संकलित करताना त्रुटी निर्माण झाली नाही, परंतु माझ्याकडे 64-बीट ऑपरेट आहे सिस्टम (जीएनयू / लिनक्स डेबियन)), आणि संकलन आणि चाचणी करताना मला "मल्टीबूट हेडर सापडला नाही" अशी त्रुटी मिळाली आणि त्यात शंका आहे, मग माझ्या मते त्रुटी ऑपरेटिंग सिस्टमच्या वातावरण किंवा आर्किटेक्चरमुळे झाली. ज्यामध्ये आपण आमच्या फाईल्सचे संकलन करीत आहोत ... आणि माझ्या फाईल्सचे संकलन करणे म्हणजे 7 बीट्सचे वातावरण किंवा आर्किटेक्चर निर्दिष्ट करणे.
    * sudo as -o kernel.o -c kernel.asm -32
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -Nostdlib -fPIC -Freestanding -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -link.ld -nostdlib -fPIC -Freestanding
    विचित्र गोष्ट अशी आहे की मला काही शंका आहेत हाहा, मग आपण चरण-दर-चरण तयार करीत असलेली ऑपरेटिंग सिस्टम एक x86 आर्किटेक्चरसाठी आहे किंवा मी चुकीचा अजजाज आहे….

    PS: संशयासाठी मला मदत करण्यासाठी कोणीतरी, आणि काही शब्दलेखन त्रुटी किंवा माझ्या वाईट अभिव्यक्तीचे निमित्त घ्या, आणि तसेच मी परिपूर्ण नाही «परफेक्शन्सची किंमत आहे»…. आणि मुख्य म्हणजे, 32-बिट ऑपरेटिंग सिस्टमचे अनुकरण करा पवित्र समाधान … .हाहाहा

    1.    मार्टिन व्हिलाबा म्हणाले

      अलौकिक बुद्धिमत्ता ! मला हे ट्यूटोरियल खरोखर करायचे होते आणि मी चुकून हॅचसह सुरवातीस खाली उतरलो

  8.   ऑस्कर म्हणाले

    अभिनंदन, हे एक उत्कृष्ट योगदान आहे. आतापासून मी तुमच्याबरोबर सामायिक करतो की तुमच्याद्वारे आणि इतरांच्या माध्यमातून तुमचे चांगले कार्य वाढविले जाईल;

    कोट सह उत्तर द्या