(5/30)
토요일에 아빠 생신이셔서 상경한 김에, 지난 주말은 리프레싱 차원에서 푹 쉬고 돌아왔다. 알고리즘 스터디도 원격으로 참여하고, 자투리 시간에 틈틈이 PPT나 깃북을 읽으면서 PintOS 생각을 한 덕분인지 다시 정글모드로 몰입하기까지 이번에도 큰 어려움은 없었다.
오늘 살펴본 파일: process.c, syscall.c
오늘은, 본격적으로 시스템 콜에 들어가기 앞서서 구현해야 하는 argument passing을 구현해보았다. 나보다 하루 일찍 복귀한 팀원들이 선행학습(?) 차원에서 도전해보았는데, 어찌저찌 구현은 했는데 내용 이해가 어렵다고 해서 아예 처음부터 하나하나 같이 뜯어보았다.
위와 같이 깃북의 가이드에 따르면, 현재의 process_exec() 함수는 단순히 파일명 전체를 인자로 받아올 뿐이고, 새로운 프로세스에 arguments를 전달해주는 기능은 지원하지 않는 상태이다. 이런 기능이 가능하도록 하려면, 안에서 불러오는 load() 함수를 수정해주어야 했다. 참고로 load 함수는, 파일명이 file_name인 ELF 실행파일을 현재 실행 중인 쓰레드에 로드해주는 역할을 한다.
이 때, load 함수 내에서 argument passing 도 가능하도록 해주기 위해서 다음과 같은 내용을 추가해주었다. strtok_r의 경우, 첫번째 인자가 NULL인 경우엔 맨 마지막 인자에 있는 주소값을 start 지점으로 갖게 되며, 첫번째 인자가 NULL이 아니라면 거기를 start 지점으로 갖게 된다. 그리고 두 번째 인자인 delimters 내에 포함된 char 중 하나를 만나면, 거기를 기준으로 파싱해주게 된다. 지금은 delimeters에 빈칸(" ")만 해당하니까, arg_list[0]에는 file_name이 들어가고, 이후부터는 빈칸을 기준으로 arguments가 각각 하나씩 arg_list에 차례대로 들어가게 된다.
그리고 좀 전에 나눠준 arg_list를 전달해 stack으로 넣어주는 새로운 함수로서 argument_stack를 만들어주었다.
참고로 argument_stack 함수는 어떤 내용이 들어갈지 가능한 선에서 구현해본 다음, 웹에서 찾은 것과 /bin/ls -l foo bar 라는 커맨드에 대한 arguments를 파싱해줄지 깃북에서 제시한 방법을 토대로 개선해주었다.
위와 같이 argument passing을 위해 process_exec 함수, load 함수, 그리고 argument_stack 함수를 수정 및 추가해준 결과, argument passing이 정상적으로 수행되는 것을 다음과 같이 확인할 수 있었다. 깃북에서 준 힌트에 따라 process_wait 함수 내에 무한루프를 선언해주었기에, system call!이 출력된 후에는 무한루프가 돌며 멈추길래, 간단히 vscode 터미널 우측 상단의 휴지통을 눌러서 종료해주었다.
syscall.c 에서는, 주로 syscall_handler 함수에 들어가는 system call 함수들을 하나하나 구현해주면 되는 것을 확인했다.
오늘은 위와 같이 간단히 syscall_handler의 뼈대를 작성하고, halt, create, remove 정도만 구현해보고 마무리 지었다.
halt라는 단어가 익숙한듯 낯설어서 아예 사전을 찾아봤더니, (cause to) stop happening 으로 확 이해가 되었다. PintOS 자체를 멈추게 하는 함수구나! 깃북에 이미 있는 함수인 power_off를 활용하라고 해서, 구현은 어렵지 않았다. create와 remove는 그냥 이미 PintOS에서 제공해준 filesys.c 에 있는 함수를 활용해 역시나 간단히 작성해보았다.
오늘 구현한 3개는 사실상 이미 있는 함수를 system call 함수 내로 각각 불러온 것 뿐이라 구현이랄게 없었지만, fork 등의 다른 system call의 구현은 갈수록 이리저리 연결되는 함수도 많고해서 복잡할듯 하다. 그래도 오늘 셋이서 같이 argument passing 구현을 위한 거의 모든 함수를 파고 들어가 본 결과, 오늘까지 구현한 부분에 대해서는 어느정도 흐름이 잡힌듯한 느낌이다. 앞으로도 잘 해낼 수 있을 것 같다 🙏
깃북에선 userprog의 process.c와 syscall.c를 주로 수정하면 된다곤 하지만, 그 안에서 쓰이는 다른 디렉토리의 함수들이 많아서 두루두루 짚으며 가다보니 살펴볼 양이 생각보다는 상당히 많은 느낌이다.
팀원들과 내일 오전엔 꼭 fork를 집중해서 구현해보자고 했다. 2~3시간에 하나씩 성공해도, 하루에 3-4개는 구현하지 않을까? 너무 부담갖지 말고 우리 페이스대로 달려봤으면 좋겠다.
내일은 좀 더 맑은 정신으로 돌아와 빡세게 몰입하자. 화이팅 !