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
Posted by bogus919
,