2009-06-24 8 views
3

Si je lis/écris/saute à une adresse abrégée ie.linux: où est le "vrai" gestionnaire d'erreurs de segmentation?

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

cela provoque un défaut de segmentation.

Je me demande, quelle est la partie réelle du système (noyau) qui intercepte lecture/écriture aux adresses inexplorées (comment?) et lance le signal « mode utilisateur »?

+1

Eh bien, il ya un support matériel pour le comment, peut-être http://duartes.org/gustavo/blog/post/cpu-rings-privilege-and-protection Pour l'où, je suppose que vous devriez chercher le gestionnaire d'interruption? – wds

Répondre

4

Tout coule de la table piège des architectures. Cela s'appelle habituellement entry.S (scindé sur x86 entre entry_32 et entry_64.S) et possède un lien d'assembleur qui fait un certain nombre de choses (en fonction de la configuration) avant d'entrer dans le code C du noyau proprement dit. Par conséquent, un accès mémoire invalide doit entrer via page_fault ou general_protection et finira probablement par faire force_sig_info avant d'être finalement retourné dans l'espace utilisateur dans send_signal (kernel/signal.c).

0

Il est implémenté pour différentes architectures. Par exemple, sur x86, vous pouvez vérifier la source à:

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

Les défauts de page et les fautes de segmentation sont des choses complètement différentes. – SoapBox

0

Dans les puces PowerPC qui ne sont pas «Book E» (par exemple, puces récentes pour systèmes embarqués), une erreur de segmentation commence par une exception 0x300 (pour les données) ou 0x400 (pour les instructions). mis à superviseur, la MMU est désactivée et le CPU saute à l'adresse 0x300 ou 0x400, donnant le contrôle au système d'exploitation.

Questions connexes