카드캡터 핀토스 🩷prologue – 꿈의 시작, 커널을 넘은 마법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
OS 개발, 커널 프로그래밍, 시스템 콜, 프로세스 관리
대상자
운영체제 개발자, 커널 프로그래머, 컴퓨터 구조 및 운영체제 수강생
핵심 요약
- 커널에서 유저 프로그램 실행을 위해
process_exec()
,load()
,setup_stack()
등 핵심 함수를 구현해야 한다. - 시스템 콜 처리는
syscall_handler()
를 통해 레지스터%rax
,%rdi
,%rsi
등에서 인자 값을 읽어 처리한다. - 자원 보호 및 안정성 확보를 위해
get_user()
,put_user()
로 유저 포인터 검증,filesys_lock
으로 파일 동기화를 수행해야 한다.
섹션별 세부 요약
1. 유저 프로그램 실행 구조
process_exec()
는 ELF 포맷 바이너리를 메모리에 로드하고,setup_stack()
을 통해argc
,argv[]
를 스택에 정렬한다.do_iret()
를 통해 유저 모드로 전환하고, 실행을 시작한다.- 유저 주소는
KERN_BASE
미만에서만 접근 가능하며, 위반 시 즉시 종료해야 한다.
2. 시스템 콜 처리 및 인자 전달
- 시스템 콜 번호는
%rax
레지스터에, 인자는%rdi
,%rsi
,%rdx
,%r10
등에 순서대로 저장된다. syscall_handler()
는struct intr_frame
을 통해 레지스터 값을 읽고, 결과는f->R.rax
에 저장하여 유저로 반환한다.%rdi
,%rsi
등 레지스터 순서가 바뀌면 인자 전달에 실패한다.
3. 자식 프로세스 생성 및 자원 관리
fork()
를 호출하면 현재 프로세스와 동일한 자식 프로세스가 생성된다.process_exit()
와process_wait()
를 통해 종료 메시지와 자원 회수를 처리한다.get_user()
,put_user()
로 유저가 넘긴 포인터가 위험한지 검증해야 한다.
4. 파일 시스템 및 동기화
create()
,remove()
,open()
,close()
를 통해 유저가 파일을 생성, 삭제, 열고 닫을 수 있다.filesys_lock
을 사용하여 파일 접근을 동기화하여 테스트 중 충돌을 방지해야 한다.hex_dump()
로 유저 스택 시각화하여argv[i]
를 확인할 수 있다.
결론
args-single
,args-multiple
테스트부터 시작하여process_exec()
와setup_stack()
을 구현하는 것이 핵심이다.msg()
함수를 사용하여printf()
대신 출력해야 채점 스크립트가 정상 작동하며, 각 테스트 전후ls
로 파일 시스템 상태를 확인해야 한다.