Tock OS 구현기 3

Nitroblue 1·2025년 9월 19일

핵심 문제

  • 그동안 각 앱마다 고유 메모리 공간을 부여했고, Stack pointer도 잘 활용했으며, 스케줄러에서도 첫 번째 스위칭까지는 잘됐다.
  • 하지만 첫 번째 Context Switching 이후에 계속 하드폴트가 나고 있었다.

조교님의 도움

  • "메모리 공간 할당 잘 했는데.. 문제는 이 앱들의 컨텍스트를 보존하고 있는 메모리 공간이 안보인다."

아!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
현재 코드에서 sched::start()를 호출한 후 PendSV가 발생하면, 커널의 실행 컨텍스트가 손실되어 문제가 발생하는 것 같다.

현재 구조의 문제점:

  • 각 앱들은 각각 독립적인 스택 공간(STACKS)을 가지고 있음
  • 하지만 OS 커널(스케줄러)은 메인 스레드의 MSP를 사용하고 있음
  • PendSV에서 첫 번째 컨텍스트 스위치를 시도할 때 MSP → PSP로 전환하는데, OS 자체의 컨텍스트가 보존되지 않음.

실제 OS 구조에서는:

  • 커널 스택 (OS 전용) : 인터럽트 처리, 스케줄링, 시스템 콜 처리용
  • 태스크 스택들 (각 앱 전용) - 태스크 실행용

TODO

  1. 커널 전용 스택 공간 할당

  2. PSP는 태스크 전용으로만 사용

  3. MSP는 커널(인터럽트, 스케줄러) 전용으로 유지

    이렇게 수정하면 OS가 태스크들을 관리하면서도 자신만의 메모리 공간을 유지할 수 있을 것 같다.

0개의 댓글