2013-03-06 4 views
1

커널 모드 코드는 사용 가능한 모든 주소 (높은 권한)에 액세스 할 수 있지만 커널 모드 함수에 사용자 모드 포인터를 전달하면 사용하기 전에 변경 될 것입니까? 내 말은 : 그것은 사용자 모드에서와 같이 페이징/분할 시스템 (또는 긴 모드의 경우 페이징)으로 해결 될 것인가?커널 모드 - 사용자 모드에 액세스 할 수 있습니까?

답변

2

우선, "커널 모드 기능에 대한 포인터를 제공하지"마십시오. 커널 호출은 단순한 점프가 아니며 특수 명령어 또는 소프트웨어 인터럽트입니다. 커널 함수 호출 규칙은 일반적인 함수 호출과도 다릅니다.

어떤 경우에도 커널 컨텍스트에서 사용자 메모리에 액세스하는 방법은 문제가되는 운영 체제에 따라 다릅니다. 커널은 일반적으로 자체의 (가상) 주소 공간을 가지고 있습니다. 이는 사용자 프로세스 공간 (예 : 32 비트 OSX)에서 완전히 독립적 인 주소 공간이거나 특수 영역 (많은 OS에서 고/저 주소 분할) 일 수 있습니다. 고/저 모델에서 커널은 일반적으로 해당 프로세스의 컨텍스트에서 실행 중일 때 사용자 공간 에 대한 포인터를 비 참조화할 수 있습니다.. 일반적인 경우, 커널은 사용자 가상 주소가 참조하는 기본 물리적 메모리를 명시 적으로 검색 한 다음이를 자신의 가상 주소 공간으로 매핑 할 수 있습니다.

사용자 공간이 악의적으로 나쁜 포인터를 제공 할 수 있으므로 처음에는 유효성을 확인하지 않고 커널에서 절대 사용해서는 안됩니다. 이 접근과 후속 접근은 사용자 프로세스의 메모리 맵에 관해서는 원자 적이어야한다. 그렇지 않으면 프로세스는 커널의 포인터 유효성 검사와 실제로 메모리 읽기/쓰기 사이의 시간 범위 인 munmap() 일 수있다. 이러한 이유로 대부분의 커널은 안전성이 보장되거나 유효하지 않은 포인터의 경우 오류를 반환하는 사용자 및 커널 공간 사이에 본질적으로 안전한 memcpy 인 도우미 기능을 가지고 있습니다.

어떤 경우에도 커널 코드는이 모든 작업을 명시 적으로 수행해야하며 그에 대해 "자동"이 없습니다. 여러분의 시스템 콜은 커널 모듈에 도달하기 전에이를 자동화하는 추상적 인 레이어를 통과 할 수 있습니다.

업데이트 : 현대 하드웨어는 사용자 주소 공간에 대한 포인터의 우발적 인/악의적 인 역 참조를 방지하기 위해 설계된 SMAP (관리자 모드 액세스 방지)를 지원합니다. 다양한 운영 체제가이 기능을 사용하기 시작 했으므로 이러한 경우 사용자 메모리에 액세스하기위한 특별한 커널 기능을 반드시 수행해야합니다.