..
Pintos 64bit - User Programs
Pintos 과제 2: User Program의 목표는 커널 위에서 사용자 프로그램을 실행할 수 있는 환경을 만드는 것
명령어
make tests/userprog/read-normal.result VERBOSE=1
pintos --gdb --fs-disk=10 -p tests/userprog/exec-boundary:exec-boundary -- -q -f run exec-boundary tests/userprog/exec-boundary
pintos --gdb -v -k -T 60 -m 20 --fs-disk=10 -p tests/userprog/fork-once:fork-once -- -q -f run fork-once
- os.dsk cannot be temporal 에러 -> make를 안해서 dsk 파일이 없을때 생기는 오류
명령어 설명
pintos --gdb --fs-disk=10 -p tests/userprog/create-exists:create-exists -- -q -f run create-exists
- pintos –gdb : Pintos는 QEMU를 실행시키고 그 위에서 OS를 구동합니다. QEMU를 GDB stub 모드로 실행
- –fs-disk=10 : 파일 시스템 디스크의 크기를 10MB로 설정
- -p SRC:DEST 형식 :
- SRC = 호스트(리눅스) 쪽 경로: tests/userprog/create-exists
- DEST = Pintos 가상 파일시스템 안의 파일 이름: create-exists
- -q -f run create-exists
- -q → 테스트 끝나면 Pintos 자동 종료
- -f → 실행 시작 시 파일시스템 포맷
- run create-exists
- run = Pintos 커널이 지원하는 액션
- create-exists = 앞서 -p로 올린 실행 파일을 가상 파일시스템에서 실행
핵심 목표
- 프로세스 생성 및 관리
- ELF 실행 파일을 메모리에 로드하고, 사용자 스택을 준비한 뒤 실행합니다.
- 부모 프로세스가 자식 프로세스의 종료를 기다릴 수 있도록 process_wait() 구현이 필요합니다.
- fork, exec, exit, wait 같은 시스템 콜을 지원합니다.
Argument Passing
- call -> 스택에 “돌아올 주소” push + 함수 시작으로 점프
- ret -> 스택에서 “돌아올 주소” pop + 그 주소로 점프
- rip -> CPU가 “지금/다음에 실행할 명령어” 주소를 저장하는 레지스터
- file_name 문자열을 토큰으로 나누어 첫 번째 토큰만 filesys_open() 에 넘기도록 수정
- 밖에서 파싱하고, load() 에는 실행파일 이름만 넘기는 게 정석