如何使用GCC正确编译中断服务程序?

时间:2019-03-31 04:34:30

标签: gcc x86-64 interrupt interrupt-handling

嗨,我正在编写一些中断过程。

我在Ubuntu 18.04上并使用gcc -7.3.0。

当前,我使用以下前缀和后缀来打包我的中断服务程序(无错误代码):

Create Table #TestData
(
    ID int,
    Category int,
    DateFrom datetime,
    DateTo datetime NULL,
    ExpectedResult int
)

insert into #TestData
(
    ID,
    Category,
    DateFrom,
    DateTo,
    ExpectedResult
)
select
    1,
    1,
    '01 Mar 2019',
    '06 Mar 2019',
    7
union all
select
    2,
    1,
    '08 Mar 2019',
    '09 Mar 2019',
    3
union all
select
    3,
    1,
    '11 Mar 2019',
    '14 Mar 2019',
    3
union all
select
    1,
    2,
    '04 Mar 2019',
    '07 Mar 2019',
    4
union all
select
    2,
    2,
    '08 Mar 2019',
    '15 Mar 2019',
    10
union all
select
    3,
    2,
    '18 Mar 2019',
    '24 Mar 2019',
    6

select  * from #TestData

drop table #TestData

函数如下:

#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");

但是,从OSDEV中,我发现属性(中断)可以使生活更轻松。

但是,当我编译函数时,会出现错误消息:

./ OSFiles / Codes / INT.c:288:1:抱歉,未实现:中断服务程序中不允许SSE指令

但是,该函数内部没有SSE指令。所以我想问:

1,如何正确编写ISR

2,gcc如何区分带/不带错误代码的INT。

如果能说明具有或不具有中断属性的已编译程序集的详细区别,将非常感谢。

0 个答案:

没有答案