커널이 프로세스 자체와 동일한 가상 주소 공간에 매핑될 때 `copy_from_user()` 및 `copy_to_user()`가 필요한 이유는 무엇입니까?

커널이 프로세스 자체와 동일한 가상 주소 공간에 매핑될 때 `copy_from_user()` 및 `copy_to_user()`가 필요한 이유는 무엇입니까?

커널이 프로세스 자체와 동일한 가상 주소 공간에 매핑될 때 왜 필요합니까 copy_from_user()?copy_to_user()

학습 목적으로 몇 가지 (장난감) 커널 모듈을 개발한 후 나는 이를 빨리 깨달았고 copy_from_user()사용자 copy_to_user()공간 버퍼에서/로 데이터를 복사하는 데 필요했습니다. 그렇지 않으면 잘못된 주소와 관련된 오류로 인해 충돌이 발생했습니다.

그러나 0x1fffff가상 주소가 사용자 공간 버퍼를 가리키는 경우 해당 주소가 커널에서 유효하지 않은 이유는 무엇입니까? 커널은 동일한 가상 주소 공간에 있으므로 0x1fffff동일한 실제 메모리에 매핑됩니다.

여기에 이미지 설명을 입력하세요

여기에 이미지 설명을 입력하세요

답변1

주소 공간 매핑은 일부(전부는 아님!) 아키텍처에서 동일하지만 동일한 아키텍처에서도 보호 수준은 그렇지 않습니다. copy_from_user등은 세 가지 주요 목적을 수행합니다.

  • 읽거나 쓸 메모리에 대한 권한이 사용자 공간에서 실행 중인 프로세스가 읽거나 쓸 수 있도록 허용하는지 확인합니다. 이를 통해 프로세스가 커널을 속여 프로세스가 접근해서는 안 되는 메모리에 액세스할 수 없도록 보장합니다. 할 수있다;
  • 보호 오류로 인해 커널이 충돌하지 않도록 특정 오류 처리를 허용합니다. 예를 들어 요청된 주소가 현재 매핑되지 않은 경우(제로 페이지 또는 교체된 페이지를 생각해 보세요)
  • 커널이 자체 보호 기능을 넘어서지 않도록 보장합니다.예를 들어 SMAP또는 커널 특정 주소 공간(S/390).

일부 아키텍처는 이러한 기능이 바로 가기를 사용할 수 있도록 하는 메모리 레이아웃을 사용합니다.예를 들어물리적 메모리의 직접 매핑을 사용하지만 그렇다고 가정할 수는 없으며 어쨌든 모든 상황을 처리하지는 않습니다(스왑 아웃된 페이지는 물리적 메모리에 존재하지 않습니다).

관련 정보