커널이 프로세스 자체와 동일한 가상 주소 공간에 매핑될 때 "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등은 세 가지 주요 목적을 수행합니다.

  • 읽거나 쓸 메모리의 권한이 사용자 공간에서 실행 중인 프로세스가 읽거나 쓸 수 있도록 허용하는지 확인합니다. 이는 프로세스가 프로세스가 할 수 없어야 하는 메모리에 액세스하도록 커널을 속일 수 없도록 보장합니다.
  • 예를 들어, 요청된 주소가 현재 매핑되지 않은 경우(제로 페이지 또는 교체된 페이지 고려) 오류가 커널 충돌로부터 보호하기 위해 특정 오류 처리를 허용합니다.
  • 자체 보호 기능을 통해 코어가 넘어지지 않도록 보장합니다.예를 들어 계면활성제또는 커널 특정 주소 공간(S/390).

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

관련 정보