Static tasks structure -> Dynamic tasks structure

Nitroblue 1·2025년 10월 15일

현재 내 프로젝트는
'Tock-style, Rust based RTOS mini-kernel, static task structure' 형태이다.

앞으로 optimization 방향성은

  • Dynamic task generation adn allocation, scheduling structure
  • Tiered trust system using MPU

이렇게 잡고 있다.

그 중 첫 번째인 '동적 태스크 할당 및 운영 구조' 형태로 최적화해보고자 한다.

sched Module expandation

현재 버전

  • TCBS : [Tcb; N_TASKS] -> 정적 배열
  • TASK_STACKS : [TaskStack; N_TASKS] -> 정적 스택
  • 태스크 초기화는 init_kernel_and_tasks()에서 컴파일 시점에 고정된 엔트리 함수 주소(task0_entry, task1_entry, task2_entry)로 설정되어 있음.
  • 메모리 할당은 모두 정적이고, malloc이나 Box같은 힙 기반 구조가 없음.
    - no_std 환경에서 기본 할당자가 없다고 한다.

    따라서, 현재 구조는 Static RTOS Simulation 모델이므로, 커널이 프로세스 로딩이나 태스크 스택 재활용을 전혀 수행하지 못한다.

구현 핵심

  • 따라서 이 TCB 기반 정적 배열 구조를 '동적 리스트/큐' 기반 구조로 바꾸고, 더 나아가 MPU나 권한 분리까지 고려할 수 있는 인터페이스 확장이 필요하다.
  1. 힙 할당자 도입 : 런타임에 스택 및 TCB 할당 -> linked_list_allocator를 통해 전역 힙 초기화.
  2. TCB 관리 구조 : 고정 배열에서 Linked-List / Queue로 -> TaskList구조체에 VecDeque<Task> 또는 수동 linkedlist 사용.
  3. Task 생성 API : spawn(task_fn, stack_size) 같은 syscall 수준의 인터페이스 -> svc::abi::SPAWN_TASK 추가 및 커널에서 TCB 생성
  4. Context initialization : 새 스택에 HW/SW 컨텍스트 푸시 -> 기존 init_task_stack_and_tck() 재사용 가능.
  5. task 종료/회수 : 반환 시 스케줄러로 회수, 스택 메모리 재활용 -> task_return_trap() 이후 자원 정리.

설계 전환안 구조도

           ┌──────────────────────────────┐
           │        Kernel (MSP)        │
           │  - Scheduler (Linked list) │
           │  - Heap allocator          │
           │  - SVC handler (spawn, I/O)│
           └──────────────┬───────────────┘
                         │
    ┌──────────────────────┴──────────────────────┐
    │                 Task N                   │
    │   - Stack (heap allocated)               │
    │   - TCB { sp, regs, state, entry }       │
    │   - Runs on PSP                          │
    └─────────────────────────────────────────────┘

0개의 댓글