copy_to_user, copy_from_user
글쓴이: declspec / 작성시간: 목, 2011/04/28 - 9:26오후
리눅스 커널모듈을 만들때 응용프로그램와 데이터를 주고받기 위해서
copy_to_user 와 copy_from_user, get_user, put_user 등을 사용하잔아요?
그런데 copy_to_user 의 경우 응용 프로그램의 가상메모리주소에 쓰기작업을 수행하고
copy_from_user 의 경우는 응용프로그램의 가상메모리주소에서 읽기작업을 하는것이데
그것은 즉 커널모듈은 커널, 유저 모두의 메모리 영역을 접근할수 있다는 것인가요?
즉 유저는 커널메모리에 접근 못하지만
커널은 유저메모리에 접근가능한가요?
또한 커널모듈이 유저프로그램의 메모리에 접근할때
그 주소는 가상주소 아닌가요?
가상주소는 한 프로세스 내에서만 유효한 주소인데
독립적인 프로세스인 커널모듈이 어떻게 임의의 유저프로그램의 가상주소에
접근할수 있나요? 00401000 이라는 유저프로그램 주소가 있어도
이게 어떤 프로그램의 주소인줄을 모를것같은데...?
Forums:
커널 모듈이 독립적인 프로세스다는 언급은 좀
커널 모듈이 독립적인 프로세스다는 언급은 좀 이상하네요. 커널 모듈은 커널 코드의 일부분일뿐
그 코드가 독립적인 프로세스로 동작할 수도 아닐 수도 있습니다. 그 코드의 어떤 부분이
A) kernel thread로 돌면 독립적인 프로세스가 되기도 하겠지만
B) 어떤 부분은 그냥 유저 프로세스가 system call 호출시 불려지기만 하는 함수일 수도 있겠고
C) 또 어떤 부분은 인터럽트 핸들러처럼 독립적인 프로세스도 아니고 system call에서 불리는 함수도
아닌 경우가 있습니다. (threaded irq 같은 경우 제외)
copy_to_user 등은 B의 경우 주로 사용합니다. 현재 프로세스가 무엇인지는 커널이 잘 알고 있죠.
A의 경우엔 user 영역 맵핑이 없으므로 사용할 일이 없고요. C의 경우엔 현재 프로세스가 뭔지
신경쓰면 이상한 경우죠.
현재 프로세스가 아닌 임의의 다른 프로세스의 user 영역 메모리를 접근하려면... 음 그 프로세스의
task_struct로부터 mm 정보를 얻어 맵핑된 물리 메모리를 찾아내는 좀 복잡한 방법이 필요하지 싶은데
가능은 할거 같습니다만 정확히 모르겠네요;;
댓글 달기