Skip to content

Commit 96b29f5

Browse files
committed
docs: 更新文档
1 parent 9399b1d commit 96b29f5

File tree

7 files changed

+267
-21
lines changed

7 files changed

+267
-21
lines changed

docs/SUMMARY.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
- [Initrd 初始内存盘](fs/initrd.md)
3434

3535
- [基础设施](infrastructure/index.md)
36-
- [配置系统 (Kconfig)](infrastructure/config-system.md)
36+
- [配置系统 (Anaxa Builder)](infrastructure/config-system.md)
3737
- [构建系统 (Makefile)](infrastructure/build-system.md)
3838
- [CI/CD 与工作流](infrastructure/ci-cd.md)
3939
- [项目目录结构](infrastructure/structure.md)

docs/api/proka_kernel/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# API 参考
Lines changed: 73 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,78 @@
1-
# 配置系统 (Kconfig)
1+
# 配置系统 (Anaxa Builder)
22

3-
Proka Kernel 借鉴了 Linux 内核的配置思路,使用 `Kconfig.toml` 文件定义内核的可配置选项,并提供类似 `menuconfig` 的交互界面。
3+
Proka Kernel 借鉴了 Linux 内核的配置思路,使用 `Kconfig.toml` 文件定义内核的可配置选项,并提供类似 `menuconfig` 的交互界面。我们的配置系统基于 [Anaxa Builder](https://github.com/RainSTR-Studio/anaxa-builder),一个用于动态配置生成的 Rust 库(没错,也是我们开发的!)。
44

5-
## 技术栈
6-
- **cargo-anaxa**: 一个基于 Rust 的内核配置工具,读取 `Kconfig.toml` 并生成 Rust 代码。
7-
- **Kconfig.toml**: 采用 TOML 格式定义配置项及其依赖关系。
5+
## 配置定义
86

9-
## 如何配置
10-
运行以下命令进入 TUI 配置界面:
11-
```bash
12-
make menuconfig
7+
我们的根配置文件为`kernel/Kconfig.toml`,该配置文件定义了内核各个子系统的分配置文件引用。
8+
9+
如:
10+
```toml
11+
{{#include ../../kernel/Kconfig.toml}}
12+
```
13+
14+
`menu`下的配置项会生成一个菜单项,其显示名称会优先使用其引用的文件的`title`字段,否则使用他的key。
15+
16+
### 配置项定义
17+
18+
每一个配置项均为`[[config]]`的子项,其完整示例定义如下:
19+
```toml
20+
[[config]]
21+
name = "PAGE_SIZE" # 配置项名称(必填)
22+
type = "int" # 配置项类型(必填)
23+
default = 4096 # 默认值(选填)
24+
desc = "The Page Size (Unit: Bytes)." # 描述(选填)
25+
help = "The size of per page." # 帮助信息(选填)
26+
rust_type = "usize" # Rust 类型(选填)
27+
options = ["RR", "FIFO", "CFS"] # 选项(仅适用于 choice 类型)
28+
depends_on = "PAG_STRATEGY || PAGE_REC" # 依赖项(选填)
29+
range = [1, 1024] # 取值范围(仅适用于 int 类型)
30+
regex = "^[a-zA-Z0-9_]+$" # 正则表达式(仅适用于 string 类型)
31+
feature = ["paas"] # 对应需启用的cargo feature(仅适用于 bool 类型,选填)
32+
```
33+
34+
`type`字段定义了配置项的类型,目前支持以下类型:
35+
- `bool`: 布尔型,值为`true``false`
36+
- `int`: 整数型,值为任意整数
37+
- `string`: 字符串型,值为任意字符串
38+
- `hex`: 十六进制型,值为任意十六进制数
39+
- `choice`: 选择型,值为用户选择的选项
40+
41+
`rust_type`字段定义了配置项在 Rust 中的类型,他会覆盖`type`字段的默认映射,但是,`rust_type`字段将会进行验证,如果类型不匹配,将会报错。以下为配置项类型的默认映射:
42+
- `bool`: `bool`
43+
- `int`: `i64`
44+
- `string`: `&str`
45+
- `hex`: `u64`
46+
- `choice`: `&str`
47+
48+
49+
`desc`字段定义了配置项的描述,将会在菜单中显示,并且也会作为其生成的Rust代码的文档字符串。`help`将在TUI的配置项详细页中显示。
50+
51+
`depends_on`字段定义了配置项的依赖项表达式([`evalexpr`](https://crates.io/crates/evalexpr)语法),如果依赖项表达式求值结果为`true`,则当前配置项将显示。
52+
53+
`range`字段定义了配置项的取值范围(使用`>=``<=`),仅适用于`int`类型。
54+
`regex`字段定义了配置项的匹配正则表达式,仅适用于`string`类型。
55+
56+
57+
### 配置引用定义
58+
59+
```toml
60+
[[menu]]
61+
a = "./a"
1362
```
1463

15-
## 原理
16-
1. `make menuconfig` 启动 `cargo-anaxa`
17-
2. 用户在界面中选择配置。
18-
3. 工具生成一个临时的 `.config` 文件(或直接导出)。
19-
4. 在构建过程中,Rust 代码通过 `include!` 宏包含生成的配置常量。
64+
`a`下的`Kconfig.toml`文件将作为子配置项引用,并自动添加到配置文件中,从而绕过自动的按文件结构构建配置树。
65+
66+
## 条件编译
67+
68+
每一个类型为`bool`的配置项,都会向rustc传递与其名称相同的cfg选项,因此你可以在代码中通过`#[cfg(xxx)]`来进行条件编译,不应使用`#[cfg(feature = "xxx")]`进行条件编译,`feature`只应控制条件依赖。
69+
70+
## 配置检查
71+
72+
配置检查直接使用`make check`,他会同时运行`cargo check``cargo anaxa config-check`,以检查配置项的合法性和依赖关系是否正确。
73+
74+
## TUI配置界面
75+
76+
配置界面使用`make menuconfig`启动,会启动一个TUI界面,用户可以通过键盘输入来配置内核。
77+
78+
配置界面的详细使用方法请参考[]()

docs/infrastructure/index.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
Proka Kernel 使用了一套现代化的基础设施来简化内核的配置、构建和自动化测试流程。
44

55
本章节涵盖:
6-
- **配置系统**如何使用 TUI 界面配置内核特性
7-
- **构建系统**:Makefile 和 Cargo 的协作方式。
6+
- **配置系统**内核基于`anaxa-builder`配置系统的使用与配置
7+
- **构建系统**:Makefile, anaxa-builder 和 Cargo 的协作方式。
88
- **CI/CD**:自动化的集成测试流程。
99
- **目录结构**:项目源代码的组织方式。

docs/infrastructure/structure.md

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,25 @@ Proka Kernel 的代码组织遵循模块化原则。
1414
│ │ └── ...
1515
│ └── Makefile # 内核特定构建逻辑
1616
├── scripts/ # 开发与构建辅助脚本
17-
├── tests/ # 集成测试 (C/Rust)
1817
├── Makefile # 根目录 Makefile (总控)
1918
└── book.toml # mdBook 配置文件
2019
```
2120

22-
更多细节请参考各目录下的 `AGENTS.md` 文件。
21+
## 内核核心源码
22+
23+
内核核心源码位于 `kernel` 目录下。Rust项目所必须的`Cargo.toml`同样再次目录下,因此需在`kernel`目录下执行`cargo`命令(部分命令已通过`makefile`进行了封装)。
24+
25+
`src`目录下的模块包含:
26+
- `drivers`: 硬件驱动模块
27+
- `memory`: 内存管理模块
28+
- `interrupts`: 中断模块
29+
- `fs`: 文件系统模块
30+
- `process`: 进程模块
31+
- `libs`: 通用工具及杂项模块
32+
33+
## Scripts
34+
35+
脚本位于 `scripts` 目录下。用于存储构建与开发过程中所使用的脚本。一般为`bash``python`脚本。该目录不应含任何可执行二进制文件。
36+
37+
- `test_runner.sh`:测试运行器,用于在QEMU中运行内核测试
38+
- `font`: 该目录下为已弃用的`BMF`格式字体生成脚本及其文件格式定义,因为该格式已不再使用。

docs/introduction/conventions.md

Lines changed: 171 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,171 @@
1-
# Conventions
1+
# 代码规范与约定
2+
3+
本文档定义了 Proka Kernel 项目的编码规范、命名约定和代码风格。所有贡献者都应遵守这些约定以保持代码库的一致性和可维护性。
4+
5+
6+
### 代码格式
7+
8+
所有 Rust 代码必须遵循 **Rustfmt** 标准格式:
9+
10+
```bash
11+
make fmt
12+
```
13+
14+
具体规则:
15+
- 4 个空格缩进(无制表符)
16+
- 行宽限制 100 个字符
17+
- 使用 `rustfmt` 默认配置
18+
- 导入按标准库、外部库、内部模块分组排序
19+
20+
### 命名约定
21+
22+
遵循 Rust 社区标准:
23+
24+
| 项目 | 约定 | 示例 |
25+
|------|------|------|
26+
| **模块** | 蛇形命名法(snake_case) | `interrupts`, `memory_management` |
27+
| **结构体** | 大驼峰命名法(PascalCase) | `FrameAllocator`, `InterruptDescriptorTable` |
28+
| **枚举** | 大驼峰命名法(PascalCase) | `MemoryError`, `DriverType` |
29+
| **函数** | 蛇形命名法(snake_case) | `allocate_frame`, `handle_interrupt` |
30+
| **变量** | 蛇形命名法(snake_case) | `frame_count`, `current_process` |
31+
| **常量** | 全大写蛇形命名法(SCREAMING_SNAKE_CASE) | `BASE_REVISION`, `PAGE_SIZE` |
32+
| **类型参数** | 大驼峰命名法(PascalCase) | `T`, `E`, `P`, `Buf` |
33+
34+
### 模块组织
35+
36+
```
37+
kernel/src/
38+
├── lib.rs # 公共 API 导出
39+
├── main.rs # 内核入口点
40+
└── module_name/
41+
├── mod.rs # 模块声明和内部重导出
42+
├── submodule1.rs
43+
└── submodule2.rs
44+
```
45+
46+
**规则**
47+
1. 每个目录必须有 `mod.rs` 文件
48+
2. 使用 `pub(crate)` 限制内部可见性
49+
3. 仅在 `lib.rs` 中公开必要的 API
50+
4. 避免模块间的循环依赖
51+
52+
### 注释与文档
53+
54+
**单行注释**
55+
```rust
56+
// 使用简单的注释解释复杂逻辑
57+
let frame = allocator.allocate()?; // 如果分配失败则返回错误
58+
```
59+
60+
**多行注释**
61+
```rust
62+
/*
63+
* 复杂的算法说明
64+
* 第二行说明
65+
*/
66+
```
67+
68+
**文档注释**
69+
```rust
70+
/// 分配一个物理帧
71+
///
72+
/// # 参数
73+
/// - `allocator`: 帧分配器实例
74+
/// - `count`: 需要分配的帧数
75+
///
76+
/// # 返回值
77+
/// 返回分配的帧地址,或错误
78+
///
79+
/// # 安全要求
80+
/// 调用者必须确保帧分配器已初始化
81+
///
82+
/// # 示例
83+
/// ```
84+
/// let frame = allocate_frames(&mut allocator, 1)?;
85+
/// ```
86+
pub fn allocate_frames(allocator: &mut FrameAllocator, count: usize) -> Result<FrameAddress, MemoryError> {
87+
// ...
88+
}
89+
```
90+
91+
**内联汇编注释**
92+
```rust
93+
// SAFETY: 必须确保内存对齐和权限正确
94+
unsafe {
95+
asm!("mov cr3, {}", in(reg) page_table_addr);
96+
}
97+
```
98+
99+
### 内存安全与 unsafe 代码
100+
101+
**安全第一原则**
102+
- 优先编写安全的 Rust 代码
103+
- `unsafe` 块必须最小化并有充分理由
104+
105+
**unsafe 要求**
106+
1. 每个 `unsafe` 块必须有 `// SAFETY:` 注释
107+
2. 说明为什么是安全的以及调用者需要满足的条件
108+
3. 验证所有不变量和前置条件
109+
110+
**示例**
111+
```rust
112+
/// 设置当前页表
113+
///
114+
/// # 安全要求
115+
/// - `page_table_addr` 必须指向有效的页表
116+
/// - 页表必须正确设置权限位
117+
/// - 调用者必须确保在此函数后不会访问无效内存
118+
pub unsafe fn set_page_table(page_table_addr: usize) {
119+
// SAFETY: 调用者必须确保 page_table_addr 指向有效的页表结构,
120+
// 并且在切换页表后不会立即访问可能无效的内存地址
121+
asm!("mov cr3, {}", in(reg) page_table_addr);
122+
}
123+
```
124+
125+
**全局状态**
126+
- 使用 `Mutex``RwLock``Atomic` 保护共享状态
127+
- 避免裸的全局变量
128+
- 使用 `lazy_static``once_cell` 进行初始化
129+
130+
## 贡献与提交约定
131+
132+
### Git 提交规范
133+
134+
遵循 Conventional Commits 规范
135+
136+
### 代码审查标准
137+
138+
**审查要点**
139+
1. 代码是否符合本规范
140+
2. 是否有充分的测试覆盖
141+
3. 文档是否完整
142+
4. 性能影响是否评估
143+
5. 错误处理是否恰当
144+
6. 安全考虑是否充分
145+
146+
**审查流程**
147+
1. 创建 Pull Request
148+
2. 至少需要一名核心维护者审查
149+
3. 所有 CI 测试必须通过
150+
4. 解决所有审查意见
151+
5. 获得批准后合并
152+
153+
### 测试要求
154+
155+
**单元测试**
156+
- Rust: 使用 `#[test]` 属性
157+
158+
**测试文件位置**
159+
- Rust 测试与源码在同一文件(使用 `#[cfg(test)]`
160+
161+
---
162+
163+
## 总结
164+
165+
本规范是 Proka Kernel 项目的开发基础。所有贡献者应:
166+
167+
1. **阅读并理解**:在编写代码前仔细阅读本规范
168+
2. **持续遵循**:在开发过程中持续检查是否符合规范
169+
3. **积极反馈**:如发现规范问题,请提出改进建议
170+
171+
规范的目的是提高代码质量、保持一致性并降低维护成本。通过共同遵守这些约定,我们可以构建一个更加健壮和可维护的内核。

docs/introduction/vision.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
# Vision
1+
# 项目愿景与特性

0 commit comments

Comments
 (0)