사실, 내가 c언어 및 어셈블리어와 같은 로우레벨에 관심을 가지게 된 계기가 있다. 단순히 처음 접했던 언어가 c언어였기 때문만은 아니다. 시작은 언제나 사소한 이유에서 비롯되듯, 나 역시 그랬다.
어릴 적 녹스(NOX)라는 고전 게임의 멀티플레이를 즐기던 중, 게임을 해킹해 공정하지 않은 플레이를 하는 사람들을 만난 적이 있다. 예를 들어, 맵핵을 사용하거나 상대방 이름으로 채팅을 치는 비정상적인 행동은 물론, 심지어 방장의 권한을 행사하는 등의 행위였다. 이런 경험은 나에게 처음이었고 컬쳐쇼크를 받았다. 세상에 이런 것이 가능하다는 것을 받아들이지 못했고, 마치 마법처럼 느껴지기만 했다. 그리고 반대로 나에게 있어서 강력한 동기부여를 주는 인생의 터닝 포인트이기도 했다.
이런 경험에도 불구하고, 나는 화가 나기보다는 오히려 호기심이 더욱 커졌고 나도 저렇게 되고싶다고 생각했다. 수 많은 노력 끝에 결국 몇 가지 간단한 트릭을 전수받을 수 있었다.
당시 사용한 툴은 tsearch라는 프로그램으로, 메모리 에디팅 기능이 주요한 기능이다. 현재 실행 중인 프로세스를 열고 특정 조건을 설정해, 그 조건을 만족하는 메모리 주소를 찾는 방식이다. 그리고 그 주소에 해당하는 값을 변경하거나 고정시키는 방식으로 해킹이 가능하다.
이러한 경험을 통해 단순히 게임을 해킹하는 것을 넘어서, 컴퓨터 시스템 자체에 대한 깊은 관심이 생겼다. 메모리 구조, cpu의 레지스터 및 데이터 처리, 운영체제의 메모리 관리 등 로우레벨 관련이 그렇다.
이러한 관심은 현재 카이스트 정글에서의 CS 그리고 pintos 프로젝트에서 내가 일부분 기대했던 것들이기도 하다. 그리고 다른 의미로 기대했던 것 이상이었다. 처음 생각했던 것 보다 훨씬 깊이있고 방대했다. c언어는 기본이고, 어셈블리어, x86-64 아키텍처 호출 규약, 레지스터 컨벤션, OS, 그리고 gdb 사용법까지 필수적으로 익혀야 했다. 추가적으로 디버깅 센스는 말할 것도 없다.
그중에서도 가장 어려웠던 점은 제한된 시간이었다. pintos project 1, 2, 3 모두 4주 내에 구현해야 한다는 압박이 컸다. 매 프로젝트를 시작할 때마다 첫 단추를 끼우는 데 시간이 많이 걸렸다. 기존 코드를 분석하고, 문제점을 파악한 뒤, 이를 어떻게 해결할지를 고민해야 했다. 더불어, pintos는 각 프로젝트가 누적되는 방식이라, 이전 프로젝트에서 작성한 코드가 현재 프로젝트에 영향을 미치는 경우도 많았고, 이러한 문제를 발견하는 데에도 시간이 꽤 걸렸다. pintos 공식 메뉴얼이 있긴 하지만, 부족하게 느껴지는 부분이 많아 결국 gdb를 사용해 코드 레벨에서 하나하나 분석해야 했고, 그 과정에서 시간이 항상 부족했다.
완벽하진 않지만, 어느 정도 스스로 만족할 만한 결과는 냈다고 생각한다. 특히, 내가 처음에 관심을 가졌던 로우레벨, 프로세스, 메모리와 같은 것들 대해서다. 그리고 또 나에게 부족한 것 또한 알게 되었다. cpu 레지스터, 어셈블리어 그리고 메모리 간의 데이터 전달 같은 부분들이 그것이다. 평소 c언어는 어느 정도 할 줄 안다고 자부하고 있었지만, 이런 저수준 개념들과 연계하여 작동하는 방식에는 익숙하지 않았다. 이런 이유들 때문에 gdb를 사용하는 데에도 효율적으로 접근하지 못했던 것 같다.
stack growth 를 구현하는 과정에서 gdb 를 사용해 하루 종일 매달렸던 기억이 난다. 정확히 페이지 폴트가 발생하는 시점, 그리고 메모리 접근 지점을 살펴보다가 소스코드의 틀린 부분을 새로 찾아내기도 했다. 또한, 알 수 없었던 영역의 스택 프레임 부분을 이해하게 되었다. 결과적으로 해피엔딩이었다.
이렇게 정글에서의 pintos 과정은 끝났다. 처음 내가 기대했던 부분들은 모두 충족되었다. 하지만, 하다 보니 욕심이 생기기 마련이고, 제한된 시간 탓에 완벽하게 끝내지 못한 부분은 아쉬움이 남는다. 특히, project4: file system 은 정글 과정에서 다루지 않아 가장 아쉬운 부분이다. 내가 정글에 들어온 가장 큰 이유가 pintos 과정이었던 만큼, 아직 마무리하지 못한 부분에 대해서는 꼭 마무리 하고 말 것이다.
'카이스트 정글' 카테고리의 다른 글
xy problem (0) | 2024.12.05 |
---|---|
정글의 팀 결성 방법 (0) | 2024.11.08 |
pintos project2: user programs (0) | 2024.10.09 |
pintos project1: threads (0) | 2024.10.01 |
Proxy Lab 그리고 ECF (0) | 2024.09.25 |