: 페이지가 메모리에 상주하고 있는지?
-> 참조시 페이지폴트를 유발하는지 여부의 벡터를 반환
addr에서 시작해 length 바이트 만큼의 페이지에 대한 상주정보 커널이 반환
#include <unistd.h>
#include <sys/mman.h>
int mincore(void *addr, size_t length, unsigned char *ver);
: 성공시 0, 오류시 -1반환 & global variable errno 설정
> PROT_READ: 읽기가능, PROT_WRITE: 쓰기가능, MAP_PRIVATE: 매핑 공유X 변경 메모리속성 반영 안함, MAP_ANONYMOUS: 파일 디스크립터로 인식 x, MAP_POPULATE: 매핑에 대한 PT 활성화
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) 결과