[Pintos] 트러블슈팅: 기본 제공 함수에서 오류가 발생하는 문제 해결하기

2025. 5. 17. 23:44·크래프톤 정글/Code 정글(C언어)

트러블슈팅: 기본 제공 함수에서 오류가 발생하는 문제 해결하기

이번에 Pintos 프로젝트를 진행하면서 새롭게 수정하지 않은 기본 제공 함수에서 오류가 발생하는 상황을 겪게 되었는데요. 그 사실도 모른 채, 오류를 해결하려고 직접 수정한 코드까지 괜히 손댔다가, 알고 보니 그 코드에는 문제가 없어서 오히려 상황을 악화시키는 일도 겪었습니다.

 

그렇게 하루를 꼬박 디버깅에 보낸 끝에 저의 부족함을 인정하고, 정상적으로 작동하는 다른 조의 코드를 받아 제 컴퓨터에서 실행해봤는데도 여전히 문제는 해결되지 않았습니다. 분명 다른 친구 컴퓨터에서는 테스트가 pass되고 로그도 정상 출력되는데, 왜 내 컴퓨터에서는 안 되는 걸까? 심지어 잘 되는 친구의 코드는 저와 코드 로직 면에서 동일했습니다.

 

결국 지푸라기라도 잡는 심정으로 각종 설정 파일까지 살펴보다가, 뜻밖에도 그곳에서 문제의 원인을 발견할 수 있었습니다.

 

 

Ubuntu 버전이 다르면 되는 코드도 안 될 수 있다

결론부터 말씀드리자면, Ubuntu 버전이 달라서 발생하고 있던 문제였는데요. 저의 경우에 ELF 로딩이 계속 실패하고 있었는데 이는 Pintos 기본 제공 함수에서 담당하는 부분이었습니다. 다른 조 친구의 수정한 코드가 저랑 다를 게 없다는 걸 확인하고 나서야 이게 제가 수정한 코드 문제가 아니라는 걸 깨닫고 나서야 발견할 수 있었지요.

 

정확히 말하면 Ubuntu 버전 자체가 달라서라기보다는, Ubuntu에 포함된 툴체인(toolchain) 버전 차이로 인해 해당 문제가 발생한다고 합니다.

  • Ubuntu 18.04의 binutils 및 gcc는 보수적인 방식으로 segment를 정렬
  • Ubuntu 20.04에서는 보다 정밀한 p_vaddr 및 p_offset 계산이 적용되면서, 페이지 정렬이 어긋난 segment가 생김

그 결과로 아래와 같은 현상이 발생하게 되었습니다.

  • 첫 번째 segment와 두 번째 segment가 동일한 페이지(예: 0x400000)를 공유
  • PintOS의 load_segment()는 페이지 단위 매핑을 가정하고 install_page()를 호출하므로, 중복된 페이지 매핑이 실패하며 커널 패닉 발생

 

문제 해결 방법

가장 확실한 방법은 Ubuntu 18.04버전으로 버전을 낮추는 것이었기 때문에, 저는 이를 선택했습니다. 다만 VSCode의 경우 Ubuntu 18.04의 gcc 버전이 현재 버전을 지원하지 않아 Docker 빌드 중에 오류가 발생하기 때문에 VSCode 버전 다운그레이드도 함께 진행했습니다.

 

(1) Visual Studio Code v1.75.0 다운로드 및 설치

Ubuntu 18.04의 gcc 버전을 지원하는 VSCode 구버전을 아래의 링크를 통해 설치합니다.

https://update.code.visualstudio.com/1.75.0/win32-x64-user/stable

  • 다운로드한 .exe 파일을 실행하여 설치합니다.
  • 기본 설치 경로는 C:\Users\{사용자이름}\AppData\Local\Programs\Microsoft VS Code입니다.
  • 관리자 권한 없이 설치 및 실행이 가능하며, 자동 업데이트 기능이 포함되어 있습니다.

(2) 자동 업데이트 비활성화하기

기껏 구버전을 설치했는데, 자동으로 다시 최신 버전으로 돌아가 버린다면 곤란해지겠죠. VSCode는 기본적으로 자동 업데이트를 수행하기 때문에, 구버전을 유지하려면 자동 업데이트를 직접 비활성화해야합니다.

  1. VS Code를 열고 Ctrl + Shift + P를 눌러 명령 팔레트를 엽니다.
  2. Preferences: Open Settings (JSON)을 선택합니다.
  3. 열린 settings.json 파일에 다음 설정을 추가합니다.
"update.mode": "none"

이 설정을 통해 자동 업데이트를 방지할 수 있습니다.

 

 

마치면서

제가 쓰던 프로젝트의 Docker 이미지는 원래 Ubuntu 18.04버전이었는데요. 빌드 중 VSCode에서 gcc오류가 나면서 Ubuntu 버전을 높여야 해결할 수 있다는 조언을 듣게 되었고 Dockerfile의 Ubuntu 버전을 20.04로 올리게 되었습니다.

 

그리고 실제로 Project1에서는 별다른 문제가 없었기 때문에, 이번 문제의 원인이 Ubuntu 버전일 것이라고는 전혀 예상하지 못했습니다. 곧 이번 트러블슈팅을 통해, 반드시 프로젝트에 권장된 버전을 사용해야 한다는 것을 깨닫게 되었습니다. 만약 저처럼 기본 제공 함수에서 문제가 발생한다면, 알맞은 Ubuntu 버전(18.04)이 아닌 다른 버전을 사용하고 있는 중인지 한 번 확인해 보시면 좋을 것 같습니다. 읽어주셔서 감사합니다.

'크래프톤 정글 > Code 정글(C언어)' 카테고리의 다른 글

[Pintos] User Programs Part1 구현하기 (프로세스 실행 및 인자 전달, 시스템 콜 및 사용자 포인터 검증, 프로세스 동기화 및 종료)  (0) 2025.05.20
[Pintos] Windows에서 make check가 안 될 때 해결 방법 (Error 127)  (0) 2025.05.19
[Pintos] User Programs Part1 전체적인 큰 그림 그리기  (0) 2025.05.16
[Pintos] VSCode에서 코드 사이 여행하기 (소스코드 분석 단축키)  (0) 2025.05.16
[Pintos] Pintos 학습 프로세스 ver2.0  (0) 2025.05.14
'크래프톤 정글/Code 정글(C언어)' 카테고리의 다른 글
  • [Pintos] User Programs Part1 구현하기 (프로세스 실행 및 인자 전달, 시스템 콜 및 사용자 포인터 검증, 프로세스 동기화 및 종료)
  • [Pintos] Windows에서 make check가 안 될 때 해결 방법 (Error 127)
  • [Pintos] User Programs Part1 전체적인 큰 그림 그리기
  • [Pintos] VSCode에서 코드 사이 여행하기 (소스코드 분석 단축키)
그냥사람_
그냥사람_
IT 관련 포스팅을 합니다. 크래프톤 정글 8기 정경호
  • 그냥사람_
    그냥코딩
    그냥사람_
  • 전체
    오늘
    어제
    • 글 전체보기 N
      • 크래프톤 정글 N
        • 로드 투 정글(입학시험)
        • CS기초(키워드, 개념정리)
        • 컴퓨터구조(CSAPP)
        • Code 정글(C언어)
        • Equipped in 정글(나만무) N
        • 마이 정글(WIL, 에세이)
      • 자료구조&알고리즘
        • 자료구조
        • 알고리즘
      • 일상
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • hELLO· Designed By정상우.v4.10.3
그냥사람_
[Pintos] 트러블슈팅: 기본 제공 함수에서 오류가 발생하는 문제 해결하기
상단으로

티스토리툴바