mmap() 함수에서 사이즈 인자인 length 인자를 페이지 사이즈보다 작게 주고
다시 munmap() 을 통해 해제한 뒤, 또 다시 위 과정을 하면 오류가 나는데 왜이러는 거임?
설명이 좀 부실하고 이해가 안될텐데 시나리오가 이럼
시스템 페이지 사이즈는 16kb
addr = mmap(.., 1024, ..);
munmap(addr, 1024);
addr = mmap(.., 1024, ..); --> invalid argument 반환
시스템 페이지 사이즈보다 큰 값을 주면 잘 돌아가긴 함
나머지 인자는 어떻게 줬음?
https://github.com/chankim9321/mywork/blob/master/syslec/procLec/ipc/main.c
링크는 잘 작동되는 코드이고 저기서 length 값을 1024 로 바꿔버리면 안됨
https://man7.org/linux/man-pages/man2/mmap.2.html
offset
must be a multiple of the page size as returned by sysconf(_SC_PAGE_SIZE). 첫번째는 성공하는 이유가 0도 페이지 크기에 정렬된 값이고 두번째인 1024는 아님.
매뉴얼 페이지는 이렇게 설명함 :
EINVAL The addr argument (if MAP_FIXED was specified) or off is not a multiple of the page size as returned by sysconf(), or is considered invalid by the implementation.
해석해보면 offset 값이 문제였단 소리같은데.. 매번 offset은 내가 설정해준 length 값에 따라 증가하는데 이 값이 페이지 사이즈의 정수배가 아니라서 오류를 반환하는 거지? 첫번째는 0이니까 상관없는거고
페이지 사이즈가 너가 말한대로 16 kB라면 offset 값은 항상 16384 단위로 증가해야함. length 값은 상관없음.
offset은 어디에서 부터 읽을 건지의 값인줄 알았는데 페이지 사이즈단위에 맞춰야 한다는게 좀 이해가 안되네.. 암튼 ㄳㄳ 이해 잘됬슴
만약 하나의 파일을 페이지 크기보다 작은 단위로 쪼개서 읽지 않고 여러개의 파일의 첫번째 1024바이트 만큼만을 읽는 프로그램을 작성한다면 mmap 호출은 항상 성공할거임.