커널 프로그래밍 및 OS 개발: 시스템 콜, 프로세스 실행, 메모리 관리 (35자)
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

카드캡터 핀토스 🩷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로 파일 시스템 상태를 확인해야 한다.