http://linuxkernel.net/faq/index.php?cmd=read§ion=kernelprog-advanced2&num=2Q: get_user() 함수와 put_user() 함수는 어떻게 사용합니까?

A: 사용자 영역과 커널 영역 사이에서 데이터를 교환해야 하는 경우가 있습니다. 대표적인 예로 system call에서 인자를 넘길 때로 커널 영역에서는 사용자 메모리를 바로 접근할 수 없으므로 사용자 영역의 데이터는 커널 영역으로 복사를 해야 합니다.

이러한 작업을 할 때 사용하는 함수로는 get_user(), put_user(), copy_from_user(), copy_to_user()가 있습니다.

get_user(), copy_from_user()는 사용자 영역에서 커널 영역으로 복사를 하고, put_user(), copy_to_user()는 커널 영역에서 사용자 영역으로 복사를 합니다. copy_from_user(), copy_to_user() 함수는 복사를 할 때 복사할 길이를 지정합니다. get_user(), put_user()는 복사할 길이를 지정하지 않습니다. 이 함수들은 인자로 넘어온 변수의 길이를 스스로 검사하여 해당하는 길이만큼 복사를 합니다. 그리고 이 함수는 1, 2, 4 바이트만큼만 복사할 수 있습니다. 따라서 넘어온 인자의 type을 알 수 없다거나, 그 크기가 1, 2, 4 바이트가 아니라면 이 함수를 사용할 수 없습니다.

get_user()은 inline 함수로 정의되어 있습니다. 이 함수를 부르면 컴파일러는 인자의 길이에 따라서 get_user_1(), get_user_2(), get_user_4() 함수로 이를 바꿉니다. 이에 해당하지 않는 경우는 get_user_X()로 바꾸로 모듈 로드시 unresolved symbol 에러를 발생시킵니다. put_user() 함수도 똑같은 방법으로 동작합니다. 때로 넘겨준 인자 길이가 1, 2, 4 바이트에 해당하는 데에도 불구하고 unresolved symbol 에러가 발생하는 경우가 있습니다. 이 때는 컴파일을 할 때 -O1 이상의 최적화 옵션을 주기 바랍니다.

by flyduck 2000/06/09


Add a comment

« PREV : 1 : ··· : 88 : 89 : 90 : 91 : 92 : 93 : 94 : 95 : 96 : 97 : NEXT »

티스토리 툴바