리눅스 커널 영역에서는 사용자 메모리 공간을 포인터를 이용해서 메모리를 바로 사용할 수 없다.
따라서 복사해야 한다.

유저영역의 메모리를 커널로 복사하는 함수는 copy_from_user 이다.

이런 불편함때문에 생긴게 mmap 이다.  어플이 메모리를 커널에 바로 메모리를 (zero copy) 잡는다.



안드로이드 ipc에는 이런 코드들이 있다. 
binder_wirte_read struct를 을 복사할 때는 copy_from_user, get_user 함수를 이용한다.

transport 하는 데이터는 mmap 으로 관리하도록 되어 있다.
binder_mmap 함수가 바로 그것..

그 안에 binder_update_page_range 함수를 호출하여 물리메모리와 커널의 가상메모리의 수신버퍼, 사용자 공간의 수신버퍼를 매핑한다.

Posted by '김용환'
,