Kuteedzera Linus Torvalds: Gadzira yako yega sisitimu yekushandisa kubva ku0 (V)

Muchikamu chino chechishanu tichaona tafura yakafanana neiyo GDT mune dzidziso uye mukushandisa, isu tinoreva iyo IDT. IDT inomiririra Kuvhiringidza Tsananguro Tafura y tafura inoshandiswa kugadzirisa zvinokanganisa zvinoitika. Semuenzaniso, mumwe munhu anoita kupatsanurwa ne0, iro basa rinotarisira kugadzirisa rinodaidzwa. Aya mabasa iiyo ISR (Kanganisa Service Maitiro). Saka ngatigadzirei IDT uye tiwedzere imwe ISR.

Kutanga tichaenda kuzivisa zvivakwa zvinoenderana neIDT:

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

Sezvinoonekwa kana iwe uchizvienzanisa neGDT, iyo Ptr chimiro yakafanana uye iyo yeKupinda yakafanana. Naizvozvo mabasa ekuisa yekupinda (SetGate) uye kuisa (Isa) akafanana zvakafanana.

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

Gadza:

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

Kana tikatarisa tichaona kuti iyo yekuisa basa inoshandisa iyo ND :: Ndangariro :: Seta basa ratakange tazivisa mune imwe posvo. Tinogona zvakare kukoshesa maitiro atisingachaidze chero ku SetGate parizvino uye tinodaidza ND :: IDT :: Flush, pabasa iri tinoshandisa chirevo che asm chisina kugadzikana zvakare:

asm volatile("lidtl (idtptr)");

Kana zvese zvikafamba mushe uye isu togadzira aesthetic kurongeka inofanirwa kutaridzika seiyi:

InoteveraDivel-IDT

Zvakanaka, ikozvino tave kuzotanga kuzadza iyo IDT nekukanganisa. Pano ndiri kuzogadzira imwe chete asi kune vamwe vese zvinenge zvakafanana. Ndiri kuzoita kupatsanura ne zero break. Sezvo iwe uchinyatso kuziva mune masvomhu, nhamba haigone kupatsanurwa ne 0. Kana izvi zvikaitika muprosesa, chisarudzika chinogadzirwa sezvo chisingakwanise kuenderera. MuIDT kukanganisa kwekutanga mune runyorwa (0) kunoenderana nechiitiko ichi.

Isu tinowedzera izvi pakati pekumisikidza ndangariro uye iyo yekumusoro mukati meIsa basa reiyo IDT:

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

Basa rekufona richazove ND :: ISR :: ISR1 iri nyore kunyangwe tichifanira kushandisa ASM:

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

Tichatsanangura ND_ISR_Common sebasa mumutauro weC. Kuchengeta mafaera nekuvandudza kuverenga zvinoitika tinogona kushandisa 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"
);
}

Iyi kodhi muASM inogona kunetsa kunzwisisa asi izvi imhaka yekuti tichaenda kuzivisa chimiro muC kuti tiwane data rakagadzirwa nekukanganisa. Zviripachena, kana iwe usiri kuda izvo, unogona kungodaidza iyo Kernel Panic mu ND :: ISR :: ISR1 kana chimwe chakadai. Chimiro chine chimiro chakadai kuti:

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

Uye pakupedzisira tinoita iyo ND_ISR_Handler basa (zvakare neC chinongedzo) matiri kuratidza kernel kuvhunduka uye diki tsananguro yekukanganisa zvinoenderana neyatinayo mune runyorwa rwezvikanganiso.

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

Zvakanaka, neizvi isu tinokwanisa kubata kukanganisa uku. Nezvimwe zvinokanganisa zvaizoitika zvakafanana kunze kwekunge paine mamwe anodzosera ma parameter uye isu taizoshandisa iyo reg chimiro kuti tiiwane. Zvisinei, unogona kushamisika kuti tinoziva sei kana ichinyatso kushanda. Kuti uedze kana ichishanda isu tichaunza mutsara wakapusa mushure meN ND :: IDT :: Isa ():

int sum=10/0;

Kana tikanyora ichatipa yambiro uye kana isu tikaedza kuzviita isu tinowana yakanaka skrini:

InoteveraDivel-ISR


Uye nemhedzisiro iyi posvo, ndinofunga ndeimwe yeakanyanya kuwanda asi anoshanda.


Siya yako yekutaura

Your kero e havazobvumirwi ichibudiswa. Raida minda anozivikanwa ne *

*

*

  1. Inotarisira iyo data: Miguel Ángel Gatón
  2. Chinangwa cheiyo data: Kudzora SPAM, manejimendi manejimendi.
  3. Legitimation: Kubvuma kwako
  4. Kutaurirana kwedata
  5. Dhata yekuchengetedza: Dhatabhesi inobatwa neOccentus Networks (EU)
  6. Kodzero: Panguva ipi neipi iwe unogona kudzora, kupora uye kudzima ruzivo rwako

  1.   mesodabler akadaro

    Ini ndakachinjira kuLFS, iri kuramba ichienderera.

  2.   eliotime3000 akadaro

    Mutsvene ... Zvisinei, iwo maitirwo akanaka.

  3.   sc akadaro

    Zvakanaka kwazvo, ndanga ndichizvitevera kubva pakutanga. Unogona kubatanidza makodhi kune imwe tirera?

    1.    AdrianArroyoStreet akadaro

      Iwe une yese kodhi kodhi inowanikwa paGitHub: http://github.com/AdrianArroyoCalle/next-divel Kubva ipapo unogona kurodha pasi ZIP, TAR.GZ kana kungoshandisa git.

  4.   nuanced akadaro

    Hahaha zvakanaka kwazvo! Bvumira! 🙂