ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [linux] mmap sys call
    Programming/system programming 2015. 11. 1. 12:17

    원문 http://blog.naver.com/saiezo/120194833729

    참조: http://man7.org/linux/man-pages/man2/mmap.2.html

    http://unix.superglobalmegacorp.com/Net2/newsrc/sys/mman.h.html


    #include <unistd.h>

    #include <sys/mman.h>

    void* mmap(void* start, size_t length, int port, int flags, int fd, off_t offset)


    mmap() 함수는 fd로 지정된 디바이스 파일의 내용을 offset에 해당하는 물리 주소에서 시작하여 length 바이크 만큼을 start 주소로 copy해준다. (map or unmap files or devices into memory)


    ● start : 요청한 물리 주소 공간을 매핑하고자 하는 주소로, 보통 '0'을 사용, 강제적인 요구가 아니기 때문에 다른 값을 지정해도 꼭 그 값으로 매핑시켜 반환되지는 않는다.

    ● length : 매핑하고자 하는 주소 공간의 크기로, PAGE_SIZE의 배수여야 한다

    ● prot : 메모리 보호 모드를 설정한다

    - PORT_EXEC : 페이지가 실행될 수 있다

    - PORT_READ : 페이지를 읽을 수 있다

    - PORT_WRITE : 페이지에 쓸 수 있다

    - PORT_NONE : 페이지에 접근할 수 없다

    ● flags : 대응된 객체 타입, 대응 옵션, 대응된 페이지 복사본에 대한 수정을 그 프로세스에만 보일 것인지 참조하는 다른 프로세스와 공유할 것인지를설정한다. MAP_SHARED나 MAP_PRIVATE 중 하나는 반드시 명시해야 한다.

    - MAP_FIXED : 지저된 주소 이외에는 선택하지 않는다. 지정된 주소를

    사용할 수 없으면 mmap은 실패한다. 그리고 MAP_FIXED가 지정되면 start는 페이지 크기의 배수여야 한다. 가급적 MAP_FIXED 옵션은 사용하지 않는 편이 좋다

    -MAP_SHARED : 이 객체를 대응시키는 다른 프로세스와 대응 영역을 공유한다

    -MAP_PRIVATE : 다른 프로세스와 대응 영역을 공유하지 않는다

    ● fd : 디바이스 파일의 파일 디스크립터

    ● offset : 매핑시키고 싶은 물리 주소, 이 값은 디바이스 드라이버에 전달되지만, 디바이스 드라이버가 다른 주소를 매핑할 경우 쓰이지 않는다. 이 주소 역시 PAGE_SIZE 단위로 지정되어야 한다.


    ● 반환값 : 

    성공하면 대응된 영역의 포인터를 반환

    실패하면 MAP_FAILED(-1)이 반환되고, errno는 다음 값으로 설정된다

    - EBADF : fd가 유요한 파일 디스크립터가 아니다

    - EACCES : MAP_PRIVATE가 설정되었지만, fd가 읽을 수 있도록 열려있지 않다. 또는 MAP_SHAFED와 PROT_WRITE가 설정되었지만, fd가 쓸 수 있도록 열려 있지 않다

    - EINVAL : start나 length나 offset이 적당하지 않다.(너무 크거나 PAGESIZE 경계로 정렬되어 있지 않다)

     ETXTBUSY : MAP_DENYWRITE가 설정되었으나 fd로 지정된 객체가 쓸 수 있도록 열려 있다

    - EAGAIN : 파일이 잠겨있거나 너무 많은 메모리가 잠겨 있다

    - ENOMEM : 사용할 수 있는 메모리가 없다


    'Programming > system programming' 카테고리의 다른 글

    [linux] 디바이스 드라이버 만들기  (0) 2015.06.01
    [네트워크]주소변환관련 API  (0) 2014.10.03
    [Linux] shared memory  (0) 2013.06.19
Designed by Tistory.