19년 봄 OS수업을 들으며 진행한 Project Pintos에 대 고민했던, 힘들었던 정보들을 적어 나눠보려합니다.
Project 1을 시작하기 전에 보면 좋았던 사실들입니다.
1. 에디터
본래 다른 에디터보다 terminal에서 작업하는게 편해서 ctag를 설치하고 "ctrl+]" 로 코딩했지만 window에서도 VScode로 외부서버와 연결이 가능하다는 것을 알게 되었습니다! ssh로 연결 후(많은 Extension이 있다) Ip, Name, Passward를 수정하는 config 파일을 손 본 후 Extension에 맞는 명령어로 연결하면 외부 서버와 연동이 가능하며 찾기, 수정 등의 기능이 기존 terminal보다 훨 수훨합니다.
2. 개별 실행
Project1에서 설명해보면 src/threads 에서 make 한 후 생성되는 build 폴더에서 make check을 실행하면 각종 실행 문구와 함께 test case가 실행됩니다. 여기서 pintos -v -k -T ~~~~~ args-none < /dev/null 2 > 의 pintos 부터 args-none까지 복사하여 VScode Terminal에서 실행하면 개별실행이 가능합니다. (필자는 Project2부터 개별실행을 알아 1의 경우 하나 체크하고 make check를 반복했다.)
3. GDB
VScode에서 2개의 terminal을 켜줍니다. (각각 Ter1과 Ter2라고 하겠습니다.) 두 terminal 모두 build폴더에서 진행합니다. Ter1에서 2.에서 말한 개별 실행 문구에 pintos --gdb -v -k 로 --gdb라는 걸 넣어준 후 실행합니다. (mac의 경우 --가 안 듣는 경우가 있다고 하네요..) 이후 Ter2에서 pintos-gdb kernel.o 라고 칩니다. 그렇게 되면 Ter2에서 (gdb) $ 로 들어간 것을 볼 수 있습니다. 여기서 Ter1과 연동을 해주기 위해 target remote localhost:1234 를 지정해줍니다. (port 를 변경하지 않아도 되지만 하고싶다면 Utils/pintos line 566, 과 Misc/gdb-macros line 163 을 변경하면 됩니다.) 이후 Ter2에서 break point 를 잡으면서 계속 진행하시면 Ter1에 결과가 나오면서 진행됩니다.
정리하자면
(0). Ter1, Ter2 모두 build 폴더
(1). Ter1 에서 pintos --gdb -v -k -T ~~ 로 gdb 옵션을 킨 명령어를 개별 실행
(2). Ter2 에서 pintos-gdb kernel.o 로 gdb 접속
(3). Ter2 에서 target remote localhost:1234 로 Ter1과 연결
(4). Ter2 에서 진행
4. Struct list
Pintos 에는 list, hash, bitmap 등 다양한 Data Structure 를 제공합니다. 하다보면 list를 다루고 싶은 경우가 매우 많은데, list.h를 include하면 strcut list 를 사용할 수 있습니다. 흔히 thread를 담고있는 list를 만들고 싶다하면, thread.h 의 struct thread에 "struct list_entry e1" 를 추가해줍니다. 이후 그 thread를 담을 list를 만들어줍니다. 쉽게 sleep_list 라고 하면struct list sleep_list 를 만들어서 list_push_back(sleep_list, e1) 으로 e1 만을 연결해줍니다. list_entry 는 thread 전체가 아닌 list로 연결되는 일부만 있는 것입니다. 그렇기 때문에 우리는 list에서 특정 thread를 찾고 싶으면 그에 해당하는 list_entry 포인터 e1을 가져온 후, list_entry 라는 macro를 이용해 e1을 포함하는 thread 포인터를 가져올수있습니다.
밑의 그림을 보면 더 이해가 잘 될것입니다.

계속해서 Pintos 1부터 4까지 흐름을 올려보겠습니다.