PCB와 TCB

MySprtlty·2023년 10월 2일
0

Kernel

목록 보기
4/10

🏷️PCB와 TCB

📌Task Descriptor (PCB)

  • real_parent, parent, children, sibling같은 멤버가 있는데, 이들은 모두 프로세스의 부모와 자식 관계를 나타낸다.
    • 🖇️cf. children, sibling는 연결 리스트로 이뤄져있다.
  • stack멤버는 프로세스 스택의 가장 낮은 주소(thread_info 구조체가 위치)를 가리킨다.

📌thread_info (ARM)

  • thread_info 구조체는 프로세스 스택의 가장 낮은 주소에 위치한다.
  • 스택은 높은 주소에서 낮은 주소 방향으로 자라나기에, 함수 호출이 깊어지지 않는 한 영향 받지 않는다.
  • cpu_context라는 멤버는 thread context의 핵심인 레지스터 값들을 저장한다.
    • thread_info는 ISA에 종속적이기 때문에, cpu_context멤버는 없을 수도 있다.
  • task 멤버는 task descriptor를 가리킨다.

🏷️context 백업 과정에서 pc가 아닌 lr를 저장한다.

stmia ip! {r4, r5, r6, r7, r8, r9, sl, fp, sp, lr}
  • context를 백업하는 명령이다.
  • 여기서 ipthread_info구조체의 cpu_context 멤버를 가리킨다.
    • 🖇️cf. stmia는 여러 레지스터 값을 연속된 메모리 주소에 store하는 명령
  • pc가 아닌 lr을 저장한다.
  • 즉, __switch_to()를 호출 했던 곳의 주소(return address)를 store하게 된다.
  • 다음은 context를 복구하는 명령이다.
ldm r4, {r4, r5, r6, r7, r8, r9, sl, fp, sp, pc}
  • r4thread_info구조체의 cpu_context 멤버의 주소를 담고 있다.
  • lr값을 pc로 load하게 된다.
    • 그 즉시, caller로 돌아가게 된다.
  • 🖇️cf. pclr은 같을지라도 sp가 다르다면, 완전히 다른 실행 흐름을 갖게 된다.
  • 🖇️cf. 여기서는 커널 모드에서 수행중이었으므로, stack은 각 프로세스 별로 존재하는 kernel stack이 된다.

cf.

  • struct task_struct가 리눅스의 PCB(Process Control Block, Task Control Block)이며, Task Descriptor라고 부른다.
  • struct thread_info가 리눅스의 TCB(Thread Control Block)다.
profile
2Co 4:7

0개의 댓글