2023. 5. 9. 03:34ㆍComputer Science
Pintos Project 2 관련 포스팅 목록
- Argument Passing (User 프로그램 인자 설정하기)
- System Calls - 1 (System Calls이 호출되는 과정)
- System Calls - 2 (exec, wait, fork) & Deny Write on Executables
- System Calls - 3 (File System) & User Memory
Pintos 프로젝트 2 과제로 시스템콜을 구현했다.
1.5주동안 열씸히 구현한💦
유저 프로그램을 실행시키고 시스템콜을 호출하는 그 과정이
어떻게 이루어지는지 알아보자!
system call을 호출하는 open-normal
테스트 파일이 실행되는 데까지 어떤 과정을 거치게 될까??
open-normal 👇🏻
System call이 호출되는 과정
우선 user program으로서 실행되는 테스트 파일 open-normal이 실행되는 과정부터 알아보자!
1. Pintos 실행
우선 pintos가 실행되면 threads/init.c의 main이 실행된다.
아래로 쭉 내려보면 run_actions가 호출된다.
2. 테스트 파일 실행
run_actions에서는 run_task가 호출되고,
run_task의 USERPROG 부분에서
process_wait(process_create_initd(task)가 호출되면서
테스트 파일인 open-normal 프로세스가 생성되어 테스트 파일이 실행할 준비가 된다.
이제 open-normal이 실행되게 되고, 이 안에서 불리는 시스템 콜의 호출 흐름을 따라가보자.
3. open 호출
테스트 파일의 test_main 함수 안에서 open 함수를 호출하고 있는 것을 볼 수 있다.
이 open을 호출한 것은 user program이기 때문에 바로 우리가 구현한 userprog/syscall.c의 open이 불리는 것이 아니고,
lib/user/syscall.c의 open이 불리게 된다.
그 안에서는 syscall1 함수를 리턴하고 있는데,
syscall 뒤의 숫자는 인자의 갯수를 의미한다.
즉, 인자가 하나인 syscall을 의미하는 syscall1이 호출된다.
syscall1에서는 syscall이 호출되고 함수명에 맞게 인자가 전달된다.
syscall에 전달하는 인자를 보면
첫번째 인자는 시스템콜 넘버, 두번째 인자가 open에서 전달된 인자, 나머지는 0으로 채워져있다.
syscall에서는 레지스터에 인자를 담고나서 syscall을 호출하는 어셈블리어를 볼 수 있다.
이 syscall을 통해서 제어가 커널로 넘어가게 되고
드디어 userprog/syscall.c에 구현한 syscall_handler가 불리게 된다.
syscall_handler에서는 switch문을 통해 호출해야하는 시스템 콜 넘버에 해당하는 코드가 실행된다.
(여기서는 open)
여기서 불리는 open이 이번 과제에서 구현한 open 함수가 된다.
그리고 여기서 반환한 fd가 지금까지 거쳐 온 함수들에 반환된다.
이 fd가 최종적으로 테스트 파일인 open-normal에서 호출된 open에 반환되고, handle에 담기게 된다.