Ukulingisa i-Linus Torvalds: Dala uhlelo lwakho lokusebenza kusuka ku-0 (V)

Kulesi sitolimende sesihlanu sizobona itafula elifana ncamashi ne-GDT ngombono nangokusetshenziswa, sibhekisa ku-IDT. IDT imele Ukuphazamisa Ithebula Lencazelo y itafula elisetshenziselwa ukuphatha ukuphazamiseka okwenzekayo. Isibonelo, othile wenza ukwahlukana ngo-0, umsebenzi ophethe ukucubungula ubizwa. Le misebenzi yi-ISR (Ukuphazamisa Imizila Yesevisi). Ngakho-ke ake sakhe i-IDT bese sengeza i-ISR ethile.

Okokuqala sizomemezela izakhiwo ezihambelana ne-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));

Njengoba kungabonakala uma uyiqhathanisa ne-GDT, isakhiwo se-Ptr siyefana futhi Ukungena kufana ncamashi. Ngakho-ke imisebenzi yokufaka (SetGate) nokufaka (Faka) iyafana kakhulu.

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

Faka:

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

Uma sibheka sizobona ukuthi umsebenzi wokufaka usebenzisa i-ND :: Memory :: Setha umsebenzi esasimemezele kokunye okuthunyelwe. Singabonga futhi ukuthi asenzi kanjani izingcingo ku-SetGate okwamanje futhi sibiza i-ND :: IDT :: Flush, kulo msebenzi sisebenzisa isitatimende esingajwayelekile se-asm futhi:

asm volatile("lidtl (idtptr)");

Uma konke kuhamba kahle futhi senza ukuhleleka okuhle kufanele kubukeke kanjena:

OlandelayoDivel-IDT

Kulungile, manje ake siqale ukugcwalisa i-RTD ngeziphazamiso. Lapha ngizokwakha eyodwa kuphela kepha kokunye kuzofana. Ngizokwenza ukwahlukanisa ngekhefu elinguziro. Njengoba wazi kahle kwi-mathematics, inombolo ayinakuhlukaniswa ngo-0. Uma lokhu kwenzeka kuphrosesa, okuhlukile kuyenziwa ngoba akukwazi ukuqhubeka. Ku-IDT ukuphazamiseka kokuqala kuhlu (0) kufana nalo mcimbi.

Sifaka lokhu phakathi kokuhlelwa kwememori nokugeleza ngaphakathi komsebenzi wokufaka we-IDT:

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

Umsebenzi wokubuyela emuva uzoba yi-ND :: ISR :: ISR1 elula impela yize kumele sisebenzise i-ASM:

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

Sizochaza i-ND_ISR_Common njengomsebenzi ngolimi lwe-C. Ukonga amafayela nokwenza ngcono ukufundeka singasebenzisa i-extern «C» {}:

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

Le khodi ku-ASM ingaba nzima ukuyiqonda kepha lokhu kungenxa yokuthi sizomemezela isakhiwo ku-C ukuthola imininingwane eyenziwe ukuphazamiseka. Ngokusobala, uma ungakufuni lokho, ungavele ushayele iKernel Panic ku-ND :: ISR :: ISR1 noma into enjalo. Isakhiwo sinokuma okunje:

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

Futhi ekugcineni senza umsebenzi we-ND_ISR_Handler (futhi onesixhumanisi se-C) lapho sikhombisa khona ukwethuka kwe-kernel nencazelo encane yephutha ngokusho kwaleso esinaso ohlwini lwamaphutha.

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

Kuhle futhi ngalokhu sesivele sikwazi ukubhekana nalokhu kuphazamiseka. Ngokunye ukuphazamiseka kuzokwenzeka okufanayo ngaphandle kokuthi kukhona ezinye ezibuyisa amapharamitha futhi besizosebenzisa isakhiwo se-reg ukusithola. Kodwa-ke, ungazibuza ukuthi sazi kanjani ukuthi iyasebenza ngempela. Ukuhlola ukuthi kuyasebenza yini sizokwethula umugqa olula ngemuva kwe-ND :: IDT :: Faka ():

int sum=10/0;

Uma sihlanganisa kuzosinika isexwayiso futhi uma sizama ukusisebenzisa sizothola isikrini esihle:

OlandelayoDivel-ISR


Futhi ngalokhu kuphela lokhu okuthunyelwe, ngicabanga ukuthi kungenye yezinto ezibanzi kakhulu kepha ezisebenza kahle.


Shiya umbono wakho

Ikheli lakho le ngeke ishicilelwe. Ezidingekayo ibhalwe nge *

*

*

  1. Ubhekele imininingwane: Miguel Ángel Gatón
  2. Inhloso yedatha: Lawula Ugaxekile, ukuphathwa kwamazwana.
  3. Ukusemthethweni: Imvume yakho
  4. Ukuxhumana kwemininingwane: Imininingwane ngeke idluliselwe kubantu besithathu ngaphandle kwesibopho esisemthethweni.
  5. Isitoreji sedatha: Idatabase ebanjwe yi-Occentus Networks (EU)
  6. Amalungelo: Nganoma yisiphi isikhathi ungakhawulela, uthole futhi ususe imininingwane yakho.

  1.   I-Mesodabler kusho

    Ngishintshele ku-LFS, kuyaqhubeka ngokwengeziwe.

  2.   eliotime3000 kusho

    Ngcwele ... Nokho, okokufundisa kuhle.

  3.   sc kusho

    Kuhle kakhulu, bengilokhu ngikulandela kusukela ekuqaleni. Ungakwazi ukunamathisela amakhodi kunqola ngayinye?

    1.    AdrianArroyoStreet kusho

      Unayo yonke ikhodi yomthombo etholakala ku-GitHub: http://github.com/AdrianArroyoCalle/next-divel Ukusuka lapho ungalanda i-ZIP, i-TAR.GZ noma vele usebenzise i-git.

  4.   kunhlanhlathisiwe kusho

    Hahaha kuhle kakhulu! Vuma! 🙂