Domanda

Se leggo / scrivo / salto a un indirizzo ummapped cioè.

.text
    .global _start
_start:
     movl   $1,%edx
     jmp     *%edx

questo provoca un errore di segmentazione.

Mi chiedo, qual è la parte reale del sistema (kernel) che intercetta legge / scrive su indirizzi non mappati (come?) e genera la "modalità utente" segnale?

È stato utile?

Soluzione

Tutto scorre dalla tabella delle trap delle architetture. Questo di solito si chiama entry.S (diviso su x86 tra entry_32 e entry_64.S) e ha un collegamento assembler che fa un numero di cose (a seconda della configurazione) prima di entrare nel codice C del kernel proprio.

Quindi un accesso alla memoria non valido dovrebbe entrare attraverso page_fault o general_protection e probabilmente finirà per fare force_sig_info prima di essere infine messo in coda nello spazio utente in send_signal (kernel / signal.c).

Altri suggerimenti

È implementato per diverse architetture. Ad esempio, su x86, puoi controllare l'origine su:

do_page_fault: linux/arch/x86/mm/fault.c  

Nei chip PowerPC che non sono " Prenota E " (ad es. chip recenti per sistemi embedded), un errore di segmentazione inizia con un'eccezione 0x300 (per dati) o 0x400 (per istruzioni.) Il flag della modalità utente / supervisore è impostato su supervisore, l'MMU è spento e la CPU salta per indirizzare 0x300 o 0x400, dando il controllo al sistema operativo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top