reL4 配置系统设计 #
1. 目标 #
实现了新版本的编译系统,纯 rust 实现 编译系统,该文档所述功能已废弃
由于去除 seL4 的编译系统,因此 seL4 基于 CMake 的配置系统同样会被去除。因此我们需要设计一个简化的、足够使用的配置系统供 reL4 使用。
目的是将所有的配置项统一管理,以适应各种 CPU 架构,各种 SoC 平台,减少增加 SoC 平台所需的工作量。主要包括以下几类配置项。
- Memory layout
- CPU 信息,主频,时钟之类 (也许不需要,dtc 中有定义)
- 一些定义在 config.rs 中的常量
编译过程中需要生成以下文件
- linker scripts
- device_gen.rs
- config.rs
- head.S, trap.S
需要说明的是,和输入的 DTC 不同,这些配置生成文件是在编译时就需要的,而不是运行时需要的
2. 文件生成 #
目前定义生成三种文件,使用一个 python 脚本,generator.py。用 rust build.rs 也可以做到,相对复杂一些,后面可能还是要使用 build.rs。
- dev_gen.rs
- linker scripts
- trap.S head.S
2.1 dev_gen.rs 生成 #
这部分非常需要讨论(当然整个配置系统的设计都需要),目前我只生成了 Memory layout,也就是 avail_p_regs。
但是我看到 seL4_common 里面有一些时钟相关的配置,我觉得这部分也应该用配置文件解决。platform 相关的代码和配置应该集中到一起,可以放在 kernel 中,也可以放在 seL4_common 中。
生成细节参考 generator.py 中 dev_gen 函数,总的来说,就是用写文件的方式将配置文件中的一些变量写到 rs 文件里。
2.2 linker scripts 生成 #
linker scripts 相对简单一些,因为相同 CPU 架构的 SoC platform 使用的 linker scripts 基本类似,有区别的就是内存布局。所以我们使用 linker 头文件 + linker scripts 的方式,绝大部分相同的定义都写在头文件里,linker scripts 中只需要对一些变量赋值即可。
头文件写法请参考 arch/riscv/linker.ld.in 和 arch/aarch64/linker.ld.in
linker scripts 中只需要定义 KERNEL_OFFSET START_ADDR 这些内存相关的变量即可,linker scripts 生成细节参考 generator.py 中的 linker_gen 函数
2.3 汇编文件生成 #
和前两个文件有点不同,汇编文件本质上和 platform 是没关系的。但是汇编文件中有很多 ifdef #define 的预编译的语句,几乎没有办法使用 rust cfg 代替,替换工作量巨大。因此还是考虑使用 gcc -E 做预编译的工作。
这样做的好处是,我们几乎可以将 seL4 中的汇编代码原封不动的迁移过来,大大减轻移植的工作量,缺点就是,我们还需要增加几个 .h 头文件,将一些相关的宏定义放进去。头文件在 kernel/include 下
汇编文件生成参考 asm_gen 函数
3. 配置项 #
目前完全是按需定义配置项,没有一个明确的设计,说实话我也不知道怎么通过配置文件完整的定义一个 SoC 平台。
现有的配置文件内容如下
# cpu arch
cpu:
arch: aarch64
freq: 10000000
# memory layout
memory:
vmem_offset: 0xffffff8000000000
pmem_start: 0x40000000
kernel_start: 0x40000000
avail_mem_zone:
- {start: 0x40000000, end: 0x80000000}
stack_bits: 12 # 2^12 4K
4. 讨论 #
- 目前还有哪些 platform 相关的配置,需要合在一起
- 目前这种配置方式是否满足 kernel 需求,有哪些需要改进的地方。现在只能做到尽量将所有配置相关代码集中到一起,方便后面优化。
- 目前还没有生成 config.rs,但是长远看,如果完全去掉 cmake 后,config.rs 也是需要生成的。这部分还没想好怎么做。