
pintos -v -k -T 60 -m 20 --fs-disk=10 \\ \-p tests/userprog/args-multiple:args-multiple \\ \-- -q -f run 'args-multiple a b c d e f g''pintos --gdb

THREAD_RUNNING 현재 CPU에서 실행 중THREAD_READY 실행 대기 중이며 ready_list에 있음THREAD_BLOCKED 이벤트를 기다리며 대기 중THREAD_DYING 종료 예정이며 제거 대기 중Create thread → READY스케줄러에 의

핀토스는 FIFO scheduling 사용핀토스 스케줄링을 우선순위 스케줄링으로 바꾸자 ready list를 스레드 우선 순위에 따라 정렬wait list를 정렬사용하는 동기화 기법들(락, 세마포어, 조건 변수)을 우선순위 기반으로 동작하도록 -> 우선순위가 높은 스래
⸻⸻✅ Ready List 우선순위 정렬• thread_unblock():• list_push_back() → list_insert_ordered(&ready_list, &t->elem, cmp_priority, NULL) 변경• thread_yield():• 현재 스
링크텍스트(User mode vs Kernel mode)가상 메모리 주소로 구분됨.• 일반적으로 커널은 상위 가상 주소 영역 (예: 0xC0000000~), 유저 프로그램은 하위 가상 주소 영역 (예: 0x08048000~) 사용.• CPU의 권한 레벨(Ring 0 v
받은 문자열을 parsing 후 argv, argc에 저장 stack에 인자넣기

run 'args_single onearg' 현재 코드는 run, args_single onearg 이렇게 밖에 파싱을 못한다 args_single onearg 우리는 이걸 파싱해야한다 process_exec() 에서 유저프로그램(ELF 실행파일)을 메모리에 적재할때

사용자 스택에 argv가 배치되는 순서 (x86-64 기준) ⸻ argc = 3 argv = {"./program", "arg1", "arg2", NULL} ⸻ 스택에 저장되는 내용 (높은 주소 → 낮은 주소) ⸻ 레지스터 설정 • %rdi = argc • %
⸻⸻• 유저 모드 → 커널 모드 전환 시, CPU 레지스터 상태를 저장하는 구조체• struct intr_frame 형태로 저장됨 (Pintos 등 OS에서 사용)• 저장되는 대표적인 레지스터:%rip: 명령어 포인터 (어디서 실행 중이었는지)%rsp: 스택 포인터%r
목표: 프로그램이 시스템콜을 통해 OS와 상호작용할 수 있도록 만들기 지금까지 실행한 코드는 OS커널의 한 부분이었다 이번 프로젝트는 OS위에서 작동하는 유저 프로그램을 실행하는 상황을 다룬다 한번에 하나이상의 프로그램이 실행될 수 있도록 한다 각각의 프로세스는 하

시스템 콜 구현을 위해 유저 가상 주소 공간에 데이터를 읽고 쓰기 위한 방법 시스템콜의 인자로 들어온 포인터로부터 데이터를 읽어야할 때라면 이 방법을 통해 해야한다 유저가 유효하지 않은 포인터라면?/ .. -> user memory가 맞는지 확인한다 이미 구현되

exec exec 함수 호출과정 Pintos에서 사용자 프로그램을 실행하기 위해 새로운 자식 프로세스를 생성하고, cmd_line에 해당하는 프로그램을 그 자식 프로세스에서 실행하는 역할 fork 
가상메모리 페이지 - page물리 메모리 페이지 -framesupplemental page table -> physical memory page frameunion: 여러 개의 타입 중 하나만 사용하는 자료구조모든 멤버는 같은 메모리 공간을 공유하며 동시에 여러 멤버를

익명 페이지(Anonymous Page): 파일과 연결되지 않은 페이지주로 스택과 힙에서 사용디스크에 백업되는 파일 없음파일 기반 페이지: 실행파일과 같은 디스크 파일에 기반한 페이지예: 코드, 데이터 세그먼트초기화 →(페이지 폴트 발생 시) →지연 로딩 (lazy l
스택이 현재크기를 초과하면 필요에 따라 추가 페이지 할당스택에 접근할 때만 할당스택에 접근하는 경우와 아닌 경우를 알아서 구별스택은 스택 포인터 아래 스택에 쓸 경우 버그 발생(스택은 높은 주소에서 낮은 주소로 쌓임)유저프로그램의 스택 포인터 현재값을 얻어야함시스템콜
Memory-mapped page: 파일 기반 페이지특정 파일의 일부 내용을 프로세스의 가상 주소 공간에 매핑한다.page fault가 발생하면: \- 물리 메모리 프레임을 할당하고, \- 파일 내용을 메모리로 lazy load한다.페이지가 unmap되거나 swap
메모리 스와핑은 물리 메모리의 활용을 극대화하기 위한 메모리 회수 기법이다.메인 메모리의 프레임이 모두 할당된 상태에서 새로운 메모리 할당 요청이 들어오면, 운영체제는 사용되지 않는 페이지를 디스크로 스왑 아웃하여 공간을 확보한다.나중에 그 페이지가 필요해지면 디스크에
................ bool check_address(const void *addr) { if (addr == NULL || !isuservaddr(addr)) return false; #ifdef VM struct thread *t = thr