Linux에서 세그폴트가 발생할 때마다 어떻게 되나요?

Linux에서 세그폴트가 발생할 때마다 어떻게 되나요?

하드웨어에서 세그폴트가 발생할 때마다 Linux 커널은 어떤 단계를 수행합니까? 이제 오류 처리기가 IDT를 통해 이를 처리하고 kern.log(dmesg) 어딘가에 오류에 대한 메시지가 있다는 것을 알았습니다.

제가 이 질문을 드리는 이유는 하이퍼바이저를 개발 중이고 사용자 공간에 세그폴트가 발생할 때마다(시스템이 충돌해서는 안 됨) 시스템이 충돌하기 때문입니다(충돌은 kern.log의 메시지 이후에만 발생합니다). 따라서 세그폴트가 발생했을 때 커널이 수행하는 작업을 추적할 수 있다면 많은 도움이 될 것입니다.

답변1

  1. 아치/x86/kernel/idt.c:152page_fault-IDT 의 경우
  2. 아치/x86/항목/entry_64.S:1143- 로 정의된 래퍼 page_fault함수 do_page_fault(), 매크로를 사용하여 구현됨idtentry
  3. 아치/x86/항목/entry_64.S:847idtentry-매크로
  4. 아치/x86/mm/fault.c:1562-do_page_fault()

거기에 도달하면 do_page_fault()나머지 코드를 탐색할 수 있는 클릭 가능한 링크가 표시됩니다. Elixir는 매크로 마법을 이해하지 못하기 때문에 처음 네 단계에서는 이 작업을 수행할 수 없습니다. 또한 어셈블리를 이해하지 못합니다.

다른 트랩을 확인해야 하는 경우 do_*다른 매크로에 의해 다른 처리기 함수( )가 정의되어 있습니다.x86/커널/traps.c:281 DO_ERROR().

분할 오류 메시지를 기록하는 함수도 Fault.c에 있습니다.쇼시그널메시지(). 여기 당신을 위한 작은 공짜가 있습니다. Elixir는 일반 문자열 검색을 허용하지 않으며 식별자만 검색할 수 있습니다. GitHub는 코드 검색도 종료했습니다. 어쨌든, 이 메시지 형식 문자열에는 "%s%s[%d]: segfault at %lx ip %px sp %px error %lx"특정 단어나 문구가 많이 포함되어 있지 않기 때문에 실제로 소스 코드를 다운로드하지 않고는 검색하기가 어렵습니다 :-).

위 링크는 v5.0 소스코드의 특정 줄번호로 연결되는 링크입니다. 사용만병 통치약, 난 정말 좋아 :-).

답변2

사용자 공간은 커널에 의해 관리되고 실행되므로 사용자 공간 내에서 커널 수준의 분할 오류가 발생하면 커널에 영향을 미칩니다.

각 시스템은 로깅 설정, 커널 설정, systemd 사용 여부에 따라 다르게 동작합니다(그러나 dmesg는 일반적으로 기본 디버깅/로깅 위치입니다).

특정 경우에 어떤 프로세스가 segfault를 생성했는지 알면 문제가 되는 프로세스를 사용 strace하거나 디버깅할 수 있습니다.gdb appname

https://wiki.archlinux.org/index.php/Step-by-step_debugging_guide이 가이드는 segfault를 디버그하는 방법에 대한 자세한 내용을 제공합니다.

관련 정보