일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 트리(Tree)
- 다익스트라 알고리즘(Dijkstra Algorithm)
- 알고리즘 개념
- 백준 21606번
- 백준 10000번
- 백준 2812번
- 백준 9012번
- 이분 그래프(Bipartite Graph)
- 백준 2493번
- BFS(Breadth First Search)
- 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm)
- 그래프(Graph)
- 백준 2261번
- BFS
- 그리디 알고리즘(Greedy Algorithm)
- 백준 18352번
- 분할 정복(Divide and Conquer)
- 백준 17608번
- DFS(Depth First Search)
- 동적 프로그래밍(Dynamic Programming)
- DFS
- 큐(Queue)
- 백준 1707번
- 위상 정렬(Topological Sort)
- 백준 2504번
- 위상 정렬(Topology Sort)
- DFS & BFS
- 백준 1948번
- 스택(Stack)
- 이분 탐색(Binary Search)
- Today
- Total
목록카이스트 정글 - 프로젝트 (40)
Always Be Wise
사용자 가상 주소 공간에서 발생한 페이지 폴트 및 시스템 콜의 경우, syscall_handler( ) 또는 page_fault( )에 전달된 intr_frame 구조체의 rsp를 사용하면 된다. 그러나 커널에서 페이지 폴트가 발생하는 경우, 추가적인 처리가 필요하다. 현재는 예외 처리 시 사용자 모드에서 커널 모드로 전환될 때만 프로세서가 스택 포인터를 저장하고 있다. 따라서, 페이지 폴트나 시스템 콜 핸들러가 호출될 때, 아래와 같이 thread 구조체에 현재 유저 스택 포인터를 미리 저장할 수 있도록 만들어야 한다. void syscall_handler (struct intr_frame *f UNUSED) { // TODO: Your implementation goes here. #ifdef VM ..
현재 Pintos의 스택은 USER_STACK에서 시작하는 단일 페이지이다. 프로그램의 실행은 이 사이즈로 제한된다. 이제부터는 스택이 필요에 따라 추가 페이지를 할당받아 그 사이즈를 확장할 수 있도록 만들어야 한다. 추가 페이지가 스택 접근으로 표시된 경우에만 페이지를 할당해야 한다. 스택 액세스를 다른 액세스와 구별하는 경험적 방법을 고안해야 한다. 사용자 프로그램이 스택 포인터 아래에 위치한 스택에 무언가를 쓰려고 할 경우 버그가 발생한다. 그런데 x86-64의 PUSH 명령은 스택 포인터를 조정하기 전에 액세스 권한을 확인한다. 따라서 스택 포인터 8바이트 아래에서 페이지 폴트가 발생할 수 있다. 사용자 프로그램의 스택 포인터 현재 값을 얻을 수 있어야 한다. 이는 사용자 프로그램에 의한 시스템 ..
맨 처음 페이지를 만들면 해당 페이지는 uninit 상태의 페이지이다. 다시 말해, 페이지의 타입 지정이 anon 혹은 file-backed일 수 있지만 아직은 해당 타입으로 초기화되지 않은 상태이다. 추후에 페이지 폴트가 발생했을 때, 타입에 맞는 초기화 함수를 호출함으로써 페이지의 상태가 변한다. vm_alloc_page_with_initializer( ) 함수는 uninit 상태의 페이지를 만들어 spt에 해당 페이지를 삽입하는 함수이다. 해당 함수는 커널이 새로운 페이지 요청을 수신할 때 호출된다. 우선, malloc( ) 함수를 이용하여 페이지를 할당받는다. 그리고 입력 받은 type 인자에 맞추어 initializer를 초기화 한다. 이후, uninit_new( ) 함수를 호출하여 최초 인자로..
이제부터는 anonymous page라고 하는 non-disk based image를 구현할 것이다. file-backed pages와 달리 anonymouse mapping은 명명된 파일 소스, 백업 파일이나 디바이스가 없기 때문에 익명이다. anonymous page는 스택과 힙과 같은 실행 파일에서 사용된다. include/vm/anon.h에 anonymous page를 설명하는 anon_page 구조체가 있다. anonymouse page 관련하여 필요한 정보나 상태를 저장하기 위해 멤버를 추가할 수 있다. include/vm/page.h에서 페이지의 일반 정보를 포함하고 있는 page 구조체도 참고해야 한다. 구조체 anon_page anon이 해당 page 구조체에 포함되어 있다. Page I..

우리가 정글에 온 이유는 무엇일까요? 저를 포함한 많은 분들이 개발자, 소프트웨어 엔지니어가 되기 위해 정글에 왔다고 생각합니다. 그렇다면 소프트웨어 엔지니어란 어떤 사람일까요? "소프트웨어를 바탕으로 문제를 해결하는 사람"이 아닐까 합니다. 나만의 무기를 갖기는 정글의 마지막 과정입니다. 이전까지의 과정을 통해 우리는 소프트웨어를 바탕으로 문제를 해결하기 위한 준비를 해왔습니다. 이제는 진짜 문제를 해결해봐야 하지 않을까 생각합니다. 같이 해결하고 싶은 문제는? 음식점을 가거나, 물건을 구매하거나, 강의를 수강하는 등 우리는 삶을 살면서 크고 작은 선택을 합니다. 그리고 종종 어떤 선택에 앞서 나보다 먼저 그 선택을 했던 사람들의 경험을 궁금해합니다. 지금 이 글을 읽고 있는 분들 중에서도 정글에 들어..
Implement Supplemental Page Table Pintos에서 제공하는 supplemental page table은 프로세스 별로 생성되는 별도의 구조체이다. 이는 페이지 테이블(pml4)이 담지 못하는 정보들을 추가로 저장하기 위해 사용된다. 기존 페이지 테이블은 물리 메모리 매핑 정보를 제공한다. 그런데 하나의 물리 메모리에 여러 가상 주소가 매핑되는 경우가 있을 수 있다. 해당 경우, 물리 메모리의 값이 변화하였을 때 특정 가상 주소에 심각한 문제가 발생할 수 있다. spt에는 물리 메모리가 가지고 있어야 할 데이터가 무엇인지에 대한 정보가 담겨있어 이러한 문제를 해소한다. 또한, spt는 자원을 해제해야하는 경우, 무엇을 해제할지 결정하는 데에도 사용된다. supplemental p..
Page Structure an Operations struct page include/vm/vm.h에 정의되어 있는 page 구조체는 가상 메모리의 페이지를 나타내는 자료구조이다. 해당 자료구조에는 page에 관하여 알아야 할 모든 정보들이 담겨 있다. 현재 page 구조체는 아래와 같다. struct page { const struct page_operations *operations; void *va; /* Address in terms of user space */ struct frame *frame; /* Back reference for frame */ union { struct uninit_page uninit; struct anon_page anon; struct file_page file..

앞선 프로젝트 수행을 통해 현재 Pintos는 동기화를 이용한 여러 스레드의 실행, 다양한 사용자 프로그램의 로드 등을 할 수 있게 되었다. 그러나 여전히 실행할 수 있는 프로그램의 수와 크기는 메인 메모리 크기에 의해 제한된 상태이다. 이번 프로젝트는 이러한 제한을 극복하는 과정이 될 것이다. Source Files 이번 프로젝트는 vm 디렉터리에서 작업이 이루어질 것이다. 많은 양의 템플릿 코드들이 제공되는데, 지정된 템플릿을 따라야 한다. 주어진 템플릿을 기반으로 하지 않은 코드는 정상적으로 실행되지 않을 수 있다. "DO NOT CHANGE"라고 표시된 템플릿은 절대 변경하지 말아야 한다. 아래는 수정해야 할 템플릿 파일에 관한 세부 정보들이다. 더보기 include/vm/vm.h vm/vm.c ..

이번 프로젝트를 통해 주요하게 학습한 내용은 시스템 콜(System Call)과 관련한 것이었다. 시스템 콜이란 프로세스가 운영체제(커널)에게 어떤 기능(서비스)을 사용하게 해달라고 요청하는 것을 의미한다. 시스템 콜을 이해하기 위해서는 모드 비트(Mode Bit)라는 하드웨어를 알고 있어야 한다. 모드 비트는 사용자 모드(User Mode)와 커널 모드(Kernel Mode), 두 가지 실행 모드를 제공하는 하드웨어이다. 사용자 모드에서 실행되는 프로세스는 할 수 있는 일이 제한된다. 반면, 커널 모드에서는 모든 특수한 명령어를 포함하여 사용자 모드에서 할 수 없었던 작업을 수행할 수 있다. 예를 들어, 파일을 읽고 쓰는 것과 같은 수행은프로세스가사용자 모드에서 자유롭게 진행할 수 없다. 하지만 사..
지난 포스트에서는 파일과 관련한 시스템 콜을 구현해보았다. 이번에는 프로세스와 관련한 아래 네 가지 시스템 콜들을 구현해보고자 한다. /* include/lib/user/syscall.h */ /* Projects 2 and later. */ // 중략 void exit (int status) NO_RETURN; pid_t fork (const char *thread_name); int exec (const char *file); int wait (pid_t); // 중략 /* include/lib/syscall-nr.h */ enum { /* Projects 2 and later. */ // 중략 SYS_EXIT, /* Terminate this process. */ SYS_FORK, /* Clone ..