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

या पाचव्या हप्त्यात आम्ही जीडीटीसारखे सिद्धांत आणि उपयोगात दोन्ही सारख्याच सारणीचे टेबल पाहू. आम्ही आयडीटीचा संदर्भ घेऊ. आयडीटी म्हणजे व्यत्यय वर्णन सारणी y ही एक टेबल आहे जी उद्भवणार्‍या व्यत्ययांना हाताळण्यासाठी वापरली जाते. उदाहरणार्थ, कोणीतरी 0 ने भागाकार करते, प्रक्रियेच्या प्रभारी कार्य म्हणतात. ही कार्ये आयएसआर (व्यत्यय सेवा नियमित). चला तर आयडीटी तयार करू आणि काही आयएसआर जोडू.

प्रथम आम्ही आयडीटीशी संबंधित स्ट्रक्चर्स घोषित करणार आहोत.

struct Entry{
uint16_t base_low;
uint16_t sel;
uint8_t always0;
uint8_t flags;
uint16_t base_high;
} __attribute__((packed));
struct Ptr{
uint16_t limit;
uint32_t base;
} __attribute__((packed));

जीडीटीशी तुलना केल्यास हे दिसून येते की, पीटीआर स्ट्रक्चर एकसारखे आहे आणि एन्ट्री अगदी एकसारखीच आहे. म्हणून प्रविष्टी (सेटेट) ठेवणे आणि स्थापित करणे (स्थापित करणे) ही कार्ये समान आहेत.

void ND::IDT::SetGate(uint8_t num,uint32_t base,uint16_t sel, uint8_t flags)
{
idt[num].base_low=(base & 0xFFFF);
idt[num].base_high=(base >> 16) & 0xFFFF;
idt[num].sel=sel;
idt[num].always0=0;
idt[num].flags=flags;
}

स्थापित करा:

idtptr.limit=(sizeof(struct ND::IDT::Entry)*256)-1;
idtptr.base=(uint32_t)&idt;
ND::Memory::Set(&idt,0,sizeof(struct ND::IDT::Entry)*256);
ND::IDT::Flush();

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

asm volatile("lidtl (idtptr)");

जर सर्व काही व्यवस्थित होत असेल आणि आम्ही सौंदर्यात्मक व्यवस्था केली तर ती यासारखे दिसली पाहिजे:

NextDivel-RTD

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

आम्ही हे आयडीटीच्या स्थापित कार्यामध्ये मेमरी सेटिंग आणि फ्लश दरम्यान जोडतो:

ND::IDT::SetGate(0,(unsigned)ND::ISR::ISR1,0x08,0x8E);

कॉलबॅक फंक्शन एनडी :: आयएसआर :: आयएसआर 1 असणार आहे जे आम्हाला एएसएम वापरणे आवश्यक आहे.

void ND::ISR::ISR1()
{
asm volatile(
"cli \n"
"pushl 0 \n"
"pushl 0 \n"
"jmp ND_ISR_Common \n"
);
}

आम्ही एनडी_आयएसआर_कॉमोनला सी भाषेमधील फंक्शन म्हणून परिभाषित करू. फाईल्स सेव्ह करण्यासाठी आणि वाचनीयता सुधारण्यासाठी आम्ही बाह्य «सी» {use वापरू शकतो.

extern "C"
void ND_ISR_Common()
{
asm volatile(
"pusha \n"
"push %ds \n"
"push %es \n"
"push %fs \n"
"push %gs \n"
"movw $0x10, %ax \n"
"movw %ax, %ds \n"
"movw %ax, %es \n"
"movw %ax, %fs \n"
"movw %ax, %gs \n"
"movl %esp, %eax \n"
"push %eax \n"
"movl $ND_ISR_Handler, %eax \n"
"call *%eax \n"
"popl %eax \n"
"popl %ds \n"
"popl %es \n"
"popl %fs \n"
"popl %gs \n"
"popa \n"
"addl 8, %esp \n"
"iret \n"
);
}

एएसएम मधील हा कोड समजणे थोडे अवघड आहे परंतु असे आहे कारण इंटरप्टद्वारे व्युत्पन्न केलेल्या डेटामध्ये प्रवेश करण्यासाठी आम्ही सी मध्ये एक रचना घोषित करणार आहोत. अर्थात, आपल्याला ते नको असल्यास आपण एनडी :: आयएसआर :: आयएसआर 1 किंवा असे काहीतरी कर्नल पॅनिक कॉल करू शकता. संरचनेचा आकार असा आहे कीः

struct regs{
uint32_t ds;
uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax;
uint32_t int_no, err_code;
uint32_t eip, cs, eflags, useresp, ss;
};

आणि शेवटी आम्ही एनडी_आयएसआर_हँडलर फंक्शन (सी लिंकसह देखील) बनवितो ज्यामध्ये आम्ही कर्नल पॅनिक दर्शवितो आणि आपल्याकडे असलेल्या त्रुटींच्या सूचीतील त्रुटीनुसार त्याचे लहान वर्णन आहे.

extern "C"
void ND_ISR_Handler(struct regs *r)
{
if(r->int_no < 32) { ND::Panic::Show(exception_messages[r->int_no]);
for(;;);
}
}

बरं, यासह आम्ही हा व्यत्यय हाताळू शकतो. उर्वरित व्यत्ययांसह हे असेच होते की काही परत करणारे काही घटक आहेत आणि आम्ही ते प्राप्त करण्यासाठी रेग रचना वापरतो. तथापि, आपण आश्चर्यचकित व्हाल की खरोखर कार्य करते की नाही हे आम्हाला कसे माहित आहे. हे कार्य करते की नाही हे तपासण्यासाठी आम्ही एनडी :: आयडीटी :: इन्स्टॉल () नंतर एक सोपी ओळ लागू करणार आहोत.

int sum=10/0;

आम्ही संकलित केल्यास ते आपल्याला चेतावणी देईल आणि आम्ही ते कार्यान्वित करण्याचा प्रयत्न केल्यास आम्हाला एक छान स्क्रीन मिळेल:

नेक्स्टडिव्हल-आयएसआर
आणि हे पोस्ट संपल्यानंतर मला वाटते की हे सर्वात विस्तृत परंतु कार्यशील आहे.


लेखाची सामग्री आमच्या तत्त्वांचे पालन करते संपादकीय नीति. त्रुटी नोंदविण्यासाठी क्लिक करा येथे.

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

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

आपला ई-मेल पत्ता प्रकाशित केला जाणार नाही.

*

*

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

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

    मी एलएफएसवर स्विच केले, हे अधिक सतत आहे.

  2.   इलियोटाइम 3000 म्हणाले

    पवित्र ... असो, शिकवण्या चांगल्या आहेत.

  3.   sc म्हणाले

    खूप चांगले, मी सुरुवातीपासूनच त्याचे अनुसरण करीत आहे. आपण प्रत्येक ट्रेलरवर कोड संलग्न करू शकाल?

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

      आपल्याकडे गिटहबवर सर्व स्त्रोत कोड उपलब्ध आहे: http://github.com/AdrianArroyoCalle/next-divel तेथून आपण झिप, टीएआर.झेड किंवा डाउनलोड करू शकता.

  4.   nuanced म्हणाले

    हाहााहा खूप छान! मंजूर! 🙂