Как правильно скомпилировать программу обработки прерываний с помощью GCC? - PullRequest
0 голосов
/ 31 марта 2019

Привет, я пишу несколько процессов прерывания.

Я в 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 с / без кода ошибки.

Буду очень признателен, если кто-нибудь сможет проиллюстрировать, в чем заключаются подробные различия скомпилированной сборки с атрибутом прерывания или без него.

...