Neoteny

반응형

read, write에 전달되는 버퍼 포인터는 디바이스 드라이버에서 직접적으로 사용할 수 없다. 그 이유는 디바이스 드라이버가 동작하는 메모리 공간은 커널 공간이고, 응용 프로그램이 동작하는 메모리 공간은 사용자 메모리 공간이기 때문이다.


. #include <asm/uaccess.h>

. verify_area(type, addr, size): 사용자 공간의 메모리는 커널 공간의 메모리와 다르게 물리적인 공간에 해당 메모리가 없을 수도 있다(스왑).


. copy_to_user(to, from, n): 커널 메모리 from을 사용자 메모리 to로 n만큼 복사한다.

. put_user(x, ptr): x 변수값을 ptr의 사용자 메모리값에 대입한다.


. copy_from_user(to, from, n): 사용자 메모리 from을 커널 메모리 to로 n만큼 복사한다.

. get_user(x, ptr): x변수에 ptr의 사용자 메모리값을 대입한다.


사용자 공간의 메모리 블록의 유효성을 검사하고, 커널 공간의 메모리 블록에 복사하거나 반대로 커널 공간의 메모리 블록을 사용자 공간의 메모리 블록에 복사한다. 이런 함수를 이용해 두 공간의 메모리 접근을 간접적으로 수행하기 때문에 디바이스 드라이버에서 read()와  write()함수를 이용해 하드웨어에 접근하는 것은 조금 느리다. 사용자 모드에서 커널 모드로 이동하면서 데이터가 두 번 복사되어야 하기 때문이다. 이를 직접적으로 접근할 수 있게 하는 방법으로 "메모리 매핑"을 사용한다.

반응형