커널공간 유저공간에 대한질문입니다.
질문이있습니다.
보통 copy_to_user,copy_from_user 같은 함수로
커널영역과 유저영역에 값을 주고받지 않습니까?
그런데 return 값일 경우에는 커널 유저공간의 구분이 없이(위같은
함수를 호출하지 않고요) 그냥 동일 영역에 있는것처럼 값을 받을수가 있네요.
어떻게 이게 가능한지 조언좀 부탁드립니다^^.
음 그러니까.
아래와 같은 코드가있다고 할때요. getbuf는 커널쪽 시스템콜이고요
유저영역 프로그램
main()
{
char* buf = (char*)malloc(100);
int size = getbuf(buf);
}
커널영역 시스템콜getbuf
int getbuf(char* buf)
{
int size;
char data[100];
..
..
..
data 값을 구해서 buf에 넣는다.
size = copy_to_user(buf,data,size)
return size;
}
유저영역의 버퍼 buf에 값을 커널쪽에서 채우려면 copy_to_user를
써주잖아요. 그런데 리턴값은 그런 함수가 없이도 그냥 받습니다.
더 흔한예로 fopen() 을 하면 open() 시스템콜이 안에서 호출되고 fd값이
리턴되잖아요. 그것도 커널쪽에서 값이 정해져서 결국 유저쪽으로 리턴되는건데
copy_to_user()같은 메소드가 없이 일반 코드 return 문만으로 유저영역으로
값을 넘겨주네요.
조언 부탁드려요-
스택과 메모리
함수의 리턴
포인터를 이용한 값의 전달
인자로 포인터를 주어 메모리의 위치를 가리키게 하여 값의 복사가 이루집니다.
사용자 영역에 할당된 메모리 주소에 커널영역 메모리에 할당된 값을 복사해 주는것과
함수를 호출한 곳으로 return값을 전달해줄때 사용되는 것과 다르죠
https://nicesj.com
https://blog.nicesj.com
쓰고나니..크로스~ 포스팅이었네 =_=
쓰고나니..크로스~ 포스팅이었네 =_=
https://nicesj.com
https://blog.nicesj.com
댓글 달기