Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

why clear interrput flag cause segmentation fault in C?

I am learning some basics about Assembly and C. for learning purpose I decide to write a simple program that disable Interrupts and when user wants to type something in the console he/she can't :

#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;
}

but when I compile this with GCC I got segmentation fault :

Segmentation fault (core dumped)

And when I debug it with gdb I got this message when program reach to the asm("cli"); line:

Program received signal SIGSEGV, Segmentation fault.
main () at cli.c:6
6       asm ("cli");
like image 498
mojibuntu Avatar asked Jan 06 '14 11:01

mojibuntu


People also ask

What causes a segmentation fault in C?

In practice, segfaults are almost always due to trying to read or write a non-existent array element, not properly defining a pointer before using it, or (in C programs) accidentally using a variable's value as an address (see the scanf example below).

Is segmentation fault an interrupt?

A segmentation fault is an access to a memory address that isn't allowed (not part of the process, or trying to write read-only data, or execute non-executable data, ...). This is caught by the MMU (Memory Management Unit, today part of the CPU), causing an interrupt.

Why does printf cause segmentation fault?

2 Answers. The main issue that causes a segmentation fault is line 22 - printf ("Name: %s \n", name); This is because you are printing a string, while name is 1 character. If I enter my name, only the first letter entered is actually written to the name variable.

What is meant by segmentation fault or memory fault in C?

Core Dump/Segmentation fault is a specific kind of error caused by accessing memory that “does not belong to you.” When a piece of code tries to do read and write operation in a read only location in memory or freed block of memory, it is known as core dump. It is an error indicating memory corruption.


1 Answers

This is happening because You can't disable interrupts from user space program. All interrupts are under the control of kernel. You need to do it from kernel space. Before you do it you need to learn kernel internals first and playing with interrupts are very critical and requires more knowledge on kernel according to my knowledge.

You need to write a kernel module that can interact with user space through /dev/ (or some other) interface. User space code should request kernel module to disable interrupts.

like image 144
Chinna Avatar answered Nov 15 '22 05:11

Chinna