د لینس تورالډز تقلید کول: له 0 (V) څخه خپل عملیاتي سیسټم رامینځته کړئ.

پدې پنځم قسط کې به موږ یو میز وګورو چې د GDT سره ورته ورته دی دواړه په تیوري او کارول کې ، موږ IDT ته مراجعه کوو. IDT معنی ده د مداخلو تشریح جدول y یو جدول دی چې د مداخلو د اداره کولو لپاره کارول کیږي چې پیښیږي. د مثال په توګه ، یو څوک د 0 لخوا برخه جوړوي ، د پروسس کولو مسؤل ته ویل کیږي. دا دندې ISR دي (د خدمتونو ورځنۍ مداخله). نو راځئ چې IDT رامینځته کړو او یو څه ISR اضافه کړو.

لومړی موږ د IDT سره اړوند جوړښتونه اعلان کوو:

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));

لکه څنګه چې لیدل کیدی شي که تاسو دا د GDT سره پرتله کړئ ، د Ptr جوړښت ورته دی او ننوتنه ورته ورته ده. له همدې امله د ننوتلو (سیټ گیټ) ایښودلو او نصب (نصب) کارونه خورا ورته دي.

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();

که موږ وګورو موږ به وګورو چې د نصب کولو فن ND :: میموري :: سیټ فنکشن کاروي چې موږ یې په بل پوسټ کې اعلان کړی و. موږ دا هم لیدلی شو چې موږ تر اوسه سټګیټ ته هیڅ تلیفون نه کوو او موږ ND :: IDT :: فلش کوو ، د دې دندې لپاره موږ د asm خوځنده بیان بیا کار کوو:

asm volatile("lidtl (idtptr)");

که هرڅه سم پرمخ لاړ شي او موږ یو ښکلا تنظیم کړو نو دا باید ورته ښکاري:

NextDivel-RTD

ښه ، اوس موږ د مداخلو سره د RTD ډکولو پیل کوو. دلته زه یوازې یو رامینځته کول غواړم مګر د پاتې لپاره به ورته وي. زه د صفر ماتولو لخوا ویش ترسره کوم. لکه څنګه چې تاسو په ریاضي کې ښه پوهیږئ ، یو شمیر د 0 لخوا نشي ویشل کیدی که چیرې دا په پروسیجر کې پیښ شي نو یو استثنا رامینځته کیږي ځکه چې دوام نشي کولی. په IDT کې په لیست کې لومړی مداخله (0) د دې پیښې سره سمون لري.

موږ دا د IDT په نصب کار کې د حافظې ترتیب او فلش ترمینځ اضافه کوو:

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

د زنګ وهلو فعالیت ND :: ISR :: ISR1 وي کوم چې خورا اسانه دی که څه هم موږ باید ASM وکاروو:

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

ND_ISR_Common موږ به دا په C ژبه کې د فنکشن په توګه تعریف کړو. د فایلونو خوندي کولو او لوستلو ته وده ورکولو لپاره موږ کولی شو خارجی «C» {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"
);
}

په ASM کې دا کوډ پوهیدل یو څه ستونزمن کیدی شي مګر دا دی ځکه چې موږ په سی کې داسې یو جوړښت اعلان کوو چې د مداخلې لخوا رامینځته شوي ډیټا ته لاسرسی ومومي. په ښکاره ډول ، که تاسو دا ونه غواړئ ، تاسو کولی شئ په ND :: ISR :: ISR1 یا د دې په ورته یو څه کې د کرنیل پینیک تلیفون وکړئ. جوړښت داسې ب shapeه لري چې:

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;
};

او په نهایت کې موږ د ND_ISR_Handler فنکشن ترسره کوو (هم د C لینک سره) په کوم کې چې موږ د کنډل ویره او د هغه غلطیت په اړه یو کوچنی توضیح ښیو چې موږ یې د غلطیو لیست کې لرو.

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

ښه او د دې سره موږ دمخه توان لرو چې دا مداخله اداره کړو. د پاتې مداخلو سره به ورته پیښ شي پرته لدې چې دلته ځینې بیرته پیرامیټونه شتون لري او موږ به یې د ترلاسه کولو لپاره د راجسټر جوړښت وکاروو. په هرصورت ، تاسو ممکن حیران شئ چې موږ څنګه پوهیږو که دا واقعیا کار کوي. د ازموینې لپاره که چیرې دا کار کوي موږ د ND :: IDT :: انسټال () وروسته یو ساده لاین معرفي کوو:

int sum=10/0;

که موږ تالیف وکړو دا به موږ ته خبرتیا راکړي او که موږ د دې پلي کولو هڅه وکړو نو موږ به یو ښه پرده ترلاسه کړو:

NextDivel-ISR
او د دې پوسټ پای سره ، زه فکر کوم چې دا یو له خورا پراخه مګر خورا فعال دی.


د مقالې مینځپانګه زموږ د اصولو سره سمون لري ایډیټیک اخلاق. د غلطۍ راپور ورکولو لپاره کلیک وکړئ دلته.

5 نظرونه ، خپل پریږدئ

خپله نظر پرېږدئ

ستاسو د بریښنا لیک پته به خپره نه شي.

*

*

  1. د معلوماتو لپاره مسؤل: میګیوانجل ګاتین
  2. د معلوماتو هدف: د سپیم کنټرول ، د نظر مدیریت.
  3. قانونیت: ستاسو رضایت
  4. د معلوماتو راټولول: معلومات به د قانوني مکلفیت پرته دریمې ډلې ته نه لیږدول کیږي.
  5. د معلوماتو ذخیره: ډیټابیس د Occentus شبکې (EU) لخوا کوربه شوی
  6. حقونه: په هر وخت کې تاسو کولی شئ خپل معلومات محدود ، له سره تنظیم او حذف کړئ.

  1.   میسوډیبلر dijo

    ما LFS ته لاړ ، دا ډیر دوام لري.

  2.   ایلیوټیم 3000 dijo

    پاک ... په هرصورت ، سبقونه ښه دي.

  3.   sc dijo

    ډیر ښه ، زه د پیل راهیسې دا تعقیب کوم. ایا تاسو کولی شئ په هر ټریلر کې کوډونه ضمیم کړئ؟

    1.    اډریان اریو سټریټ dijo

      تاسو په GitHub کې د ټولې سرچینې کوډ شتون لري: http://github.com/AdrianArroyoCalle/next-divel له هغه ځایه تاسو کولی شئ یو زپ ، TAR.GZ ډاونلوډ کړئ یا یوازې ګیټ وکاروئ.

  4.   nananced dijo

    هاهاها ډیر ښه! منظور یې کړئ! 🙂