문제

UMMAPPEND 주소로 읽고 쓰기/점프하는 경우.

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

이로 인해 분할 오류가 발생합니다.

가로 채는 시스템의 실제 부분 (커널)이 표시되지 않은 주소 (어떻게?) "사용자 모드"신호를 던지는 부분은 무엇입니까?

도움이 되었습니까?

해결책

모든 것이 아키텍처 트랩 테이블에서 흐릅니다. 이는 일반적으로 Entrys.s (Entry_32와 Entry_64.s 사이의 x86에서 분할)라고하며 커널의 C 코드로 향하기 전에 여러 가지 작업 (구성에 따라 다름)을 수행하는 어셈블러 연결이 있습니다.

따라서 잘못된 메모리 액세스는 page_fault 또는 general_protection을 통해 입력해야하며 아마도 Send_signal (kernel/signal.c)의 사용자 공간으로 다시 대기를하기 전에 Force_sig_info를 수행하게 될 것입니다.

다른 팁

다른 아키텍처를 위해 구현됩니다. 예를 들어 x86에서는 소스를 확인할 수 있습니다.

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

"Book E"가 아닌 PowerPC 칩 (예 : 임베디드 시스템의 최근 칩)에서 세그먼테이션 오류는 0x300 (데이터의 경우) 또는 0x400 (지침)으로 시작합니다. 사용자/수퍼바이저 모드 플래그는 수퍼바이저로 설정됩니다. MMU가 꺼지고 CPU는 0x300 또는 0x400을 주소로 점프하여 운영 체제를 제어합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top