
рдпрд╣ рд▓реЗрдЦ рдПрдХ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрдЧрд▓реА рдХрдбрд╝реА рд╣реЛрдЧреАред
рдкрд┐рдЫрд▓реЗ рдЪрд╛рд░ рдорд╣реАрдиреЛрдВ рд╕реЗ, рдореИрдВ x86_64 рдХреЗ рд▓рд┐рдП рдЦрд┐рд▓реМрдирд╛ OS рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЦрд╛рд▓реА рд╕рдордп рджреЗ рд░рд╣рд╛ рд╣реВрдВред рд╕реНрд░реЛрдд рдХреЛрдб
рдпрд╣рд╛рдБ рд╣реИрд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ (рдЬреЛ рдЕрднреА рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ) рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: рдПрдХрд▓ 64-рдмрд┐рдЯ рдкрддрд╛ рд╕реНрдерд╛рди рдЬрд┐рд╕рдореЗрдВ рдЕрдирдиреНрдд рдзрд╛рдЧреЗ рд╣реЛрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдХрд┐ рдлреИрдВрдЯрдо рдУрдПрд╕); рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдЬреЛ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓рд╛рдЧреВ:
1. рдПрдХ рдорд▓реНрдЯреАрдмреВрдЯ рдмреВрдЯрд▓реЛрдбрд░ (GRUB) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░реНрдиреЗрд▓ рд▓реЛрдб рдХрд░рдирд╛;
2. рдкрд╛рда рд╡реАрдЬреАрдП рдореЛрдб (16-рд░рдВрдЧ, kprintf);
рдкреГрд╖реНрдареЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 3. рд╕рд░рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕;
4. рд╕реА рдореЗрдВ рд╡реНрдпрд╡рдзрд╛рди рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛;
5. рдкреНрд░реЛрд╕реЗрд╕рд░ рдЯреЛрдкреЛрд▓реЙрдЬреА (рд╕реЙрдХреЗрдЯреНрд╕, рдХреЛрд░, рдереНрд░реЗрдбреНрд╕) рдФрд░ рдЙрдирдХреЗ рд▓реЙрдиреНрдЪ рдХреА рдкрд╣рдЪрд╛рди;
6. рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдкреНрд░реАрдореЗрдкреНрдЯрд┐рд╡ рдПрд╕рдПрдордкреА рдЕрдиреБрд╕реВрдЪрдХ рдХрд╛ рдПрдХ рдХрд╛рдордХрд╛рдЬреА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк;
рдЪрд▓рд┐рдП рдорд▓реНрдЯреАрдмреИрдЯ-рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рд╡реАрдЬреАрдП-рдореЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╡рд░реНрдгрди рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ (рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛, рд╕рд┐рд╡рд╛рдп рдЖрд▓рд╕реА рдХреЗ)ред рдореИрдВ рдкреГрд╖реНрдареЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛, рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдмрд╛рдК рд╣реЛрдЧрд╛ (рд╢рд╛рдпрдж рджреВрд╕рд░реА рдмрд╛рд░)ред рдЪрд▓рд┐рдП рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд░реБрдХрд╛рд╡рдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред
рдЖрдорддреМрд░ рдкрд░, рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЛрдб рдХреА рддрд░рд╣ рдЗрдВрдЯрд░рдкреНрдЯ рд╣реИрдВрдбрд▓рд░, рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реВрдБ, рд╕реА рдореЗрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдХрдИ рдореИрдХреНрд░реЛрдЬрд╝ рдмрдирд╛рдП рдЬреЛ рд╕реА рдореЗрдВ рд╡реНрдпрд╡рдзрд╛рди рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдзреБрдирд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░ рдХреА рд╢рдХреНрддрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓рдХреНрдЬрд░реА (рд╣рдо рдЗрд╕реЗ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдмрд╛рд╣рд░ рдХрд░ рджреЗрддреЗ рд╣реИрдВ) рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп)ред
рд▓рдВрдмреЗ рдореЛрдб рдореЗрдВ рд░реБрдХрд╛рд╡рдЯ рдХреЗ рд╕рдордп, рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИрдВрдбрд▓рд░ рд╕реНрдЯреИрдХ рдореЗрдВ рдПрдХ рдлреНрд░реЗрдо рдмрдирд╛рддрд╛ рд╣реИ (рдпрд╣ рдпрд╛ рддреЛ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рдЕрд▓рдЧ рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╕реНрдЯреИрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдЬрд┐рд╕рдореЗрдВ рд╕рд╣реЗрдЬреЗ рдЧрдП рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ:

рджрд░рдЕрд╕рд▓, рдпрд╣ рддрд╕реНрд╡реАрд░ рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ (рдореБрдЭреЗ рд▓рдВрдмреЗ рдореЛрдб рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ-рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реА рддрд╕реНрд╡реАрд░ рдирд╣реАрдВ рдорд┐рд▓реА), рд▓реЗрдХрд┐рди, рдЫреЛрдЯреЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд┐рджреНрдзрд╛рдВрдд рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╢реЗрд╖ рд░рдЬрд┐рд╕реНрдЯрд░ рдмрд░рдХрд░рд╛рд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреИрдХ рдкрд░ рд╕рд╣реЗрдЬрдирд╛ рд╣реЛрдЧрд╛ред рдЪреВрдБрдХрд┐ рд╣рдорд╛рд░реЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ C рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕реЗрдЯ рд╕рд╣реЗрдЬрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ FPU / MMX / SSE рдХреЗ 512 рдмрд╛рдЗрдЯреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдмреЗрд╢рдХ, рдЖрдк рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдкреВрд░реЗ рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рд┐рдордб рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдХреЗрд╡рд▓ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрдВрджрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдХрдИ рдЕрдиреБрдХреВрд▓рди рдЦреЛ рджреЗрддреЗ рд╣реИрдВ, рджреВрд╕рд░реЗ рдореЗрдВ - рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рд╕реА рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд╛рдн рдХреЛ рдмреЗрдЕрд╕рд░ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рддреЛ, рд╣рдо рдПрдлрдПрдХреНрд╕рдпреВ / рдПрдордПрдордПрдХреНрд╕ / рдПрд╕рдПрд╕рдИ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдмрдЪрд╛рдиреЗ / рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП fxsave рдФрд░ fxrstor рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣реИ:
struct int_stack_frame { uint64_t r15, r14, r13, r12, r11, r10, r9, r8; uint64_t rdi, rsi, rbp, rdx, rcx, rbx, rax; uint8_t fxdata[512]; uint32_t error_code; uint64_t rip; uint16_t cs; uint64_t rflags, rsp; uint16_t ss; };
рдПрд░рд░_рдХреЛрдб рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝реАрд▓реНрдбреНрд╕ рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рд╡рд╣ рд░рдЬрд┐рд╕реНрдЯрд░реНрд╕ рд╣реИ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рддрдГ рд╕реЗрд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕реНрдЯреИрдХ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рдмрдврд╝рддрд╛ рд╣реИред рдЕрдм рд╣рдо рдореИрдХреНрд░реЛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
#define DEFINE_INT_HANDLER(name) \ static NOINLINE \ void handle_##name##_int(UNUSED struct int_stack_frame *stack_frame, \ UNUSED uint64_t data) #define DEFINE_ISR_WRAPPER(name, handler_name, data) \ static NOINLINE void *get_##name##_isr(void) { \ ASMV("jmp 2f\n.align 16\n1: andq $(~0xF), %rsp"); \ ASMV("subq $512, %rsp\nfxsave (%rsp)"); \ ASMV("push %rax\npush %rbx\npush %rcx\npush %rdx\npush %rbp\n"); \ ASMV("push %rsi\npush %rdi\npush %r8\npush %r9\npush %r10"); \ ASMV("push %r11\npush %r12\npush %r13\npush %r14\npush %r15"); \ ASMV("movq %%rsp, %%rdi\nmovabsq $%P0, %%rsi" : : "i"(data)); \ ASMV("callq %P0" : : "i"(handle_##handler_name##_int)); \ ASMV("pop %r15\npop %r14\npop %r13\npop %r12\npop %r11"); \ ASMV("pop %r10\npop %r9\npop %r8\npop %rdi\npop %rsi"); \ ASMV("pop %rbp\npop %rdx\npop %rcx\npop %rbx\npop %rax"); \ ASMV("fxrstor (%rsp)\naddq $(512 + 8), %rsp"); \ void *isr; \ ASMV("iretq\n2: movq $1b, %0" : "=m"(isr)); \ return isr; \ } #define DEFINE_ISR(name, data) \ DEFINE_INT_HANDLER(name); \ DEFINE_ISR_WRAPPER(name, name, data) \ DEFINE_INT_HANDLER(name)
рдкрд╣рд▓рд╛ рдореИрдХреНрд░реЛ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рдПрдХ рд░реИрдкрд░ рд╣реИ рдЬреЛ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдмрдЪрд╛рддрд╛ рдФрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдпреЛрдЬрдирд╛ рдЖрдкрдХреЛ рдХрдИ рдЕрд╡рд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдореИрдВ рдЗрд╕реЗ рдорд╛рдирдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рдХрдИ рдЗрдВрдЯрд░рдкреНрдЯ рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо рдХреЛ рдбрдВрдк рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реИрдВрдбрд▓рд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдбреЗрдЯрд╛ рд▓реЗрддрд╛ рд╣реИ; рддрджрдиреБрд╕рд╛рд░, рд╡рд┐рднрд┐рдиреНрди рд╡реНрдпрд╡рдзрд╛рди рдЙрдирдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рд╢реЙрд░реНрдЯрд┐рдВрдЧ рдкреЗрдпрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдореИрдХреНрд░реЛ: рдПрдХ рд╣реИрдВрдбрд▓рд░ + рдПрдХ рдЖрд╡рд░рдг, рдЬрдм рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдХ рд╕рд┐рдВрдЧрд▓ рдЗрдВрдЯрд░рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рддреЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдЖрд╡рд░рдг рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рд╕реНрдерд┐рдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛрдб рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЯреНрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдпрд╣рд╛рдБ рдФрд░ рдкрдврд╝реЗрдВред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдПрдХ рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦрдирд╛ рдФрд░ рдЙрд╕реЗ рдПрдХ рдмрд╛рдзрд╛ рд╕реЗ рдмрд╛рдВрдзрдирд╛ рдПрдХ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рдмрди рдЬрд╛рддрд╛ рд╣реИ:
DEFINE_ISR(foo) {
рдпрд╣ рд╕рдм рдореИрдВ
рд╡рд┐рдпрддрдирд╛рдо рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред