이번주에도 과제의 구현에 집중하면서 필요한 깊이만큼 이론을 배워나가며 진행했다.
커맨드라인 파싱은 할만했다고 생각한다. 어디에서 무엇을 해야 할지를 제시해주었기 때문에, 이 기능이 왜 필요하고 어떤 방식으로 구현해야 하는지에 초점을 맞추면 결국 남는 것은 '잘 구현하는 것' 뿐이어서 시키는 대로 잘 구혔했다.
그런데 'Implement user memory access' 부터 무언가 잘못되었음을 느꼈다. 분명 VM은 프로젝트 3의 영역이라고 믿고 있었는데 이렇게 발을 걸치니 VM 관련 공부를 하고 와야하나, 아니면 그냥 함수 따라 올라가며 대강 어떻게 작동하는지말 알고 넘어가야 하나부터 고민이 많았다. 결국 이후 구현할 수많은 시스템콜의 구현량이 두려워 후자를 택하고, '커널 영역을 유저 영역 뒤(더 큰 주소값)에 두고, 침범할 가능성이 있는 모든 경우에 주소를 체크하여 침범시 exit한다'는 정도로 알고 넘어갔다. 이게 내가 VM에 관련해서 아는 것의 전부라고 생각한다. 프로젝트 3을 진행하는 미래의 내가 힘낼거라 믿자...
이번 프로젝트에서 가장 문제가 됐던 것은 내가 잘 하고 있는지 확인할 수단이 부족하다는 것이었다. 부분 구현만으로도 테스트를 돌리면 어디까진 잘 구현되었다는걸 알 수 있었던 프로젝트 1과는 달리, 이번에는 syscall write를 (부분적이라도) 구현하기 전까진 그럴 수가 없었다. 그래도 덕분에 그동안 미뤄왔던 gdb 디버거의 사용법을 드디어 배웠고 유용하게 썼다.
하지만 syscall 구현 단계에 들어가니 그마저도 여의치가 않았다. 버그 중에서도 나쁜 버그는 바로 에러가 나지 않고 문제가 없다는듯이 돌아가다가 전혀 상관없어보이는 곳에서 터지는 버그라던데, syscall이 바로 그런 종류였다고 생각한다. 디버거를 써도 잘 돌아가는 것처럼 보이다가 손댄적도 없는 스켈레톤 파일의 함수까지 가서 터져버리는 일이 많아서 디버거의 도움을 받기 힘들었다. 그래서 되는 남의 코드와 안되는 내 코드를 비교해가며 왜 안되는지를 고민하고, 함수간의 로직을 파악해서 잘 쓰려는 노력을 하는 데에 많은 시간을 썼다.
그래도 테스트를 돌릴 수 있게 된 후부터는 속도가 붙었다. 어디에서 문제가 되는지 테스트의 출력으로부터 거슬러 올라가는 것으로 확실히 알 수가 있어서 fail이 뜨는 테스트로부터 문제가 되는 부분을 하나하나 고치는 것으로 빠르게 구현을 할 수 있었던 것 같다. 'Deny Write'까지 구현을 마친게 월요일 낮이라 Extra를 손댈 시간이 적었고, 구현을 해도 에러를 고치지 못해서 결국 이전 버전으로 되돌린 것이 아쉬움으로 남는다.
'Week 08 ~ 13 : KAIST PintOS' 카테고리의 다른 글
[KAIST PintOS Project] PRJ 4를 마치며 (0) | 2022.02.03 |
---|---|
[KAIST PintOS Project] PRJ 3를 마치며 (0) | 2022.01.25 |
[KAIST PintOS Project] PRJ 1을 마치며 (0) | 2021.12.30 |
[KAIST PintOS Project 1] 3. synchronization (0) | 2021.12.30 |
[KAIST PintOS Project 1] 2. priority scheduling (0) | 2021.12.29 |