2012-09-17 3 views
0

새로운 시스템 호출을 소개 연습으로 구현했습니다. 모든 것은 버퍼를 가져 와서 그 버퍼를 출력합니다. 나중에 copy_from_user를 사용하는 것이 올바른 방법이라는 것을 알게되었습니다.사용자 공간에서 초기화 된 char *을 printk 할 때 어떻게됩니까?

이것은 주소를 확인하기위한 예방책 일 뿐이며, 볼 수없는 오류 (페이지 오류)가 발생하는 시스템 호출입니까?

예방 조치 일 뿐이라면 어떤 보호 장치입니까?

감사합니다.

답변

6

몇 가지 이유가 있습니다.

  1. 일부 아키텍처는 사용자 메모리를위한 별도의 세그먼트가있는 세그먼트 메모리를 사용합니다. 이 경우 실제로는 올바른 메모리 주소를 얻으려면 copy_from_user이 필수적입니다.
  2. 커널은 (정의상) 많은 권한 정보를 포함하여 모든 것에 액세스 할 수 있습니다. copy_from_user을 사용하지 않으면 사용자가 커널 주소를 전달할 때 정보 공개가 허용 될 수 있습니다. 더욱이 copy_to_user없이 사용자가 제공 한 버퍼에 쓰는 경우 사용자가 커널 메모리를 덮어 쓸 수 있습니다.
  3. 잘못된 포인터를 전달하여 사용자가 커널 모듈을 손상시키지 못하도록하고 싶습니다. copy_from_user을 사용하면 예를 들어 시스템 호출 핸들러는 잘못된 사용자 포인터에 대한 응답으로 EFAULT을 반환 할 수 있습니다.