рдПрдХ рдЕрдЦрдВрдб рдпреВрдирд┐рдХреНрд╕ рдЬреИрд╕рд╛ рдУрдПрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ - рдЬреАрдбреАрдЯреА рдФрд░ рдЖрдИрдбреАрдЯреА (5)

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛ред
рдЖрдЬ рд╣рдо рдЗрдВрдЯреЗрд▓ i386 рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗред
рдЕрд░реНрдерд╛рддреН: рдЧреНрд▓реЛрдмрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдЯреЗрдмрд▓ рдФрд░ рдЗрдВрдЯрд░рдкреНрдЯ рд╡реЗрдХреНрдЯрд░ рдЯреЗрдмрд▓ред


рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛


рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдо (рдореЗрдХ, рдЬреАрд╕реАрд╕реА, рдЧреИрд╕)ред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмреВрдЯ (рдорд▓реНрдЯреАрдмреВрдЯ)ред рд▓реЙрдиреНрдЪ (qemu)ред рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА (strcpy, memcpy, strext)ред
рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рд╕реНрдкреНрд░рд┐рдВрдЯрдл, рд╕реНрдЯреНрд░реИрдЪреА, рд╕реНрдЯреНрд░реИрдореНрдк, рд╕реНрдЯреНрд░реЗрдЯреЛрдХ, рд╡рд╛_рд▓рд┐рд╕реНрдЯ ...)ред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХрд░реНрдиреЗрд▓ рдореЛрдб рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЛрдб рдореЗрдВ рдмрдирд╛рдирд╛ред
рдХрд░реНрдиреЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд▓реЙрдЧред рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдЯрд░реНрдорд┐рдирд▓ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ (kprintf, kpanic, kassert)ред
рдбрд╛рдпрдиреЗрдорд┐рдХ рдореЗрдореЛрд░реА, рд╣реАрдк (kmalloc, kfree)ред
рдореЗрдореЛрд░реА рдФрд░ рдЗрдВрдЯрд░рдкреНрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ (GDT, IDT, PIC, syscall) рдХрд╛ рд╕рдВрдЧрдардиред рдЕрдкрд╡рд╛рджред
рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА (рдкреЗрдЬ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдФрд░ рдкреЗрдЬ рдЯреЗрдмрд▓)ред
рдкреНрд░рдХреНрд░рд┐рдпрд╛ред рд╕рдордпрдмрджреНрдзрдХред рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧред рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ (рдорд╛рд░, рдирд┐рдХрд╛рд╕, рдкреАрдПрд╕)ред
рдХрд░реНрдиреЗрд▓ рдХреА рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдгрд╛рд▓реА (initrd), рдпреЛрдЧрд┐рдиреА, рдФрд░ рдЗрд╕рдХреЗ рдЖрдВрддрд░рд┐рдХред рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ (рдирд┐рд╖реНрдкрд╛рджрди)ред
рдЪрд░рд┐рддреНрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░ред рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ (ioctl, fopen, fread, fwrite)ред рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА (fopen, fclose, fprintf, fscanf)ред
рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╢реЗрд▓ред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдореЛрдб (рд░рд┐рдВрдЧ 3)ред рдЯрд╛рд╕реНрдХ рд╕реНрдЯреЗрдЯрд╕ рд╕реЗрдЧрдореЗрдВрдЯ (tss)ред

рд░реИрдЦрд┐рдХ рд╕рдВрдмреЛрдзрди


рдЗрдВрдЯреЗрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ 2 рдореБрдЦреНрдп рдСрдкрд░реЗрдЯрд┐рдВрдЧ рдореЛрдб рд╣реИрдВ: рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб x32 рдФрд░ IA-32e x64ред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЬреБрдмрдХреЛрд╡ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдЗрдВрдЯреЗрд▓ рдореИрдиреБрдЕрд▓ рднреА рд╕рдВрднрд╡ рд╣реИ, рдпрд╣ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд░рд░реНрдердХ рдФрд░ рдмрдбрд╝реЗред
рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ рд╡реЙрд▓реНрдпреВрдо рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рдкрд╣рд▓реЗ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд░реВрд╕реА рднрд╛рд╖рд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╣рдо рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрддреЗ рд╣реИрдВ: рд░реИрдЦрд┐рдХ рдФрд░ рдкреГрд╖реНрдаред рд░реИрдЦрд┐рдХ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреВрд░реЗ рднреМрддрд┐рдХ рд╕реНрдерд╛рди рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рднреМрддрд┐рдХ рдПрдХ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ рдЦрдВрдб рд╡рд░реНрдгрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рд╢реВрдиреНрдп рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрд╕рд╛рди рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд░реНрдиреЗрд▓ рдореЛрдб рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддреАрди рд╡рд┐рд╡рд░рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдХреЛрдб, рд╕реНрдЯреИрдХ рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдПред рд╡реЗ рдХреБрдЫ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕реБрд░рдХреНрд╖рд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рд╣реИрдВред
рдРрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЦрдВрдб рдореЗрдВ рд╢реВрдиреНрдп рдХрд╛ рдЖрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдорд╢реАрди рд╢рдмреНрдж рдХреЗ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмреЛрдзрд┐рдд рд╕реАрдорд╛ рд╣реЛрддреА рд╣реИред рд╕реНрдЯреИрдХ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдмрдврд╝рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рд╡рд░рдгрдХ рдореЗрдВ рдПрдХ рдЭрдВрдбрд╛ рднреА рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдХреЗ рддреАрди рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рд╡рд╣ рд╕рдм рдХреБрдЫ рдкрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

/* * Global descriptor table entry */ struct GDT_entry_t { u16 limit_low: 16; u16 base_low: 16; u8 base_middle: 8; u8 type: 4; /* whether code (0b1010), data (0b0010), stack (0b0110) or tss (0b1001) */ u8 s: 1; /* whether system descriptor */ u8 dpl: 2; /* privilege level */ u8 p: 1; /* whether segment prensent */ u8 limit_high: 4; u8 a: 1; /* reserved for operation system */ u8 zero: 1; /* zero */ u8 db: 1; /* whether 16 or 32 segment */ u8 g: 1; /* granularity */ u8 base_high: 8; } attribute(packed); 


GDT рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдЧрдореЗрдВрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ (cs, ds, ss) рдХрд╛ рдЕрдкрдирд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рд╣рдо рдХреЛрдб рд╕реЗрдХреНрд╢рди рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдореЗрдВ рд▓рд┐рдЦрд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рд╣реЛрддреА рд╣реИред
рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ GDTR рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдирд┐рдореНрди рдкреНрд░рд╛рд░реВрдк рдХреА рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 /* * Global descriptor table pointer */ struct GDT_pointer_t { u16 limit; u32 base; } attribute(packed); 


рд╕реАрдорд╛ рдЬреАрдбреАрдЯреА рддрд╛рд▓рд┐рдХрд╛ рд╢реВрдиреНрдп рд╕реЗ 1 рдХреЗ рдЕрдВрдд рд╣реИ, рд╕реНрдореГрддрд┐ рдореЗрдВ рдЖрдзрд╛рд░ рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд рд╣реИред
рдЬреАрдбреАрдЯреА рдХреЛ рдЗрд╕ рддрд░рд╣ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

/*
* Load global descriptor table
* void asm_gdt_load(void *gdt_ptr)
*/
asm_gdt_load:
mov 4(%esp),%eax # eax = gdt_ptr
lgdt (%eax)
mov $0x10,%eax
mov %ax,%ds
mov %ax,%es
mov %ax,%fs
mov %ax,%gs
mov %ax,%ss
jmp $0x08,$asm_gdt_load_exit
asm_gdt_load_exit:
ret


рдФрд░ рдЗрд╕рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╣рдо рдХрд░реНрдиреЗрд▓ рдбреЗрдЯрд╛ рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ (рд╢реВрдиреНрдп рд╕реБрд░рдХреНрд╖рд╛ рд░рд┐рдВрдЧ) рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╕реЗрдЧрдореЗрдВрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред
рдЙрд╕рдХреЗ рдмрд╛рдж, рдкреЗрдЬрд┐рдВрдЧ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдФрд░ рдЕрдзрд┐рдХред
рд╡реИрд╕реЗ, рдорд▓реНрдЯреАрдмреВрдЯ рдмреВрдЯрд▓реЛрдбрд░реНрд╕ рддреБрд░рдВрдд рдЕрдкрдиреЗ рдЬреАрдбреАрдЯреА рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдЗрддрдирд╛ рдЕрдзрд┐рдХ рдордЬрд╝рдмреВрддреА рд╕реЗ рдХрд╣рддреЗ рд╣реИрдВред
рд╡реАрдбрд┐рдпреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдпрд╣ рд╕рдм рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджреЗрдЦреЗрдВред

рдмрд╛рдзрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ


GDT рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдиреЗ рд╕реЗ, рдЗрдВрдЯрд░рдкреНрдЯ рдЯреЗрдмрд▓ рдХрд╛ рдЕрдкрдирд╛ IDTR рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рдПрдХ рд╕рдорд╛рди рдкреЙрдЗрдВрдЯрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА IDT рдкрд░ред
рдЗрдВрдЯрд░рдкреНрдЯ рдЯреЗрдмрд▓ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 /* * Interrupt table entry */ struct IDT_entry_t { u16 offset_lowerbits; u16 selector; u8 zero; u8 type_attr; u16 offset_higherbits; }; 


рд░реБрдХрд╛рд╡рдЯ рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд░реБрдХрд╛рд╡рдЯреЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо рдЕрднреА рддрдХ рдЬрд╛рд▓ рдФрд░ рдХреЙрд▓ рдЧреЗрдЯрд╡реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЯреАрдПрд╕рдПрд╕ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдЫрд▓реНрд▓реЗ рдХреЗ рдХрд░реАрдм рд╣реИред
рдЖрдЗрдП рдЕрдкрдиреЗ рд╕рд╛рде рдЗрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдВред рдЙрдиреНрд╣реЗрдВ рдмрд╕ рдПрдХ рдмрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рднреВрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 /* * Api */ extern void gdt_init(); extern void idt_init(); 


рдФрд░ рдЕрдм рд╣рдо IDT рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╡реНрдпрд╡рдзрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдПрд░рд░ рд╣реИрдВрдбрд▓рд░реНрд╕ рд▓рд┐рдЦреЗрдВ:

 /* * Api - IDT */ extern void ih_double_fault(); extern void ih_general_protect(); extern void ih_page_fault(); extern void ih_alignment_check(); extern void asm_ih_double_fault(); extern void asm_ih_general_protect(); extern void asm_ih_page_fault(); extern void asm_ih_alignment_check(); 


рдлрд┐рд░ рдХреАрдмреЛрд░реНрдб рдЗрдВрдЯрд░рдкреНрдЯ рд╣реИрдВрдбрд▓рд░:

 /* * Api - IRQ */ extern void ih_keyboard(); extern void asm_ih_keyboard(); 


рдпрд╣ рдЖрдИрдбреАрдЯреА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 extern void idt_init() { size_t idt_address; size_t idt_ptr[2]; pic_init(); /* fill idt */ idt_fill_entry(INT_DOUBLE_FAULT, (size_t)asm_ih_double_fault); idt_fill_entry(INT_GENERAL_PROTECT, (size_t)asm_ih_general_protect); idt_fill_entry(INT_ALIGNMENT_CHECK, (size_t)asm_ih_alignment_check); idt_fill_entry(INT_KEYBOARD, (size_t)asm_ih_keyboard); /* load idt */ idt_address = (size_t)IDT; idt_ptr[0] = (LOW_WORD(idt_address) << 16) + (sizeof(struct IDT_entry_t) * IDT_SIZE); idt_ptr[1] = idt_address >> 16; asm_idt_load(idt_ptr); } 


рдпрд╣рд╛рдВ рд╣рдордиреЗ рддреАрди рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдФрд░ рдПрдХ рд░реБрдХрд╛рд╡рдЯ рджрд░реНрдЬ рдХреАред
рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ IDTR рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЖрдзрд╛рд░ рдФрд░ рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

/*
* Load interrupt table
* void asm_idt_load(unsigned long *addr)
*/
asm_idt_load:
push %edx
mov 8(%esp), %edx
lidt (%edx)
pop %edx
ret


рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХрд┐рддрдиреЗ рд░рд┐рдХреЙрд░реНрдб рд╣реИрдВ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдпрд╣ рдПрдХ рдХреАрдмреЛрд░реНрдб рдЗрдВрдЯрд░рдкреНрдЯ рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ:

/*
* Handle IRQ1
* void asm_ih_keyboard(unsigned int)
*/
asm_ih_keyboard:
pushal
call ih_keyboard
popal
iretl


рдиреЛрдЯ: рдЗрд╕рдХреЗ рдмрд╛рдж рдФрд░ рд╣рд░ рдЬрдЧрд╣ рдХреЛрдб рдореЗрдВ "рдирд┐рдЪрд▓реЗ рд╣рд┐рд╕реНрд╕реЛрдВ" рд▓рд┐рдирдХреНрд╕ рдореЗрдВ "рдКрдкрд░реА рд╣рд┐рд╕реНрд╕реЛрдВ" рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВред рдФрд░ "рдКрдкрд░реА", рдХреНрд░рдорд╢рдГ, рд╡рд┐рдкрд░реАрддред рдореИрдВ рдорд╛рдлреА рдорд╛рдБрдЧрддрд╛ рд╣реВрдБ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдбреА

рджрд░рдЕрд╕рд▓ рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЛрдб рдкрд╛рд╕ рдХрд░реЗрдЧрд╛ред
рдмрджрд▓реЗ рдореЗрдВ, рдЗрд╕реА рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдирд┐рдЪрд▓реЗ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдиреЗ рдЗрд╕ рд░реБрдХрд╛рд╡рдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдерд╛ред
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рдЪрд░рд┐рддреНрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рд╣реЛрдЧрд╛ред
рджреВрд╕рд░реЛрдВ рдХреЛ рдзреАрдорд╛ рдХрд░рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЬрд▓реНрджреА рд╕реЗ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд┐рдЪрд▓реЗ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдлрд┐рд░, рдЬрдм рд╕рдордп рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдКрдкрд░реА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднреАрдбрд╝ (рдмрд╛рдзрд┐рдд) рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

 /* * Api - Keyboard interrupt handler */ extern void ih_keyboard() { printf("[IH]: irq %u\n", 1); u_char status = asm_read_port(KEYBOARD_STATUS_PORT); if (status & 0x01) { char keycode = asm_read_port(KEYBOARD_DATA_PORT); if (keycode < 1) { goto end; } /* call low half (bottom) interrupt handler */ } end: asm_write_port(PIC1_CMD_PORT, 0x20); /* end of interrupt */ } 


рдЕрдм, рдЬрдм рд╣рдо рдХреАрдмреЛрд░реНрдб рдХреА рджрдмрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рд░ рдмрд╛рд░ рд╣рдо рдХрд░реНрдиреЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд▓реЙрдЧ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рджреЗрдЦреЗрдВрдЧреЗред

рд╕рдВрджрд░реНрдн


рдЕрдм, рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╡реАрдбрд┐рдпреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЦреЛрд▓реЗрдВред
рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рджреЗрдЦреЗрдВ (рдЖрдкрдХреЛ рдПрдХ рд╕рдмрдХ 5 рд╢рд╛рдЦрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)

рд╕рдВрджрд░реНрдн


1. рдЬреЗрдореНрд╕ рдореЛрд▓реЙрдпред рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдЦрд┐рд▓реМрдирд╛ рдпреВрдирд┐рдХреНрд╕-рдХреНрд▓реЛрди рдУрдПрд╕ рд░реЛрд▓ рдХрд░реЗрдВред
2. рджрд╛рдБрддред рдбреЙрд╕, рд╡рд┐рдВрдбреЛрдЬ, рдпреВрдирд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрд╕реЗрдВрдмрд▓рд░
3. рдХрд▓рд╛рд╢реНрдирд┐рдХреЛрд╡ред рдЕрд╕реЗрдВрдмрд▓рд░ рдЖрд╕рд╛рди рд╣реИ!
4. рддрд╛рдирдирдмрд╛рдоред рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдоред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рд╡рд┐рдХрд╛рд╕ред
5. рд░реЙрдмрд░реНрдЯ рд▓рд╡ред рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдгред

Source: https://habr.com/ru/post/hi467289/


All Articles