1. What?
1.1 Argument passing & User memory access
1.2 System call infrastructure
1.3 Process operation
2. How?
2.1 Argument passing & User memory access
- parse_filename 함수에서 command line을 argument parsing 한다.
strtok_r() 함수를 이용, parsing 후 argv(argument vector) 에 저장한다
- construct_esp 함수에서 parsing 된 argument들을 stack에 저장한다
argv를 인자로 받아와서 stack에 차례로 push한다. 하나 저장할 때 마다 esp를 하나씩 감소시킨다.
- user program 실행 시, kernel memory를 침범했을 때 error 처리를 한다
stack pointer가 PHYS_BASE보다 작아야함, is_user_vaddr() 함수를 이용
2.2 System call infrastructure
- 시스템으로부터 넘겨받은 intr_frame 정보로, 각 system call number에 해당하는 system call을 호출.
system call 호출 시 필요한 argument들을 같이 넘겨줘야함. intr_frame의 esp 포인터를 이용해서 argument들을 인자로 전달할 수 있다. (esp+1, esp+2, etc)
2.3 Process operation
- process wait : semaphore ( sema_down() ) 을 이용해서 process wait을 구현한다.
- process exit : process(child)가 종료될 때 필요한 작업을 수행해야함. wait 중인 process(parent)를 깨워 줘야함. sema_up() 으로 가능, 그 후 parent의 child list에서 child process를 삭제
- process execute : filesys_open() 을 통해서 유효하지 않은 process에 대해 에러처리
3. Detail
3.1 Argument passing & User memory access
3.1.1 pares_filename()
- 입력받은 command line을 tokenize, token들은 argv에 저장하고, token의 개수를 count하여 return한다. return된 count는 argc에 저장된다.
3.1.2 construct_esp()
- esp를 감소시키면서(PHYS_BASE부터 아래로 내려가므로), 저장된 argv들을 stack에 저장한다.
3.1.3 user_memory access
- user memory를 벗어나 kernel memory에 침범했을 시, 에러처리해야함. is_user_vaddr() 함수를 사용하면 된다.
3.2 System call infrastructure
- user program이 실행되면 interrupt를 통해 system call handler가 호출된다. (system call은 user program 에서 호출한 function들과, kernel function 사이의 interface와 같은 것임)
- system call handler는 interrupt frame을 인자로 전달받는데, 호출하려는 system call의 number를 알 수 있다. 분기문을 통해 system call의 number에 해당하는 system call function을 호출하면 된다.
- frame의 esp를 통해 stack에 접근할 수 있다. command를 parsing하면서 저장한 argument을 가져올 수 있는 것이다. 이 argument들을 system call 함수 호출시 인자로 넘겨줘야 한다.
3.3 Process operation
3.3.1 process wait
- process wait을 하려는 process는 parent process이다. user program은 child process로서, parent로 부터 만들어진 후 실행 된다. 따라서 parent는 child가 모든 실행을 끝마치고 값을 return할 때 까지 wait해야 한다.
- parent process의 child list에서(원래 없음 만들어야함), 함수의 인자로 전달된 child_tid와 일치하는 child process를 찾는다.
- 그 후 parent의 sema를 down 시킨다. 그러면 parent는 child가 작업이 끝난 후 sema up 시킬 때까 지 wait하게 된다.
3.3.2 process exit
- child process가 실행을 마친 후 종료될 때 먼저 wait중인 parent process를 깨운다. sema_up을 통해 깨울 수 있다. sema_up의 인자로 parent의 sema structure를 넘겨주면 된다.
- 그 후에는 child의 page directory가 삭제 된다 (이건 원래 구현되어있음). 그리고 현재 child를 부모의 child list에서 삭제해준다.
- 마지막으로 현재 child를 block 시킨다. thread_block을 하면 현재 process의 status가 running에서 blocked로 바뀌게 된다. interrupt를 disable 시켜야 thread block이 가능하다
3.3.3 process excute
- 제대로 생성되지 않은 file에 대한 예외처리만 해주면 된다. filesys_open 함수를 통해 file을 open하 는데, 성공시 true, 실패 시 NULL을 return한다. 값이 NULL이면 -1을 return해주고 끝내면 된다.
'OS' 카테고리의 다른 글
pintos 요약 - 3. Virtual Memory (5) | 2015.07.05 |
---|---|
pintos 요약 - 2-2. User Program (file system & synchronization) (0) | 2015.07.05 |
pintos 요약 - 1. Thread (0) | 2015.07.05 |
8장 memory management (0) | 2013.12.09 |
TLB (0) | 2013.12.08 |