调整内容大纲,并对每篇文章细化具体内容

dev
Runji Wang 6 years ago
parent 8035062a03
commit ae2ab10378

@ -1,27 +1,32 @@
# 简明 zCore 教程
[简明 zCore 教程](README.md)
[zCore 整体结构和设计模式](zcore-intro.md)
[Fuchsia OS 和 Zircon 微内核](fuchsia.md)
[🚧 zCore 整体结构和设计模式](zcore-intro.md)
[🚧 Fuchsia OS 和 Zircon 微内核](fuchsia.md)
- [内核对象](ch01-00-object.md)
- [初识内核对象](ch01-01-kernel-object.md)
- [对象管理器Process 对象](ch01-02-process-object.md)
- [对象传送器Channel 对象](ch01-03-channel-object.md)
- [初识内核对象](ch01-01-kernel-object.md)
- [🚧 对象管理器Process 对象](ch01-02-process-object.md)
- [🚧 对象传送器Channel 对象](ch01-03-channel-object.md)
- [任务管理](ch02-00-task.md)
- [Zircon 任务管理体系](ch02-01-zircon-task.md)
- [硬件抽象层与异步运行时](ch02-02-hal-async.md)
- [线程管理Thread 对象](ch02-03-thread-object.md)
- [进程管理Process 与 Job 对象](ch02-04-process-job-object.md)
- [🚧 Zircon 任务管理体系](ch02-01-zircon-task.md)
- [🚧 进程管理Process 与 Job 对象](ch02-02-process-job-object.md)
- [🚧 线程管理Thread 对象](ch02-03-thread-object.md)
- [内存管理](ch03-00-memory.md)
- [Zircon 内存管理模型](ch03-01-zircon-memory.md)
- [物理内存VMO 对象](ch03-02-vmo.md)
- [虚拟内存VMAR 对象](ch03-03-vmar.md)
- [🚧 Zircon 内存管理模型](ch03-01-zircon-memory.md)
- [🚧 物理内存VMO 对象](ch03-02-vmo.md)
- [🚧 物理内存:按页分配的 VMO](ch03-03-vmo-paged.md)
- [🚧 虚拟内存VMAR 对象](ch03-04-vmar.md)
- [用户程序](ch04-00-userspace.md)
- [Zircon 用户程序](ch04-01-user-program.md)
- [加载 ELF 文件](ch04-02-load-elf.md)
- [上下文切换](ch04-03-context-switch.md)
- [系统调用](ch04-04-syscall.md)
- [🚧 Zircon 用户程序](ch04-01-user-program.md)
- [🚧 上下文切换](ch04-02-context-switch.md)
- [🚧 系统调用](ch04-03-syscall.md)
- [信号和等待](ch05-00-signal-and-waiting.md)
- [🚧 等待内核对象的信号](ch05-01-wait-signal.md)
- [🚧 同时等待多个信号Port 对象](ch05-02-port-object.md)
- [🚧 实现更多EventPair, Timer 对象](ch05-03-more-signal-objects.md)
- [🚧 用户态同步互斥Futex 对象](ch05-04-futex-object.md)

@ -4,4 +4,4 @@ Zircon 是一个基于内核对象的系统。系统的功能被划分到若干
作为一切的开始,本章首先构造了一个内核对象框架,作为后面实现的基础。
然后我们实现第一个内核对象 —— `Process`,它是所有对象的容器,也是将来我们操作对象的入口点。
最后会实现一个稍微复杂但是极其重要的对象 `Channel`,它是进程间通信(*IPC*)的基础设施,也是传送对象的唯一管道。
最后会实现一个稍微复杂但是极其重要的对象 `Channel`它是进程间通信IPC的基础设施也是传送对象的唯一管道。

@ -5,8 +5,20 @@
[句柄]: https://github.com/zhangpf/fuchsia-docs-zh-CN/blob/master/zircon/docs/handles.md
[权限]: https://github.com/zhangpf/fuchsia-docs-zh-CN/blob/master/zircon/docs/rights.md
> 介绍并实现 HandleRights
## 实现第一个内核对象
> 使用上一节的方法,实现一个空的 Process 对象
## 存储内核对象句柄
> 添加成员变量 handles: BTreeMap<HandleValue, Handle>
>
> 实现 createadd_handleremove_handle 函数
## 根据句柄查找内核对象
> 实现 get_object_with_rights 等其它相关函数
>
> 实现 handle 单元测试

@ -2,4 +2,10 @@
## 创建一对内核对象
> 实现 Channel::create
>
> 讲一下互相持有对方 Weak 指针的目的,这里有不可避免的 unsafe
## 实现数据传输
> 实现 read, write 函数read_write 单元测试

@ -1 +1,14 @@
# 任务管理
本章我们来实现第一类内核对象任务管理Tasks
任务对象主要包括:线程 `Thread`,进程 `Process`,作业 `Job`。以及一些辅助性的对象,例如负责暂停任务执行的 `SuspendToken` 和负责处理异常的 `Exception`
为了能够真实表现线程对象的行为,我们使用 Rust async 运行时 [`async_std`] 中的**用户态协程**来模拟**内核线程**。
这样就可以在用户态的单元测试中检验实现的正确性。
考虑到未来这个 OS 会跑在裸机环境中,将会有不同的内核线程的实现,我们创建一个特殊的**硬件抽象层Hardware Abstraction LayerHAL**,来屏蔽底层平台的差异,对上提供一个统一的接口。
这个 HAL 的接口未来会根据需要进行扩充。
本章中我们只会实现运行一个程序所必需的最小功能子集,剩下的部分则留到跑起用户程序之后再按需实现。
[`async_std`]: https://docs.rs/async-std/1.6.2/async_std/index.html

@ -1 +0,0 @@
# 硬件抽象层与异步运行时

@ -0,0 +1,11 @@
# 进程管理Process 与 Job 对象
## Process 与 Job
> 介绍 Process 与 Job 的整体设计
>
> 实现 Process 和 Job 对象的基本框架,支持树状结构
## Job Policy 策略
> 实现 JobPolicy

@ -1 +1,23 @@
# 线程管理Thread 对象
## 线程状态
> 状态转移:创建 -> 运行 -> 暂停 -> 退出,最好有个状态机的图
>
> 实现 ThreadState最好能加一个单元测试来验证转移过程
## 线程寄存器上下文
> 定义 ThreadState实现 read_statewrite_state
## Async 运行时和 HAL 硬件抽象层
> 简单介绍 async-std 的异步机制
>
> 介绍 HAL 的实现方法:弱链接
>
> 实现 hal_thread_spawn
## 线程启动
> 将 HAL 接入 Thread::start编写单元测试验证能启动多线程

@ -1 +0,0 @@
# 进程管理Process 与 Job 对象

@ -1 +1,25 @@
# 物理内存VMO 对象
## VMO 简介
> 根据文档梳理 VMO 的主要特性
## 实现 VMO 对象框架
> 实现 VmObject 结构,其中定义 VmObjectTrait 接口,并提供三个具体实现 Paged, Physical, Slice
## HAL用文件模拟物理内存
> 初步介绍 mmap引出用文件模拟物理内存的思想
>
> 创建文件并用 mmap 线性映射到进程地址空间
>
> 实现 pmem_read, pmem_write
## 实现物理内存 VMO
> 用 HAL 实现 VmObjectPhysical 的方法,并做单元测试
## 实现切片 VMO
> 实现 VmObjectSlice并做单元测试

@ -1 +0,0 @@
# 虚拟内存VMAR 对象

@ -0,0 +1,24 @@
# 物理内存:按页分配的 VMO
## 简介
> 说明一下Zircon 的官方实现中为了高效支持写时复制,使用了复杂精巧的树状数据结构,但它同时也引入了复杂性和各种 Bug。
> 我们在这里只实现一个简单版本,完整实现留给读者自行探索。
>
> 介绍 commit 操作的意义和作用
## HAL物理内存管理
> 在 HAL 中实现 PhysFrame 和最简单的分配器
## 辅助结构BlockRange 迭代器
> 实现 BlockRange
## 实现按页分配的 VMO
> 实现 for_each_page, commit, read, write 函数
## VMO 复制
> 实现 create_child 函数

@ -0,0 +1,17 @@
# 虚拟内存VMAR 对象
## VMAR 简介
## 实现 VMAR 对象框架
> 定义 VmAddressRangeVmMapping
>
> 实现 create_child, map, unmap, destroy 函数,并做单元测试验证地址空间分配
## HAL用 mmap 模拟页表
> 实现页表接口 map, unmap, protect
## 实现内存映射
> 用 HAL 实现上面 VMAR 留空的部分,并做单元测试验证内存映射

@ -1 +1,37 @@
# Zircon 用户程序
## 用户态启动流程
> kernel -> userboot -> bootsvc -> component_manager -> sh / device_manager
>
> ZBI 与 bootfsZBI 中包含初始文件系统 bootfs内核将 ZBI 完整传递给 userboot由它负责解析并对其它进程提供文件服务
## 用户程序的组成
> 内核不直接参与用户程序的加载工作(第一个进程除外)
>
> 用户程序强制使用 PIC 和 PIE位置无关代码
>
> 内存地址空间组成Program, Stack, vDSO, Dylibs
>
> 通过 Channel 传递启动信息和句柄
## 加载 ELF 文件
> 简单介绍 ELF 文件的组成结构
>
> 实现 VmarExt::load_from_elf 函数
## 系统调用的跳板vDSO
> 介绍 vDSO 的作用
>
> 如何修改 vDSO 源码libzircon将 syscall 改为函数调用
>
> 加载 vDSO 时修改 vDSO 代码段,填入跳转地址
## 第一个用户程序userboot
> 实现 zircon-loader 中的 run_userboot 函数
>
> 能够进入用户态并在第一个系统调用时跳转回来

@ -0,0 +1,29 @@
# 上下文切换
> 本节介绍 trapframe-rs 中 [fncall.rs] 的魔法实现
[fncall.rs]: https://github.com/rcore-os/trapframe-rs/blob/master/src/arch/x86_64/fncall.rs
## 保存和恢复通用寄存器
> 定义 UserContext 结构体
>
> 保存 callee-saved 寄存器到栈上,恢复 UserContext 寄存器,进入用户态,反之亦然
## 找回内核上下文:线程局部存储 与 FS 寄存器
> 在用户程序跳转回内核代码的那一刻,如何在不破坏用户寄存器的情况下切换回内核栈?
>
> 进入用户态前,将内核栈指针保存在内核 glibc 的 TLS 区域中。为此我们需要查看 glibc 源码,找到一个空闲位置。
>
> Linux 和 macOS 下如何分别通过系统调用设置 fsbase / gsbase
## 测试
> 编写单元测试验证上述过程
## macOS 的麻烦:动态二进制修改
> 由于 macOS 用户程序无法修改 fs 寄存器,当运行相关指令时会访问非法内存地址触发段错误。
>
> 我们需要实现段错误信号处理函数,并在其中动态修改用户程序指令,将 fs 改为 gs。

@ -1 +0,0 @@
# 加载 ELF 文件

@ -0,0 +1,13 @@
# 系统调用
## 获取系统调用参数
> 从寄存器中获取参数
## 系统调用上下文与处理函数
> 定义 Syscall 结构体,实现 syscall 函数
## 实现第一个系统调用
> 实现 sys_channel_read 和 sys_debuglog_write

@ -1 +0,0 @@
# 系统调用

@ -0,0 +1,17 @@
# 等待内核对象的信号
## 信号与等待机制简介
## 在内核对象中加入信号
> 定义 Signal 结构体
>
> 在 KObjectBase 中加入 signal 和 callbacks 变量,实现 signal 系列函数,并做单元测试
## 实现信号等待 Future
> 实现 wait_signal 函数,并做单元测试
## 利用 select 组合子实现多对象等待
> 实现 wait_signal_many 函数,并做单元测试

@ -0,0 +1,13 @@
# 同时等待多个信号Port 对象
## Port 对象简介
> 同时提及一下 Linux 的 epoll 机制作为对比
## 实现 Port 对象框架
> 定义 Port 和 PortPacket 结构体
## 实现事件推送和等待
> 实现 KernelObject::send_signal_to_port 和 Port::wait 函数,并做单元测试

@ -0,0 +1,11 @@
# 实现更多EventPair, Timer 对象
## Event 对象
## EventPair 对象
## HAL定时器
> 实现 timer_now, timer_set在此基础上实现 SleepFuture
## Timer 对象

@ -0,0 +1,15 @@
# 用户态同步互斥Futex 对象
## Futex 机制简介
> Futex 是现代 OS 中用户态同步互斥的唯一底层设施
>
> 为什么快:利用共享内存中的原子变量,避免进入内核
## 实现基础元语wait 和 wake
> 实现 wait 和 wake 函数,并做单元测试
## 实现高级操作
> 实现 Zircon 中定义的复杂 API
Loading…
Cancel
Save