User Programs Part 2 전체적인 큰 그림 그리기
Part1에서는 기본적인 사용자 프로그램이 실행과, 간단한 시스템 콜(halt, exit, exec, wait), 그리고 최소한의 write 시스템 콜(fd가 1인 경우)을 구현해 보았습니다. 이어지는 Part2에서는 프로젝트의 나머지 빈 부분들을 채우게 되는데요. 곧 아직 미구현인 채로 남아있는 나머지 시스템 콜, 유저 포인터의 단일 주소 뿐만 아니라 메모리 범위, 문자열 검증 로직, 파일 시스템과의 연동, 그리고 부모-자식 프로세스 간의 동기화를 마무리짓게 됩니다.
문제 정의 및 전체 흐름 파악하기
현재 상태 분석 및 문제 정의
기본적인 틀은 갖춰진 상태지만, 여전히 다음과 같은 문제들이 남아 있습니다.
- 많은 시스템 콜이 여전히 미구현 상태
- 특히 파일 시스템 관련 시스템 콜(open, close, read, write(fd != 1), seek, tell 등)이 미구현
- 동시성 및 파일 공유 문제는 전혀 고려되지 않고 있음
- 사용자 프로그램이 전달하는 포인터에 대한 검증 로직이 없는 상태
- 커널이 잘못된 주소를 참조하여 충돌하거나 보안상 위험이 존재할 수 있음
- 문자열의 시작 주소는 유저 영역이지만, 일부분이 유저 영역을 벗어나는 경우 처리 불가
- 파일 시스템과의 실제적인 연동이 전혀 이루어지지 않는 상태
- 현재로서는 파일을 열거나 내용을 읽고 쓰는 작업을 수행할 수 없음
- 일부 로직을 제외하고 부모 프로세스와 자식 프로세스 간의 동기화가 미구현 상태
- 프로세스 간의 경쟁 조건(race condition) 발생 가능성
- 프로세스 종료 상태가 제대로 관리되지 않을 수 있음
학습 목적
- 커널–유저 경계 보안 이해
- 시스템 콜 인터페이스가 사용자 프로그램과 커널을 어떻게 안전하게 분리·보호하는지 학습하기
- 메모리 안전성 체험
- 포인터 유효성 검증 로직을 직접 구현해 잘못된 주소 접근이 시스템 안정성에 미치는 영향을 이해하기
- 파일 시스템 추상화 파악
- FDT, inode 등 내부 자료구조를 통해 파일 시스템 계층이 동작하는 원리를 익히기
- 동시성과 동기화 설계
- 파일 I/O·프로세스 제어 과정에서 발생하는 경쟁 상황을 분석하고 semaphore·lock 등 동기화 기법을 적용하기
- 자원 생명주기 관리
- 프로세스와 파일 객체의 생성→사용→정리 흐름을 설계·구현하여 자원 누수 및 일관성 오류를 방지하기
전체 실행 흐름 파악하기
Part2는 다음과 같은 큰 흐름으로 진행됩니다.
- 시스템 콜 처리 개선
- 시스템 콜 핸들러에서 사용자 프로그램의 포인터 유효성을 철저히 검증
- 파일 관련 시스템 콜(open, close, read, write, seek, tell 등)을 각각의 커널 내 함수로 구현
- 파일 시스템 연동
- 파일 디스크립터 테이블(FDT)을 프로세스별로 관리하고, open, close 시스템 콜로 파일 객체의 생명 주기를 관리
- read, write 시스템 콜에서 파일 시스템 API를 호출하여 파일로부터 데이터를 읽거나 쓰는 기능 제공
- 부모-자식 프로세스 동기화
- 프로세스 복제 시스템 콜(fork)과 관련 함수인 __do_fork를 완전한 기능을 수행하도록 구현
- 이를 위해 경쟁 조건을 방지하기 위한 적절한 동기화 프리미티브(예: semaphore)를 사용
이를 통해 보다 완전하고 안정적인 사용자 프로그램 실행 환경을 제공하는 것을 목표로 합니다.
다음은 같은 조의 박은범 학우가 System Call에 대해 전체적으로 정리한 내용이니 참고해보시면 좋을 것 같습니다.
https://velog.io/@corinbeom/PintOS-Project-2-UserProgram-System-Call
추가로 같은 조 임준혁 학우가 Fork와 동기화에 대해 정리한 내용이 있어 공유해드립니다.
https://zeka0228.tistory.com/6
'크래프톤 정글 > Code 정글(C언어)' 카테고리의 다른 글
[Pintos] 트러블슈팅: CRLF로 인해 맞는 코드의 테스트가 실패하는 현상 해결하기 (0) | 2025.05.23 |
---|---|
[Pintos] User Programs Part2 구현하기 (동기화 처리된 fork 구현, 파일 시스템 관련 시스템 콜 마무리) (0) | 2025.05.23 |
[Pintos] User Programs Part1 구현하기 (프로세스 실행 및 인자 전달, 시스템 콜 및 사용자 포인터 검증, 프로세스 동기화 및 종료) (0) | 2025.05.20 |
[Pintos] Windows에서 make check가 안 될 때 해결 방법 (Error 127) (0) | 2025.05.19 |
[Pintos] 트러블슈팅: 기본 제공 함수에서 오류가 발생하는 문제 해결하기 (0) | 2025.05.17 |