하드웨어에서 세그폴트가 발생할 때마다 Linux 커널은 어떤 단계를 수행합니까? 이제 오류 처리기가 IDT를 통해 이를 처리하고 kern.log(dmesg) 어딘가에 오류에 대한 메시지가 있다는 것을 알았습니다.
제가 이 질문을 드리는 이유는 하이퍼바이저를 개발 중이고 사용자 공간에 세그폴트가 발생할 때마다(시스템이 충돌해서는 안 됨) 시스템이 충돌하기 때문입니다(충돌은 kern.log의 메시지 이후에만 발생합니다). 따라서 세그폴트가 발생했을 때 커널이 수행하는 작업을 추적할 수 있다면 많은 도움이 될 것입니다.
답변1
- 아치/x86/kernel/idt.c:152
page_fault
-IDT 의 경우 - 아치/x86/항목/entry_64.S:1143- 로 정의된 래퍼
page_fault
함수do_page_fault()
, 매크로를 사용하여 구현됨idtentry
- 아치/x86/항목/entry_64.S:847
idtentry
-매크로 - 아치/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를 디버그하는 방법에 대한 자세한 내용을 제공합니다.