첫 번째 프로젝트 까지는 모든 작업을 커널 위에서 진행했지만, 이제부턴 유저 레벨에서의 동작을 처리한다. 본격적으로 'OS스러운 기능' 을 구현해보는 시간! 첫 과제는 파일 실행을 위한 작업을 직접 구현해보는 Argument Passing
이다. 기존의 PintOS
는 커맨드 라인 한 줄 전체를 입력으로 받아 아무것도 하지 않는 무식이 깡통과도 같은 녀석인데, 이 녀석을 똑똑하게 만들어서 파일 실행 명령을 처리할 수 있도록 해야 한다. 결론부터 말하자면, 첫 과제부터 상당히 어려웠다. 어줍잖은 C언어 실력과 OS에 대한 이해가 없다면 절대! 절대! 완수할 수 없을, 그런 과제였다.
이번 과제의 첫인상은 솔직히 '별거 아닌데?' 였다. 그냥 받은 문자열 나눠서 스택에 착착착. 끝 아니야? 라고 생각했었는데.. 차차 생각보다 다방면으로 깊은 이해를 필요로 한다는 것을 알게 되었다. 사실 그냥 문자열 나누는 거 부터 벽이었다. 그냥 원래 하던대로 배열 만들고, malloc
으로 동적 메모리 할당 해야지~ 했는데! 아니나 다를까,
Pintos can run normal C programs, as long as they fit into memory and use only the system calls you implement. Notably, malloc() cannot be implemented because none of the system calls required for this project allow for memory allocation.
이후에도 다양한 문제에 부딪혔었지만, 여기서부터 대략 정신이 멍해졌다. 일단 제목과 인자를 받을 argv[]
를 길이 64로 초기화하고 코드를 짜는 걸로 방향을 잡았다. 따로 파싱된 문자열들을 보관하지 않고 바로 처리하는 것도 생각은 해봤는데, 일반적으론 제목과 인자를 60개 가까이 받아올 일도 없을 것이라 생각했고, 무엇보다 어려울 거 같아서.. ㅋㅋㅋㅋㅋ
PintOS
를 열심히 진행하다 보면 꾸준히 드는 생각이 하나 있다. '내가 앞으로도 이렇게 깊이있는 경험을 할 일이 있을까?' 였는데, PintOS
가 얼마나 로우 레벨을 다루는지 알 수 있는 단편적인 예라고 생각한다. 특히나 이번 과제는 묘한 감정을 느끼게 했는데, 지금까지 내가 편하게 코딩하던 곳 아래 기저에는 이렇게나 복잡한 개념이 추상화되어 있구나~ 를 피부로 느낄 수 있었다. 아마 코딩을 하다보면 무조건 한번은 해봤을 동작인 함수에 인자 전달하기 를 내가 구현했던 거니까. 이 자리를 빌어 항상 전 세계의 개발자들을 도와주는 훌륭한 프로그래밍 언어와 OS들에게 감사인사를 전해본다..
내가 좋아하는 게임에서 유명한 해설자의 대사가 있다. 바로 "모르나요? 모르면 맞아야죠!" 인데, SW개발자와 참 잘 어울리는 대사라고 생각한다. 그리고 난 오늘도 어김없이 몰라서 뚜드러 맞았다 😂 입력받은 커맨드 라인을 파싱하는 것은 크게 어렵지 않다. 하지만 그 다음 과정인 유저 스택에 데이터들을 적재해주는 과정이 상당히 난해한데, OS
전반에 대한 지식과 C
에 대한 이해를 꽤나 요한다. 당연하게도 둘 다 부족한 나는 맞는 수밖에.. 이런 간단한 기능을 구현 하는 데에도 팀원들과 이틀밤을 꼬박 새야 했다. 이번 프로젝트 2는 앞으로 해야 할 작업이 산더미인데.. 흑흑
PintOS
프로젝트를 진행하면, 다양한 레퍼런스를 참조하게 된다. 모든 자료들을 고루 참조하긴 했지만, 개중에서 지금까지 가장 도움이 됐던 친구는 바로 KAIST가 아닌 타 대학에서의 PintOS
강의 자료였다. 전체적인 가이드라인을 잘 제시해주었기에 저번 과제까지 큰 도움을 받았었는데, 오히려 이번 과제에서는 쓰디쓴 독으로 작용했다. 자료가 틀린 정보를 제공한 것은 아니고, 우리가 과제를 진행하는 시점과는 PintOS
가 32비트 운영체제에서 64비트로 바뀌었고, 여러 함수들이 바뀌었기 때문이다. 마치 원숭이(?)와 같이 슬라이드 자료만을 따라온 우리는 당연하게도 슬라이드 내용을 깊게 공부했고, 당연하게도 우리가 공부했던 정보는 대부분 우리에겐 쓸모없는 정보였다. 슬프지만 어쩌겠어? 꽤나 큰 것을 배웠다. 내가 공학계의 천재가 아닌 이상, 아마 내가 걷는 SW개발자의 길은 아마 남의 발자취를 따라가는 것의 연속일 것이다. 이렇게 나에게 필요한 정보를 걸러내서 공부하는 능력을 기르지 못한다면, 이번처럼 시간을 날릴 수 있겠다는 생각이 들었다. 정보에 대해 검증한 후 이용하는 습관을 기른다면 좋을 듯!
신나게 코드를 짜는 일은 매우 즐거운 일이다. 다만 즐거운 코딩에 쉽게 묻히곤 하는 것이 바로 디버깅 능력이 아닐까 싶다. 결국 우리는 많은 시간을 코드를 짜기보단 디버깅하며 보내게 되는데, 이번 과제에선 정말 코드를 짠 시간은 1시간도 안 걸린 것 같고, 디버깅 하는데에만 거의 10시간을 넘게 투자한 것 같다. 이렇게까지 크게 데이다 보니, '디버깅 능력을 키우는 것도 매우 중요하겠구나!' 란 생각이 안 들 수가 없었다! 다양한 디버깅 방식을 자유자재로 다루는 것도 중요하겠지만, 디버깅이 쉬운 코드를 작성하는 것 과 버그를 빠르게 이해하고, 잡아내는 능력이 매우 중요한 것 같다. 항상 리마인드 해야지.