Question

Si je lis / écris / saute à une adresse non définie, c.-à-d.

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

cela cause une erreur de segmentation.

Je me demande quelle est la partie réelle du système (noyau) qui intercepte les lectures / écritures vers des adresses non mappées (comment?) et lance le " mode utilisateur " signal?

Était-ce utile?

La solution

Tout découle de la table de déroutement des architectures. Cela s'appelle généralement entry.S (divisé sur x86 entre entry_32 et entry_64.S) et possède un lien avec l'assembleur qui effectue un certain nombre de choses (selon la configuration) avant de passer au code C du noyau proprement dit.

Donc, un accès mémoire non valide doit entrer via page_fault ou general_protection et finira probablement par forcer force_sig_info avant d'être finalement mis en file d'attente dans l'espace utilisateur dans send_signal (kernel / signal.c).

Autres conseils

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

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

Dans les puces PowerPC qui ne sont pas des "livres E". (par exemple, puces récentes pour les systèmes intégrés), une erreur de segmentation commence par une exception 0x300 (pour les données) ou 0x400 (pour les instructions). L'indicateur de mode utilisateur / superviseur est défini sur superviseur, la MMU est désactivée et la CPU saute. adresse 0x300 ou 0x400, donnant le contrôle au système d'exploitation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top