솔라리스/리눅스

사용자 메모리 읽기와 쓰기-리눅스

지니아부지 2011. 5. 13. 21:33

사용자 메모리 읽기와 쓰기 http://www.ibm.com/developerworks/kr/library/l-system-calls/

리눅스 커널은 사용자 영역과 시스템 호출 인수를 주고받기 위해 여러 함수를 제공한다.

먼저 (get_userput_user처럼) 기본 유형을 위한 단순한 함수 집합이 있다.
구조체나 배열과 같은 자료 블록을 움직이기 위해서는 copy_from_usercopy_to_user라는 다른 함수 집합을 사용한다.
NULL 문자로 끝나는 문자열을 움직이려면 strncpy_from_userstrlen_from_user 같은 또 다른 함수 집합을 사용한다.
사용자 영역 포인터가 유효한지 확인하기 위해 access_ok라는 함수를 호출할 수도 있다. 이런 함수 집합은 linux/include/asm/uaccess.h에 정의되어 있다.

주어진 연산을 위해 사용자 영역 포인터 검증하는 데 access_ok 매크로를 사용한다. 이 함수는 접근 유형(VERIFY_READVERIFY_WRITE), 사용자 영역 메모리 블록을 가리키는 포인터, 블록 크기(바이트 단위)를 받는다. 이 함수는 성공일 때 0을 반환한다.

int access_ok( type, address, size );

커널과 사용자 영역 사이에 (int나 long과 같은) 단순 타입 자료를 이동하려면 get_userput_user를 사용해 쉽게 프로그래밍이 가능하다. 이 매크로는 값과 값을 가리키는 포인터를 받아들인다. get_user 함수는 사용자 영역 주소(ptr)가 지정하는 값을 지정된 커널 변수(var)로 옮긴다. put_user 함수는 커널 변수(var)가 지정하는 값을 사용자 영역 주소(ptr)로 옮긴다. 두 함수는 성공일 때 0을 반환한다.

int get_user( var, ptr );int put_user( var, ptr );

구조체나 배열과 같은 더 큰 객체를 이동하려면, copy_from_usercopy_to_user 함수를 사용한다. 이 두 함수는 사용자 영역과 커널 사이에 전체 자료 블록을 옮긴다. copy_from_user 함수는 사용자 영역에서 커널 영역으로 자료 블록을 옮기며, copy_to_user는 커널에서 사용자 영역으로 자료 블록을 옮긴다.

unsigned long copy_from_user( void *to, const void __user *from, unsigned long n );unsigned long copy_to_user( void *to, const void __user *from, unsigned long n );

마지막으로, NULL로 끝나는 문자열을 사용자 영역에서 커널로 복사하려면 strncpy_from_user 함수를 사용한다. 이 함수 호출 전에 strlen_from_user 매크로를 호출해 사용자 영역 문자열 크기를 얻을 수 있다.

long strncpy_from_user( char *dst, const char __user *src, long count );strlen_user( str );

이런 함수 집합은 커널과 사용자 영역 사이에 메모리를 이동하는 기본 기능을 제공한다. (수행할 검사량을 줄이기 위해) 몇몇 추가 함수가 존재한다. uaccess.h에서 이런 함수를 찾을 수 있다.


'솔라리스/리눅스' 카테고리의 다른 글

mtd util download  (0) 2011.06.08
busybox  (0) 2011.06.07
compile -static 적용시 err  (0) 2011.06.07
linux cmd grep  (0) 2011.06.07
linux cmd cp  (0) 2011.06.03