Kudayasho Linus Torvalds: Abuur nidaam kuu gaar ah oo aad ku shaqeyso 0 (V)

Qeybtan shanaad waxaan ku arki doonnaa miis la mid ah GDT aragti ahaan iyo adeeg ahaanba, waxaan tixraaceynaa IDT. IDT waxay u taagan tahay Jadwalka Sharaxa ee Hakad Geliya y waa miis loo adeegsado in lagu qabto khalkhalka dhaca. Tusaale ahaan, qof ayaa u kala qeybiya 0, howsha mas'uul ka ah howsha ayaa loo yaqaan. Hawlahaani waa ISR (Joogtaynta Adeegyada Joogtada ah). Marka aan abuurno IDT oo aan ku darno xoogaa ISR ah.

Marka hore waxaan ku dhawaaqeynaa qaababka u dhigma 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));

Sida la arki karo haddii aad isbarbar dhigto GDT, Qaab dhismeedka Ptr waa isku mid, gelitaankuna waa isku mid. Sidaa darteed shaqooyinka gelinta gelitaanka (SetGate) iyo rakibidda (Ku rakibidda) aad ayey isugu eg yihiin.

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

Ku rakib:

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

Haddii aan eegno waxaan arki doonnaa in hawsha rakibidda ay adeegsanayso ND :: Memory :: Set function oo aan ku sheegnay boostada kale. Waxaan sidoo kale arki karnaa sida aanan wax wicitaan ah ugu sameynin SetGate weli waxaanan u wici karnaa ND :: IDT :: Flush, shaqadan awgeed waxaan mar labaad u adeegsannaa bayaanka isbeddelka asm:

asm volatile("lidtl (idtptr)");

Haddii wax walboo hagaagaan oo aan sameyno qaab isku qurxin ah waa inay u egtahay sidan:

NextDivel-RTD

Hagaag, hadda waxaan bilaabi doonnaa buuxinta IDT-ga oo kala goynta ah. Halkan waxaan ka abuurayaa mid keliya laakiin inta kale waxay la mid noqon doontaa. Waxaan doonayaa inaan ku kala qaybiyo eber break. Sidaad ku ogtahay xisaabta, lambar looma qeybin karo 0. Haddii tani ku dhacdo processor-ka, ka reebitaan ayaa la soo saarayaa maadaama uusan sii socon karin. In IDT ka joojinta koowaad ee liiska (0) u dhiganta dhacdadan.

Waxaan ku darnaa tan inta udhaxeysa xusuusta iyo daadinta gudaha rakibida shaqada ee IDT:

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

Hawsha wicitaanku waxay noqoneysaa ND :: ISR :: ISR1 taas oo aad u fudud in kastoo aan adeegsaneyno ASM:

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

Waxaan qeexi doonnaa ND_ISR_Common oo ah shaqo ku shaqeysa luqadda C. Si loo badbaadiyo faylasha loona hagaajiyo akhrinta waxaan isticmaali karnaa banaanka "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"
);
}

Koodhkan ASM wuu yara adkaan karaa in la fahmo laakiin tani waa sababta oo ah waxaan ku dhawaaqi doonnaa qaab dhismeedka C si loo helo xogta ka dhalatay carqaladeynta. Sida iska cad, hadaadan rabin taa, waxaad wici kartaa Kernel Panic ee ND :: ISR :: ISR1 ama wax la mid ah. Qaab dhismeedku wuxuu leeyahay qaab sida:

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

Ugu dambayntiina waxaan qabannaa hawsha 'ND_ISR_Handler' (oo weliba leh xiriiriyaha 'C') oo aan ku muujinno argagax yar yar iyo sharraxaad yar oo ku saabsan qaladka sida ku cad midka khaladaadka.

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

Wanaagsan oo tan tan ayaan awalba awoodnaa inaan wax ka qabanno hakadkan. Inta kale ee carqaladeynta ah waxay u dhici doontaa si la mid ah marka laga reebo inay jiraan qaar soo celiya xuduudaha oo aan u isticmaali lahayn qaab dhismeedka si aan u helno. Si kastaba ha noqotee, waxaad la yaabi kartaa sida aan ku ogaanayno inay runti shaqeyso iyo in kale. Si loo tijaabiyo haddii ay shaqeyneyso waxaan soo bandhigi doonaa xariiq fudud ka dib ND :: IDT :: Ku rakib ():

int sum=10/0;

Haddii aan ururinno waxay na siin doontaa digniin haddii aan isku dayno inaan fulino waxaan heli doonaa shaashad fiican:

Xigasho-ISR


Tanina waxay ku dhammaaneysaa boostadan, waxaan u maleynayaa inay tahay mid ka mid ah kuwa ugu ballaaran laakiin aad u shaqeynaya.


Ka tag faalladaada

cinwaanka email aan la daabacin doonaa. Beeraha loo baahan yahay waxaa lagu calaamadeeyay la *

*

*

  1. Masuul ka ah xogta: Miguel Ángel Gatón
  2. Ujeedada xogta: Xakamaynta SPAM, maaraynta faallooyinka.
  3. Sharci: Oggolaanshahaaga
  4. Isgaarsiinta xogta: Xogta looma gudbin doono dhinacyada saddexaad marka laga reebo waajibaadka sharciga ah.
  5. Kaydinta xogta: Macluumaadka ay martigelisay Shabakadaha Occentus (EU)
  6. Xuquuqda: Waqti kasta oo aad xadidi karto, soo ceshan karto oo tirtiri karto macluumaadkaaga.

  1.   Xulka wararka oo dhan dijo

    Waxaan aaday LFS, way sii soconaysaa.

  2.   Waqti dheer 3000 dijo

    Quduus ... Si kastaba ha noqotee, casharradu way wanaagsan yihiin.

  3.   sc dijo

    Aad u fiican, waan la socday bilowgii. Miyaad ku lifaaqi kartaa nambarada trailer kasta?

    1.    AdrianArroyoStreet dijo

      Waxaad haysaa dhammaan koodhka ilaha laga heli karo GitHub: http://github.com/AdrianArroyoCalle/next-divel Halkaas waxaad kala soo bixi kartaa ZIP, TAR.GZ ama isticmaal kaliya git.

  4.   nuanced dijo

    Hahaha aad u wanaagsan! Ansixi! 🙂