Skip to content

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에 접근하는데 굳이 복제하지 않고도 각자의 프로세스의 가상 메모리의 어느 공간에 해당 위치를 매핑하기만 한다면 자유로이 그 공유공간을 쓸 수 있을 것이다.

스크린샷 2023-09-14 오후 10.32.50.png

가상메모리 안에서 공유 메모리 공간과 매핑을 담당하는 공간이 존재하더라. vm_area_struct가 하는 일이 뭐지?

스크린샷 2023-09-14 오후 9.44.01.png

User-Level Memory Mapping mmap#

void *mmap(void *start, int len, int prot, int flags, int fd, int offset)

map len bytes starting at offset of the file specified by file description fd, preferably at address start

파일 디스크립터의 내용을 매핑하여 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#

너가 여기서 왜 나와?

스크린샷 2023-09-14 오후 10.45.47.png

Stack Memory#

프로세스의 스택 영역은 자동으로 관리가 된다고 했다! 커널이 MMU를 통해서 프로그램 스택을 관리해주기 때문에 우리는 단순히 call, brk만 잘 쓰면 된다.