OS/Pintos 개발일지

[Pintos] 1. background

Binceline 2018. 10. 22. 00:46

struct thread

- thread id

- thread status // running, ready, block, dying

- thread name

- stack pointer // saved stack pointer

- priority

+ allelem // list element for all threads list.

+ elem // list element

- pagedir // USER PROGRAM이 define되어 있다면 사용. page directory이다.

- magic // detects stack overflow

생성될 때 THREAD_MAGIC(0xcd6abf4b)으로 설정. 스택 오버플로우 발생 시 이 값이 변한다.


description

- kernel 스택 메모리가 작아서 스택 오버플로우가 일어날 수 있다. 그러니 메모리가 많이 필요한 경우 heap 메모리를 사용하자.



asm

- switch_threads(cur, next)

- cur 스레드는 현재 레지스터 셋(e.g. PC)을 저장하고 CPU의 Stack Pointer 를 stack 멤버에 저장에

- next 스레드의 레지스터 셋, 스택 포인터를 CPU에 설정


thread.c

- thread_yield

- 현재 스레드는 sleep 상태로 되는 게 아니라 곧바로 다시 스케줄링된다.

- 현재 인터럽트 상태를 저장하고 disable했다가 스케줄링이 끝나면 다시 복구한다.

- schedule()

- 실행 중인 스레드 A, 다음에 실행할 스레드 B를 가져온 후, 만약 A != B라면 B를 run 상태로 만든다.

- schedule()

- thread_schedule_tail()

- 새로 실행한 스레드를 run 상태로 변경

- 이전 스레드가 DYING 상태라면 페이지 메모리 해제


interrupt.c

- intr_context()

- 외부(하드웨어) 인터럽트 수행 중에는 이 값이 true로 설정된다. 그 외에는 false를 반환

- intr_disable()

- 인터럽트를 disable시키고 

- pic_end_of_interrupt(int irq)

- PIC : Programmable Interrupt Controller

- 분석하자.. 어렵네


list.c

- list_end

- tail을 반환한다.

- is_interior(elem)

- elem / prev / next가 모두 != null인지 검사하고 true/false 반환

- is_tail(elem) 

- 내부적으로 tail을 반환. null이면 잘못된 경우이므로 assert로 잡아주어야 한다.

- list_insert(before, elem)

- 새로운 노드 추가. 이전 노드의 앞에 추가한다.

반응형