SW Jungle/Week 09 (4) 썸네일형 리스트형 project 02 User program(fork) 지금 부터는 구현 했던 syscall 함수 중에서 가장 어렵고 이해가 힘들었던 fork 관련 내용을 정리하려고 한다 . pid_t fork (const char *thread_name); 먼저 fork 함수의 기능에 대해 설명하자면 현재 프로세스 이름이 thread_name인 프로세스의 복제본을 만드는 새 프로세스를 생성해야 합니다. 호출자 보존 레지스터인 %RBX, %RSP, %RBP, and %R12 ~ %R15 의 값 이외에는 레지스터 값을 복제할 필요가 없습니다. 함수는 자식 프로세스의 pid를 반환해야 합니다. 그렇지 않으면 유효한 pid가 아니어야 합니다. 자식 프로세스에는 반환 값이 0이어야 합니다. 자식 프로세스는 파일 디스크립터와 가상 메모리 공간을 포함하여 복제된 리소스를 가져야 합니다.. project 02 User program(System_call) System call os에 의해 제공되는 프로그래밍 인터페이스 유저 모드의 프로그램이 kernel feature를 이용할 수 있게함 시스템 콜은 커널 모드에서 진행되며 return 할때 유저 모드로 돌아감 위에는 시스템 콜의 process를 나타내는 그림 먼저 유저가 write 함수를 통해 system call을 호출함 파라미터가 총 세개 들어가는 것을 볼 수 있음(arg0, arg1, arg2) int 0x30 -> 0x30은 인터럽트 번호를 의미함 syscall_nr.h에 시스템 콜의 번호가 적혀있음 Requirement for System Call Handler Implement system call handler 시스템 콜 번호를 이용해 핸들러가 시스템 콜을 호출하게 한다 파라미터 리스트의 포인.. project 02 User program(Argument passing) - 개발 계획 user 영역에서 입력 받은 argumet를 strtok_r 함수를 통해서 파일 이름과 인자들로 parsing 해서 선언한 argv에 저장한 후 이름과 인자들의 길이로 메모리 사이즈 측정 마찬가지로 선언한 size에 저장해준뒤 user_stak에 parsing한 인자의 끝부터 위에서 부터 저장해 나갑니다. 이때 주의 할점은 속도 향상을 위해 stack에 저장되는 데에터의 size는 8의 배수로 마쳐 줍니다. 8의 배수를 마쳐주기위해 알맞은 padding size로 채워 준뒤 파일 이름과 인자들이 전부 들어갔다는 것을 알리기 위해 8bite 크기를 가지는 null 값을 채워줍니다. 다음 부분은 위에서부터 쌓아온 인자들의 주소값을 가지는 데이터를 8bite로 채워줍니다. 이 모든 과정이 끝나는.. project 02 User program(background) - 노트 정리 process_excute()호출 -> thread_creat()으로 할당 해줌 지금은 유저 프로세스가 실행되고 나면 kernel이 꺼지는데, 이번 프로젝트의 목표는 유저 프로세스가 실행되면 유저프로세스가 끝날 때까지 커널이 기다리게끔 하는 것 echo x y z 라는 함수가 들어 왔을 때, echo라는 프로그램과 x, y, z 라는 인자로 구분해야함 그러기 위해서 argument를 파싱해서 유저 스택에 넣어야함 관련 Q1. process.c의 do_iret 함수를 통해서 intr_fram if_에 있던 데이터들이 레지스터에 저장되고 if_ -> rip인 e_entry가 레지스터의 rsp에 저장되는것으로 이해, 이후 실행되는 iretq함수를 실행되면 레지스터의 rsp에 저장된 주소로 이동,.. 이전 1 다음