<< Pintos 기본 흐름 >>
// Pintos - Project #2를 하면서 기본적으로 숙지하고 있어야 할 사용자 프로그램이 실행되기까지의 과정이다. 아주 기본적인 사항들만을 나열한 것인데... ctags로 pintos/src 전체에 태그를 만들어두고 코드를 따라가다 보면 아래 순서대로 실행이 되는 것을 확인할 수 있다. 여기서 중요한 것은 실질적으로 사용자 프로그램이 실행되는 것은 아래에 나열되어 있는 함수들이 하는 기능이 아니라 JMP 명령을 통해 해당 명령어로 직접 점프를 하여 실행이 된다는 것이다. 당연히 C코드가 아니다. 어셈블리 코드이다. 더 정확히 흐름을 이해하고 싶다면 직접 코드를 따라가며 분석해 보기 바란다.

- threads/init.c의 main()에서 Pintos 시작 → Pintos 구동에 필요한 초기화(initialization)를 수행
- 초기화를 완료한 후 run_action()을 호출 → user program 실행시 run 'user program'을 인자값으로 넘겨주기 때문에 run에 해당하는 run_task()가 호출된다. (이때, run은 argc가 2가 되어야 정상 실행된다)
- process_wait(process_execute(task))를 호출 : 여기서 task는 run의 인자값으로 넘겨준 문자열이다.
 ※ process_wait()와 process_execute()는 userprog/process.c에 정의되어 있다.
- process_execute()에서는 page를 설정하고 스레드를 생성 → thread_create()를 호출하면서 function값으로 execute_thread를 넘긴다.
- thread_create()에서는 스레드를 생성하고 해당 구조체에 기본 정보를 설정 → kernel_thread() 호출
- kernel_thread()에서 execute_thread() 호출
- execute_thread()에서는 load()를 호출하여 pagedir를 생성하고 파일시스템으로부터 인자로 넘어온 이름의 실행파일을 오픈하고 코드를 메모리로 읽어옴 → setup_stack()을 통해 사용자 메모리 영역에 스택을 초기화 하고, eip에 다음에 실행될 명령어의 주소를 설정한다.
- load()가 정상적으로 종료되면 true 값이 반환이 되고 해당 프로그램이 실행이 된다. 그렇지 않으면 page를 free 시키고 스레드를 종료시킴
- process_wait()내에는 아무런 코드도 정의되어 있지 않기 때문에 실행이 된 Pintos는 종료되지 않고 대기상태로 있게 된다.

http://thehead.tistory.com 무단펌;; 용서해 주시겠지;;
1 ··· 77 78 79 80 

카운터

Total : / Today : / Yesterday :
get rsstistory!