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:
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:
Futhi ngalokhu kuphela lokhu okuthunyelwe, ngicabanga ukuthi kungenye yezinto ezibanzi kakhulu kepha ezisebenza kahle.
Ngishintshele ku-LFS, kuyaqhubeka ngokwengeziwe.
Ngcwele ... Nokho, okokufundisa kuhle.
Kuhle kakhulu, bengilokhu ngikulandela kusukela ekuqaleni. Ungakwazi ukunamathisela amakhodi kunqola ngayinye?
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.
Hahaha kuhle kakhulu! Vuma! 🙂