Flujo de procesamiento de SegmentFault
Este artículo resumirá brevemente el flujo de procesamiento SegmentFault de la plataforma arm64 basándose en un simple problema de falla de segmentación de usuarios.
El desmontaje es el siguiente
El registro de kenrel impreso por dmesg es el siguiente
El0_sync es el siguiente
El siguiente es una breve descripción
Los 6 bits altos son la clase de excepción, que se utiliza para identificar el tipo de excepción actual.
Según el caso de prueba anterior, el valor de esr es 0x92000045. , entonces la excepción class= esr >> 26 = 0x24, correspondiente a ESR_ELx_EC_DABT_LOW p>
Saltará a el0_da para continuar procesando. La implementación de el0_da es la siguiente
Operación de el0_da<. /p>
El código fuente se encuentra en arch/arm64/mm/fault.c
La función esr_to_fault_info() se utiliza para recuperar el código de estado de falla de datos (DFSC) de los 6 bits inferiores de esr
Y fallo_info[] es una matriz de estructuras de fallo_info correspondientes a los 64 códigos de estado de error Procesamiento
dfsc = esr & quinto elemento "Error de traducción de nivel 1" de fallo_info[]. El siguiente paso es saltar a do_translation_fault().
Aquí saltamos a do_page_fault()
do_page_fault() se llama principalmente
La implementación de ___do_page_fault() es la siguiente
___do_page_fault( ) Aquí, si no se encuentra vma, regresará directamente.
Después de que el error de la página anterior no se pueda manejar, si es un error de página en modo usuario, eventualmente irá a __do_user_fault()
__do_user_fault() hará varias cosas: p >
show_regs_print_info() relacionado