궁금한점
- 왜 구조체에서 맨 아래부분이 stack에서는 위쪽에 오는거지?
- kernel stack이 확장되는 방향이랑 다른 방향으로 커지는것 같다.
- 왜 구조체 모양이 아래와 같은데 magic을 통해 stackoverflow를 해결할 수 있는 건가??
- 왜 grow downward?
- ‼️중간에 있는 공간을 share할 수 있게 초기 설계를 했기 때문에 관습적으로 이어짐
struct thread {
/* Owned by thread.c. */
tid_t tid; /* Thread identifier. */
enum thread_status status; /* Thread state. */
char name[16]; /* Name (for debugging purposes). */
int priority; /* Priority. */
/* Shared between thread.c and synch.c. */
struct list_elem elem; /* List element. */
// run queue의 원소로 사용되거나 semaphore wait의 원소로 사용.
// 동시에 두가지 기능을 할 수 있는 이유는 두 기능이 Mutually exclusive이기 때문이다.
// run queue에 들어가려면 ready state이어야 하고
// semaphore wait list에 들어가려면 block state이다.
// 스레드가 동시에 두가지 state를 가질 수 없으므로 elem을 통해 두가지 작업을 수행해도 문제가 생기지 않는다.
#ifdef USERPROG
/* Owned by userprog/process.c. */
uint64_t *pml4; /* Page map level 4 */
#endif
#ifdef VM
/* Table for whole virtual memory owned by thread. */
struct supplemental_page_table spt;
#endif
/* Owned by thread.c. */
struct intr_frame tf; /* Information for switching */
unsigned magic; /* Detects stack overflow. */
};
+---------------------------------+
* | magic |
* | intr_frame |
* | : |
* | : |
* | name |
* | status |
* 0 kB +---------------------------------+
참고자료