in Pint OS 기존의 Pint OS는 Eager loading(Immediate loading) 방식이다. Eager loading은 데이터나 자원을 가능한 빠른 시점에서 로드하는 방식을 의미한다. 즉, 필요한 자원을 처음으로 요청하기 전에 미리 load하여 사용 가능한 상태로 준비하는 것의 의미한다. Pint OS의 Project 3 - Anonymous Page 파트에서는 이 Eager loading 방식을 Lazy loading 방식으로 바꿔주어야 한다. 따라서 Lazy loading 방식에 대해 공부하고 정리해보았다. Lazy loading의 구현은 userprog/process.c 에서 이루어진다. Lazy loading 지연 로딩. 프로그램이 필요한 데이터나 자원을 처음으로 요청할 때까지..
프로그램 실행 로직 initd() supplemental_page_table_init() process_exec() load() load_segment(): 파일 바이트를 페이지 단위로 나누고, 페이지마다 파일의 어느 영역을 읽어야 할지 설정 vm_alloc_page_with_inirializer(upage, lazy_load_segment): page 구조체 생성 및 할당(malloc), page 구조체와 유저 가상 주소(upage)를 매핑, page fault가 발생하면, lazy_load_segment()를 호출하도록 설정. uninit_new (new_page, upage, lazy_load_segment) spt_insert_page(): 보조 페이지 테이블 생성 및 page 데이터 입력 set..
x86-64 기반 Pint OS 프로젝트 2의 System Calls를 구현하기 위해 공부한 개념을 정리한다. 파일 시스템 콜 파일 조작을 위한 인터페이스를 제공한다. Pint OS - Project 2(System Calls)에서 구현해야 할 파일 관련 시스템 콜은 다음과 같다. read 정의 int filesize (int fd, void *buffer, unsigned size); 열린 파일 'fd'에서 'size' 만큼의 바이트를 읽고 'buffer'에 저장한다. 실제로 읽은 바이트 크기를 반환하고, 실패했다면 -1을 반환한다. fd가 표준 입력(0)일 때는 input_getc() 함수를 사용해서 키보드 입력을 받는다. 락 include/userprog/..
발생 프로젝트 2를 구현한 후 multi-oom을 제외한 모든 테스트 케이스에서 pass했다. 여기서 특이한 것은 pass 여부가 가상 환경 사양에 따라 갈린다는 점이었다. 도커로 로컬 노트북으로 돌린 나의 경우에는 multi-oom을 통과하지만, git clone으로 받아서 AWS에서 돌린 동료들은 전부 FAIL이 뜬다. 여기서 또 신기한 점은 AWS의 t2.large 서버에서 테스트해본 동료는 또 pass했다 ㅋㅋ. 아무래도 가상 환경의 메모리 용량에 따라 multi-oom이 터지는 걸로 추정된다. 다른 동료의 코드와 한참을 비교해보다가 동료가 해결해주었다. 솔루션 tid_t process_fork (const char *name, struce intr_frame *if_) { ... if (chil..
x86-64 기반 Pint OS 프로젝트 2의 System Calls를 구현하기 위해 공부한 개념을 정리한다. 파일 시스템 콜 파일 조작을 위한 인터페이스를 제공한다. Pint OS - Project 2(System Calls)에서 구현해야 할 파일 관련 시스템 콜은 다음과 같다. create 정의 bool create (const char *file, unsigned initial_size); 'create' 시스템 콜은 'file'이라는 이름으로 초기 크기가 'initial_size'인 새로운 파일을 생성한다. 즉, 파일 시스템에 새로운 파일을 만들고 초기 크기에 해당하는 공간을 할당한다. 이 과정에서 파일이 열리는 것(open)은 아니다. 파일을 열기(open) 위해서는 별도의 'open' 시스템 ..