real_parent
, parent
, children
, sibling
같은 멤버가 있는데, 이들은 모두 프로세스의 부모와 자식 관계를 나타낸다.children
, sibling
는 연결 리스트로 이뤄져있다.stack
멤버는 프로세스 스택의 가장 낮은 주소(thread_info
구조체가 위치)를 가리킨다.thread_info
구조체는 프로세스 스택의 가장 낮은 주소에 위치한다.cpu_context
라는 멤버는 thread context의 핵심인 레지스터 값들을 저장한다.thread_info
는 ISA에 종속적이기 때문에, cpu_context
멤버는 없을 수도 있다.task
멤버는 task descriptor를 가리킨다.stmia ip! {r4, r5, r6, r7, r8, r9, sl, fp, sp, lr}
ip
는 thread_info
구조체의 cpu_context
멤버를 가리킨다.stmia
는 여러 레지스터 값을 연속된 메모리 주소에 store하는 명령pc
가 아닌 lr
을 저장한다.__switch_to()
를 호출 했던 곳의 주소(return address)를 store하게 된다.ldm r4, {r4, r5, r6, r7, r8, r9, sl, fp, sp, pc}
r4
는 thread_info
구조체의 cpu_context
멤버의 주소를 담고 있다.lr
값을 pc
로 load하게 된다.pc
나 lr
은 같을지라도 sp
가 다르다면, 완전히 다른 실행 흐름을 갖게 된다.cf.
struct task_struct
가 리눅스의 PCB(Process Control Block, Task Control Block)이며, Task Descriptor라고 부른다.struct thread_info
가 리눅스의 TCB(Thread Control Block)다.