[ C++ ] mincore()

김우경·2020년 11월 15일
0

mincore()

: 페이지가 메모리에 상주하고 있는지?
-> 참조시 페이지폴트를 유발하는지 여부의 벡터를 반환
addr에서 시작해 length 바이트 만큼의 페이지에 대한 상주정보 커널이 반환

#include <unistd.h>
#include <sys/mman.h>

int mincore(void *addr, size_t length, unsigned char *ver);

1) parameters

  • addr: 시스템 페이지 크기의 배수
    -> 페이지 크기: sysconf(_SC_PAGESIZE)로
  • length: 페이지 크기 다음 배수로 올림됨 ??
  • vec : 적어도 (length+PAGE_SIZE-1)/PAGE_SIZE 바이트를 담은 배열에 대한 포인터
    -> 상주하고 있으면 대응 바이트의 최하위 비트, 상주하지 않으면 해제
    -> states is returned in the vec array (one character per page)
    -> 페이지가 언제든 들어오고 나갈 수 있으므로 반환시점의 vec값이 이미 낡은 값일수도
    —> to ensure? lock it into memory with the mlock(2) system call.

2) return values

 : 성공시 0, 오류시 -1반환 & global variable errno 설정

3) void mmap(void start, size_t length, int prot, int flags, int fd, off_t offset);

  • *start : 어디에 파일 매핑할지의 주소
  • length : 매핑할 메모리의 길이
  • prot : 매핑에 원하는 메모리 보호 정책
    	> PROT_READ: 읽기가능, PROT_WRITE: 쓰기가능, MAP_PRIVATE: 매핑 공유X 변경 메모리속성 반영 안함, MAP_ANONYMOUS: 파일 디스크립터로 인식 x, MAP_POPULATE: 매핑에 대한 PT 활성화
  • flags : 매핑 유형, 동작구성요소
  • fd: 파일 기술자
  • offset: 매핑시 두번째 파라미터의 시작점
  • Return value: 지정된 영역이 매핑된 실제 위치를 반환

4) 코드

#include <stdio.h>
#include <assert.h>
#include <unistd.h>
#include <sys/mman.h>

int main(void) {
  unsigned char vec[20];
  int res;
  size_t PS = sysconf(_SC_PAGESIZE);  //페이지 크기 
  void *addr = mmap(NULL, 20 * PS, PROT_READ | PROT_WRITE,
                    MAP_NORESERVE | MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); //지정된 영역이 매핑된 실제 위치를 반환

  res = mincore(addr, 10 * PS, vec);    //mmap으로 구한 주소에 대해 
  assert(res == 0);     //성공시 0 반환하므로
  // -> vec : 페이지당 한 char 차지, 상주 시 대응 바이트의 최하위 비트, 상주하지 않으면 해제

  for (int i = 0; i < 10; ++i){
    printf("vec[%d] : %d\n", i, vec[i]);
    assert((vec[i] & 1) == 0);
  }

  //5개의 페이지에 대해 상주시키기 ??
  for (int i = 0; i < 5; ++i)
    ((char *)addr)[i * PS] = 1;
  printf("***5개의 페이지에 대해 상주시킨 이후 값***\n");
  
  res = mincore(addr, 10 * PS, vec);
  assert(res == 0);
  
  for (int i = 0; i < 10; ++i){
    printf("vec[%d] : %d\n", i, vec[i]);
    assert((vec[i] & 1) == (i < 5));  //상주시킨 5개의 페이지에 대해 대응되는 최하위비트
  }


//나머지 5개의 페이지에 대해 상주시키기
  printf("\n *** 나머지 5개의 페이지에 대해 상주시킨 이후 값 ***\n");
  for (int i = 5; i < 10; ++i)
    ((char *)addr)[i * PS] = 1;

  res = mincore(addr, 10 * PS, vec);
  assert(res == 0);
  for (int i = 0; i < 10; ++i){
    printf("vec[%d] : %d\n", i, vec[i]);
    assert((vec[i] & 1) == 1);  //10개의 페이지에 대해 전부 상주되었는지 찍어보기
  }

  return 0;
}

5) 결과

profile
Hongik CE

0개의 댓글