Привет, я пишу несколько процессов прерывания.
Я в Ubuntu 18.04 и использую gcc -7.3.0.
В настоящее время я использую следующий префикс и суффикс для упаковки своей программы обработки прерываний (без кода ошибки):
#define Ent_Int __asm__ __volatile__ ("\
pushq %rax\n\t\
movq %es, %rax\n\t\
pushq %rax\n\t\
movq %ds, %rax\n\t\
pushq %rax\n\t\
pushq %rbx\n\t\
pushq %rcx\n\t\
pushq %rdx\n\t\
pushq %rbp\n\t\
pushq %rdi\n\t\
pushq %rsi\n\t\
pushq %r8\n\t\
pushq %r9\n\t\
pushq %r10\n\t\
pushq %r11\n\t\
pushq %r12\n\t\
pushq %r13\n\t\
pushq %r14\n\t\
pushq %r15\n\t\
movq $0x10, %rdi\n\t\
movq %rdi, %es\n\t\
movq %rdi, %ds\n\t");
#define Ret_Int __asm__ __volatile__ ("\
popq %r15\n\t\
popq %r14\n\t\
popq %r13\n\t\
popq %r12\n\t\
popq %r11\n\t\
popq %r10\n\t\
popq %r9\n\t\
popq %r8\n\t\
popq %rsi\n\t\
popq %rdi\n\t\
popq %rbp\n\t\
popq %rdx\n\t\
popq %rcx\n\t\
popq %rbx\n\t\
popq %rax\n\t\
movq %rax, %ds\n\t\
popq %rax\n\t\
movq %rax, %es\n\t\
popq %rax\n\t\
leave\n\t\
iretq");
И функция выглядит так:
void Div_Eorr(Int_Info_No_Err STK)
{
Ent_Int;
color_printk(RED,BLACK,"do_divide_error(0),ERROR_CODE:%#016lx,RSP:%#016lx,RIP:%#016lx\n", 0, STK.RSP, *((unsigned long *)(&STK)-1));
while(1);
Ret_Int;
}
Однако из OSDEV я обнаружил, что атрибут ((прерывание)) может облегчить жизнь.
Однако, когда я компилирую функцию, появляется сообщение об ошибке:
. / OSFiles / Codes / INT.c: 288: 1: извините, не реализовано: инструкции SSE не разрешены в процедуре обслуживания прерывания
Однако внутри функции нет инструкции SSE. Поэтому я хотел бы спросить:
1, как мне правильно скомпилировать ISR
2, как бы gcc отличил INT с / без кода ошибки.
Буду очень признателен, если кто-нибудь сможет проиллюстрировать, в чем заключаются подробные различия скомпилированной сборки с атрибутом прерывания или без него.