Paggaya sa Linus Torvalds: Lumikha ng iyong sariling operating system mula sa simula (VI)

Okay, pagkatapos ng maikling pahinga, ipagpatuloy natin ang ating serye ng mga tutorial. Kung babalik tayo sa nakaraang code, dapat ay mayroon na tayong ISR para sa paghahati sa zero. Ngayon ay kailangan nating punan ang mga natitirang ISR na dati nating itinakdang mensahe (ang unang 32). Ngayon ay ipagpapatuloy natin ang pagprograma ng mga interrupt; gagawa tayo ng mga IRQ, na kilala rin bilang mga Interrupt Request. Ang mga IRQ na ito ay nabubuo ng mga hardware device tulad ng mga keyboard, mouse, printer, atbp. Sa una, ang unang 8 IRQ ay awtomatikong namamapa sa mga posisyon ng IDT 8 hanggang 15. Dahil ginamit natin ang unang 32 para sa mga exception, kailangan na natin itong i-remap muli. Magtatalaga tayo ng mga IRQ mula 32 hanggang 45. Para magawa ito, kailangan muna nating i-remap muli ang mga IRQ:

void ND::IRQ::Remap(int pic1, int pic2)
{
#define PIC1 0x20
#define PIC2 0xA0
#define ICW1 0x11
#define ICW4 0x01
/* send ICW1 */
ND::Ports::OutputB(PIC1, ICW1);
ND::Ports::OutputB(PIC2, ICW1);
/* send ICW2 */
ND::Ports::OutputB(PIC1 + 1, pic1); /* remap */
ND::Ports::OutputB(PIC2 + 1, pic2); /* pics */
/* send ICW3 */
ND::Ports::OutputB(PIC1 + 1, 4); /* IRQ2 -> connection to slave */
ND::Ports::OutputB(PIC2 + 1, 2);
/* send ICW4 */
ND::Ports::OutputB(PIC1 + 1, ICW4);
ND::Ports::OutputB(PIC2 + 1, ICW4);
/* disable all IRQs */
ND::Ports::OutputB(PIC1 + 1, 0xFF);
}

Gumagawa kami ngayon ng isang pag-andar upang mai-install ang mga IRQ:

void ND::IRQ::Install()
{
ND::Screen::SetColor(ND_SIDE_FOREGROUND,ND_COLOR_BLACK);
ND::Screen::PutString("\nInstalling IRQ...");
ND::IRQ::Remap(0x20,0x28);
ND::IDT::SetGate(32,(unsigned)ND::IRQ::IRQ1,0x08,0x8E);
ND::IDT::SetGate(33,(unsigned)ND::IRQ::IRQ2,0x08,0x8E);
ND::IDT::SetGate(34,(unsigned)ND::IRQ::IRQ3,0x08,0x8E);
ND::IDT::SetGate(35,(unsigned)ND::IRQ::IRQ4,0x08,0x8E);
ND::IDT::SetGate(36,(unsigned)ND::IRQ::IRQ5,0x08,0x8E);
ND::IDT::SetGate(37,(unsigned)ND::IRQ::IRQ6,0x08,0x8E);
ND::IDT::SetGate(38,(unsigned)ND::IRQ::IRQ7,0x08,0x8E);
ND::IDT::SetGate(39,(unsigned)ND::IRQ::IRQ8,0x08,0x8E);
ND::IDT::SetGate(40,(unsigned)ND::IRQ::IRQ9,0x08,0x8E);
ND::IDT::SetGate(41,(unsigned)ND::IRQ::IRQ10,0x08,0x8E);
ND::IDT::SetGate(42,(unsigned)ND::IRQ::IRQ11,0x08,0x8E);
ND::IDT::SetGate(43,(unsigned)ND::IRQ::IRQ12,0x08,0x8E);
ND::IDT::SetGate(44,(unsigned)ND::IRQ::IRQ13,0x08,0x8E);
ND::IDT::SetGate(45,(unsigned)ND::IRQ::IRQ14,0x08,0x8E);
ND::IDT::SetGate(46,(unsigned)ND::IRQ::IRQ15,0x08,0x8E);
ND::IDT::SetGate(47,(unsigned)ND::IRQ::IRQ16,0x08,0x8E);
ND::Screen::SetColor(ND_SIDE_FOREGROUND,ND_COLOR_GREEN);
ND::Screen::PutString("done");
asm volatile("sti");
}

Ang pangungusap ng asm sti buhayin namin ang mga IRQ. Ngayon ay pupunta kami sa isang bagay na katulad sa ISR. Ang mga pagpapaandar ng isang pangunahing IRQ:

void ND::IRQ::IRQ1()
{
asm volatile(
"cli \n"
"pushl 0\n"
"pushl 32\n"
"jmp ND_IRQ_Common"
);
}

Isang karaniwang bahagi (kapareho ng ISR):

extern "C"
void ND_IRQ_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_IRQ_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"
);
}

At isang pangunahing hawakan:

extern "C"
void ND_IRQ_Handler(struct regs* r)
{
void (*handler)(struct regs *r);
if(r->int_no >= 40)
{
ND::Ports::OutputB(0xA0,0x20);
}
ND::Ports::OutputB(0x20,0x20);
}

Sa pamamagitan nito dapat ay mayroon na tayong naisasaaktibo ng IRQ kahit na wala pa rin silang ginagawa. Sa susunod na kabanata makikita natin kung paano makakuha ng data mula sa mga IRQ na ito tulad ng orasan o keyboard.

SusunodDivel-IRQ


At sa pagtatapos na ito ng post ngayon. Tulad ng nakikita mo ngayon hindi ako regular na nagsusulat dahil sa iba pang mga isyu. Kahit na magpapatuloy ako hanggang sa magkaroon ako ng mas kumpletong operating system


Idagdag bilang ginustong mapagkukunan sa Google