为什么明确的interrput标志导致C中的分段错误?

moj*_*ntu 6 c x86 assembly interrupt

我正在学习关于Assembly和C.的一些基础知识用于学习目的我决定编写一个禁用Interrupts的简单程序,当用户想要在控制台中键入内容时他/她不能:

#include <stdio.h>
int main(){
    int a;
    printf("enter your number : ");
    asm ("cli");
    scanf("%d", &a);
    printf("your number is %d\n" , a);     
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是当我用GCC编译它时,我得到了分段错误:

Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

当我调试它gdb时,当程序到达该asm("cli");行时我得到了这条消息:

Program received signal SIGSEGV, Segmentation fault.
main () at cli.c:6
6       asm ("cli");
Run Code Online (Sandbox Code Playgroud)

Chi*_*nna 12

发生这种情况是因为您无法禁用用户空间程序的中断.所有中断都在内核的控制之下.你需要从内核空间做到这一点.在你这样做之前,你需要首先学习内核内核并且使用中断非常关键,并且根据我的知识需要更多关于内核的知识.

您需要编写一个可以通过/ dev /(或其他)接口与用户空间交互的内核模块.用户空间代码应该请求内核模块禁用中断.