11. memory mapping and Copy-on-write (COW) {SP}
README#
7. Linking {CSAPP}에서 shared object (.so
)는 런타임에 메모리에서 참조될 수 있다고 이야기 했다. 그러면 이제 그것이 어떻게돌아가는지를 알아야겠지? shell이 새 프로그램을 실행시킬 수 있었던 이유는 바로 execve
덕분임. fork한 프로세스는 초기에는 부모와 완전히 동일한 메모리 주소를 사용하고 있기에 새 코드를 로드하여야 한다. 이 과정에서 COW(Copy On Write) 메커니즘이 들어간다.
7. Linking {CSAPP} 에서 shared libraries에 대한 내용이 있었다. 두 프로세스가 공유자원인 glib에 접근하는데 굳이 복제하지 않고도 각자의 프로세스의 가상 메모리의 어느 공간에 해당 위치를 매핑하기만 한다면 자유로이 그 공유공간을 쓸 수 있을 것이다.
가상메모리 안에서 공유 메모리 공간과 매핑을 담당하는 공간이 존재하더라. vm_area_struct
가 하는 일이 뭐지?
User-Level Memory Mapping mmap
#
void *mmap(void *start, int len, int prot, int flags, int fd, int offset)
map
len
bytes starting atoffset
of the file specified by file descriptionfd
, preferably at addressstart
파일 디스크립터의 내용을 매핑하여 start
주소를 리턴하는 것이라서 프로세스별로 정확한 가상메모리 상의 위치는 다를 수 있다.
mmcopy.c
#include "csapp.h"
void mmapcopy(int fd, int size)
{
/* Ptr to memory mapped area */
char *bufp;
bufp = mmap(NULL, size, PROT_READ, MAP_PRIVATE,fd, 0);
write(1, bufp, size);
return;
}
/* mmapcopy driver */
int main(int argc, char **argv)
{
struct stat stat; int fd;
/* Check for required cmd line arg */
if (argc != 2) {
printf("usage: %s <filename>\n", argv[0]);
exit(0);
}
/* Copy input file to stdout */
fd = open(argv[1], O_RDONLY, 0);
fstat(fd, &stat);
mmapcopy(fd, stat.st_size);
exit(0);
}
Address Translation with a Page Table#
너가 여기서 왜 나와?
Stack Memory#
프로세스의 스택 영역은 자동으로 관리가 된다고 했다! 커널이 MMU를 통해서 프로그램 스택을 관리해주기 때문에 우리는 단순히 call
, brk
만 잘 쓰면 된다.