사용자 메모리 읽기와 쓰기 http://www.ibm.com/developerworks/kr/library/l-system-calls/
리눅스 커널은 사용자 영역과 시스템 호출 인수를 주고받기 위해 여러 함수를 제공한다.
먼저 (get_user
나 put_user
처럼) 기본 유형을 위한 단순한 함수 집합이 있다.
구조체나 배열과 같은 자료 블록을 움직이기 위해서는 copy_from_user
나 copy_to_user
라는 다른 함수 집합을 사용한다.
NULL 문자로 끝나는 문자열을 움직이려면 strncpy_from_user
와 strlen_from_user
같은 또 다른 함수 집합을 사용한다.
사용자 영역 포인터가 유효한지 확인하기 위해 access_ok
라는 함수를 호출할 수도 있다. 이런 함수 집합은 linux/include/asm/uaccess.h에 정의되어 있다.
주어진 연산을 위해 사용자 영역 포인터 검증하는 데 access_ok
매크로를 사용한다. 이 함수는 접근 유형(VERIFY_READ
나 VERIFY_WRITE
), 사용자 영역 메모리 블록을 가리키는 포인터, 블록 크기(바이트 단위)를 받는다. 이 함수는 성공일 때 0을 반환한다.
int access_ok( type, address, size ); |
커널과 사용자 영역 사이에 (int나 long과 같은) 단순 타입 자료를 이동하려면 get_user
와 put_user
를 사용해 쉽게 프로그래밍이 가능하다. 이 매크로는 값과 값을 가리키는 포인터를 받아들인다. get_user
함수는 사용자 영역 주소(ptr
)가 지정하는 값을 지정된 커널 변수(var
)로 옮긴다. put_user
함수는 커널 변수(var
)가 지정하는 값을 사용자 영역 주소(ptr
)로 옮긴다. 두 함수는 성공일 때 0을 반환한다.
int get_user( var, ptr );int put_user( var, ptr ); |
구조체나 배열과 같은 더 큰 객체를 이동하려면, copy_from_user
와 copy_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 |