Project 2 USER PROGRAMS 프로젝트를 진행하며 알게된 pintos의 동작방식을 적어두는 글이다.
process_exec(void *f_name) 가 실행되면 f_name을 이름으로 가진 유저프로그램을 실행한다.
이 함수 내부에는 load() 함수가 있고 이 load() 함수가 하는 일은
- memory에 page table을 만든다.
- disk에서 file을 열고, ELF(실행파일의 포맷) header 을 읽어서 memory에 올린다.
- disk에서 file을 열고, data를 읽어서 memory data_segment에 올린다. text를 읽어서 memory text_segment에 올린다.
- user stack을 만들고 주어진 argument들을 stack에 넣는다.
그리고 설정한 intr_frame으로 context swithing을 하면 해당 유저 프로그램이 실행된다.
pintos에서 user 프로그램이 systemcall을 호출하면 어떤 동작을 하게 될까?
유저 프로그램이 시스템콜을 호출하면 lib/user/syscall.c 파일의 함수를 찾아가게 된다. 그리고 이런 syscall() 함수를 실행하고
이런 userprog/syscall-entry.S 파일을 실행하고
최종적으로 userprog/syscall.c 의 syscall_handler() 함수가 실행된다.
이때 syscall_handler() 함수의 인자로 들어오는 intr_frame *f 는 시스템콜을 호출한 유저프로그램의 intr_frame일까? 맞기도 하고 아니기도 하다.
userprog/syscall-entry.S 파일에서 user 프로그램의 user 가상주소공간의 stack rsp를 커널 가상주소공간의 stack rsp로 올리고 그 stack에 syscall을 호출했을 당시의 user 프로그램 intr_frame을 복사해서 쌓는다. 그리고 rsp의 값을 rdi로 복사해서 syscall_handler의 첫번째 인자인 f는 rdi에 담긴 주소를 가지게 되고 결국 f는 syscall을 호출했을 때의 user 프로그램의 intr_frame을 나타내고 있다.
'정글' 카테고리의 다른 글
정글 [week11] Pintos-KAIST Project 3 :: VIRTUAL MEMORY - 2 (1) | 2024.05.27 |
---|---|
정글 [week10] Pintos-KAIST Project 3 :: VIRTUAL MEMORY (0) | 2024.05.21 |
정글 [week07] Pintos-KAIST Project 1 :: Alarm Clock (0) | 2024.04.27 |
[정글 WEEK00] 개발일지 - 정글러 동선 (2) | 2024.03.17 |