# tg-rcore-tutorial-kernel-context

Kernel context management for the rCore tutorial operating system.

## 设计目标

- 提供 RISC-V 上下文切换的统一抽象，简化章节内核对 trap/调度的实现。
- 支持用户态与内核态切换（`LocalContext`）。
- 在需要跨地址空间切换时提供 `foreign` 扩展能力。

## 总体架构

- `LocalContext`：封装通用寄存器、`sepc`、`sstatus` 等上下文状态。
- 裸汇编执行路径：负责寄存器保存/恢复与 `sret` 相关切换流程。
- `feature = "foreign"`：
  - `ForeignContext`
  - `ForeignPortal` / `PortalCache`
  - `MultislotPortal`

## 主要特征

- `LocalContext::user(pc)`：创建用户态执行上下文。
- `LocalContext::thread(pc, interrupt)`：创建内核线程上下文。
- `execute()`：执行一次上下文切换（unsafe）。
- `move_next()`：系统调用返回时推进 `sepc`。
- `foreign`：支持跨地址空间切换相关工具。

## 功能实现要点

- 切换过程中直接操作关键 CSR（如 `sscratch`、`sepc`、`sstatus`、`stvec`）。
- `execute()` 为 unsafe：调用方必须保证上下文内容、栈、入口地址与页表状态有效。
- 面向教学场景提供较清晰的寄存器访问接口（`a(i)`、`sp_mut()` 等）。

## 对外接口

- 结构体：
  - `LocalContext`
- 关键方法：
  - `empty()`
  - `user(pc)`
  - `thread(pc, interrupt)`
  - `a(i)`, `a_mut(i)`
  - `sp()`, `sp_mut()`
  - `pc()`, `pc_mut()`
  - `move_next()`
  - `execute()`
- `foreign` 模块（按 feature）：
  - `ForeignContext`
  - `ForeignPortal`
  - `PortalCache`
  - `MultislotPortal`

## 使用示例

```rust
use tg_kernel_context::LocalContext;

let mut ctx = LocalContext::user(entry_point);
*ctx.sp_mut() = user_stack_top;

unsafe { ctx.execute() };
```

- 章节内真实用法：
  - `tg-rcore-tutorial-ch2/src/main.rs` 使用 `LocalContext::user` 与 `execute` 跑用户程序。
  - `tg-rcore-tutorial-ch4/src/process.rs` 在 `foreign` 场景下进行地址空间相关切换。

## 与 tg-rcore-tutorial-ch1~tg-rcore-tutorial-ch8 的关系

- 直接依赖章节：`tg-rcore-tutorial-ch2` 到 `tg-rcore-tutorial-ch8`。
- 关键职责：承接 trap 返回、系统调用返回与任务切换的上下文管理。
- 关键引用文件：
  - `tg-rcore-tutorial-ch2/src/main.rs`
  - `tg-rcore-tutorial-ch3/src/task.rs`
  - `tg-rcore-tutorial-ch4/src/process.rs`
  - `tg-rcore-tutorial-ch8/src/process.rs`

## License

Licensed under either of MIT license or Apache License, Version 2.0 at your option.
