지연 로딩은 메모리 로딩을 필요한 시점까지 미루는 설계 방식이다. 페이지 구조체는 할당되어 페이지에 해당하지만, 전용 물리 프레임은 없고 페이지의 실제 내용은 아직 로드되지 않는다. 내용은 실제로 필요한 시점에만 로드되며, 페이지 폴트에 의해 로드된다.페이지 타입이 세 가지이므로 초기화 루틴은 각 페이지마다 다르다. 커널이 페이지 할당 요청을 받으면 vm_alloc_page_with_initializer를 호출한다. vm_alloc_page_with_initializer함수는 페이지 구조체를 할당하고 페이지 타입에 따라 적절한 초기화 함수를 설정하여 초기화한 후 supple_ment_page_table에 삽입한다. 프로세스는 실제 메모리에 로드가 되지 않은 가상주소로 접근을 한다. 이때 페이지에 내용이 ..
frame_table프레임 테이블을 만들어야하는 이유는 뭘까? 우리는 페이지 폴트시 프레임을 할당하고 페이지와 매핑해야한다. 이때 그것을 관리하는 페이지가 필요하게된다. 그렇담 이것을 언제 활용하게 될까?프레임 테이블은 현재 물리메모리에 올릴수 있는 프레임이 꽉차 더이상 물리메모리에 올릴수 없을때 어느 프레임을 swap out을 할지 정할때 사용하게 된다. 이때 프레임 테이블을 참조해 교체 알고리즘에 때라 swap out할 프레임을 정하게 된다.struct framevm헤더 파일에 frame_table을 정의한다. list로 frame_table을 만든 이유는 clock 교체 알고리즘을 사용하기 위해서다.그리고 frame 구조체에 프레임 테이블에 삽입할 list_elem을 정의한다.vm/vm.hstruc..
Supplement Page Table보충 페이지 테이블은 각 페이지에 대한 추가 데이터를 가지고 있어 페이지테이블을 보완한다. 보충 페이지 테이블이 필요한 이유는 크게 두가지다페이지 폴트 발생 시, 커널이 보충 페이지 테이블을 참고해 프레임과 매핑이 안되었는지 안되었을때 프레임에 할당해야할 데이터는 어떤 데이터인지를 확인한다.커널은 프로세스가 종료될 때 메모리 누수를 막기위해 해제해야할 페이지를 보충 페이지 테이블을 참조해 결정한다. 페이지 폴트 처리페이지 폴트 발생시 커널은 anonymous page인지 file-backed페이지인지 확인한다. 파일 또는 스왑 슬롯에서 페이지를 가져와야 한다면. userprog/exception.c의 페이지 폴트 핸들러 page_fault()는 vm/vm.c의 페이지..
Virtual Memory가상메모리는 DRAM의 추상화다. 이게 무슨 말일까? CPU가 데이터를 읽고 쓰려면 물리메모리 즉, DRAM에 적재되어야 사용할 수 있다. 이때 우리는 이런 경우를 신경쓸 필요가 있나?파일을 로드하거나 동적으로 메모리를 할당할때 물리메모리의 어느곳에 적재되어야하는지물리메모리의 크기보다 데이터의 크기가 클때 어떻게 해야하는지현재 실행중인 프로세스가 다른 프로세스가 사용중인 메모리 영역을 침범하지는 않는지 우리는 이런 경우를 신경 쓰지 않고 정적 파일을 물리메모리에 로드하거다 동적으로 메모리를 할당 받는다. 이런 궂은 일은 운영체제가 하고 우리에게는 API를 제공해주는 거다. 우리는 DRAM을 추상화한 가상메모리를 사용하는거다.처음 운영체제를 설계할때 디자인 컨셉중에 하나는 하나의 ..
Project2-0 BackgroundProject2-1 Passing the argumentsProject2-2 User Memory Access개요시스템 콜은 소프트웨어 예외의 한 종류로 간주된다. 유저 프로그램은 시스템 콜을 통해 운영 체제에 서비스를 요청할 수 있다. x86-64 아키텍처에서는 syscall 명령어를 사용하여 시스템 콜을 호출핰다. 이는 기존의 x86 아키텍처에서 시스템 콜이 다른 소프트웨어 예외와 동일한 방식으로 처리되던 것과 대조적이다. 시스템 콜을 호출할 때는 시스템 콜 번호와 인수를 레지스터에 설정해야 한다. 시스템 콜 번호는 %rax 레지스터에 저장되며, 인수는 %rdi, %rsi, %rdx, %r10, %r8, %r9 순서로 전달된다. 이는 네 번째 인수는 %rcx로 전..
Git book User memory 번역User memory access시스템 콜의 일부로서, 커널은 종종 사용자 프로그램이 제공한 포인터를 통해 메모리에 접근해야 합니다. 커널은 이를 매우 신중하게 처리해야 합니다. 사용자가 null 포인터, 매핑되지 않은 가상 메모리를 가리키는 포인터, 또는 커널 가상 주소 공간(KERN_BASE 이상)을 가리키는 포인터를 전달할 수 있기 때문입니다. 이러한 모든 유형의 잘못된 포인터는 문제를 일으킨 프로세스를 종료하고 해당 리소스를 해제하여, 커널이나 다른 실행 중인 프로세스에 피해를 주지 않고 거부되어야 합니다.유저모드 프로그램이 유저 메모리에서 접근하지못하는 주소로 커널을 통해 접근하려고할 수가 있다. 커널은 자기 자신을 보호하기 위한 수단으로 시스템 콜을 활..
목표PinOS에서 인자를 전달하고 쓰레드를 생성하는 매커니즘을 구현해야한다. 현재 핀토스는 명령줄을 토큰화하는 매커니즘이 존재하지 않아 명령줄 전체를 전달한다.명령어 "echo x y z"를 실행현재 PintOS쓰레드의 이름이 "echo x y z"이다.파일이름이 "echo x y z"이름을 가진 프로그램을 찾는다.명령줄 "echo", "x", "y", "z" 인수를 전달하지 못한다.수정한 PintOS쓰레드 이름이 "ehco"이다.파일이름이 "echo"이름을 가진 프로그램을 찾는다.유저스택에 인주들을 푸시한다.스레드 이름과, file_name을 식별하고 인수들을 user stack에 push한다.수정해아할 함수pintos-kaist/userprog/process.*process_create_initdpr..
목표유저모드에서 프로그램을 실행한다. 초기 PintOS는 유저 프로그램을 실행할 수 없다PintOS 프로세스 실행과정1. OS는 프로세스를 실행하기위해 인수를 받는다.2. 인수를 받은다음 process_create_initd함수를 호출한다.3. process_wait는 아무 작업을 하지않고 반환하고 있다.PintOS 구현사항init 프로세스의 id는 0이고 모든 프로세스의 부모프로세스가 된다.현재 핀토스는 프로세스를 생성하고 스케쥴링한뒤 그냥 종료하고 있다.init 프로세스 즉 운영체제가 종료하면 생성된 프로세스를 실행 시킬 수 없다process_wait함수는 자식이 생성되고 완료될때까지 기다려야한다.process_create_initdprocess_create_initd함수는 file_name을 인자..