完成首页、内核对象一开始的内容。建立空项目。

dev
Runji Wang 6 years ago
parent 623d927c6b
commit 526901c2c4

@ -0,0 +1,18 @@
# 简明 zCore 教程
## 自己动手山寨操作系统:自顶向下方法
zCore 是用 Rust 语言重写的 Zircon 微内核,它是 Google 正在开发的 Fuchsia OS 中的底层内核。
本教程基于 zCore 的真实开发历史,还原其开发过程。带领读者一步一步用 Rust 实现自己的 Zircon 内核,最终能够运行原生的 shell 程序。
在此过程中我们将体会 Zircon 微内核的设计理念,感受如何用 Rust 语言以一种现代的方式编写系统软件,在项目中实现理论与实践的融合。
与传统操作系统开发不同的是zCore 使用一种自顶向下的方法:首先基于宿主系统已有的功能,在用户态实现一个能够工作的 libOS然后再逐步替换底层实现
"移植"回裸机环境中运行。因此我们更关注系统的整体设计,从高层视角看待 OS 如何为用户提供服务,而不纠结于底层硬件细节。
鉴于此,本教程假设读者了解操作系统基本概念和原理,具有常用的 Linux 系统使用经验,并且会使用 Rust 语言编写简单程序。
如果读者不熟悉操作系统和 Rust 语言,希望以自底向上方法从零构建操作系统,[rCore Tutorial] 可能是更好的选择。
如果你准备好了,让我们开始吧!
[rCore Tutorial]: https://rcore-os.github.io/rCore-Tutorial-deploy/

@ -1,6 +1,6 @@
# 简明 zCore 教程
[简明 zCore 教程](title-page.md)
[简明 zCore 教程](README.md)
[zCore 整体结构和设计模式](zcore-intro.md)
[Fuchsia OS 和 Zircon 微内核](fuchsia.md)

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

@ -1,5 +1,65 @@
# 初识内核对象
## 内核对象简介
TODO
详细内容可参考 Fuchsia 官方文档:[内核对象][句柄][权限]。
在这一节中我们将在 Rust 中实现以上三个概念。
[内核对象]: https://github.com/zhangpf/fuchsia-docs-zh-CN/blob/master/zircon/docs/objects.md
[句柄]: 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
## 建立项目
首先我们需要安装 Rust 工具链。在 Linux 或 macOS 系统下,只需要用一个命令下载安装 rustup 即可:
```sh
$ curl https://sh.rustup.rs -sSf | sh
```
具体安装方法可以参考[官方文档]。
[官方文档]: https://kaisery.github.io/trpl-zh-cn/ch01-01-installation.html
接下来我们用 cargo 创建一个 Rust 库项目:
```sh
$ cargo new --lib zcore
$ cd zcore
```
我们将在这个 crate 中实现所有的内核对象以库lib而不是可执行文件bin的形式组织代码后面我们会依赖单元测试保证代码的正确性。
由于我们会用到一些不稳定unstable的语言特性需要使用 nightly 版本的工具链。在项目根目录下创建一个 `rust-toolchain` 文件,指明使用的工具链版本:
```sh
{{#include ../../zcore/rust-toolchain}}
```
这个程序库目前是在你的 Linux 或 macOS 上运行,但有朝一日它会成为一个真正的 OS 在裸机上运行。
为此我们需要移除对标准库的依赖,使其成为一个不依赖当前 OS 功能的库。在 `lib.rs` 的第一行添加一个声明:
```rust,no_run,noplaypen
#![no_std]
```
现在我们可以尝试运行一下自带的单元测试,编译器可能会自动下载并安装工具链:
```sh
$ cargo test
...
Finished test [unoptimized + debuginfo] target(s) in 0.52s
Running target/debug/deps/zcore-dc6d43637bc5df7a
running 1 test
test tests::it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
```
## 实现 KernelObject 接口
## 句柄 Handle

@ -1,3 +0,0 @@
# 简明 zCore 教程
自己动手编写操作系统:自顶向下方法

2
zcore/.gitignore vendored

@ -0,0 +1,2 @@
target
Cargo.lock

@ -0,0 +1,9 @@
[package]
name = "zcore"
version = "0.1.0"
authors = ["Runji Wang <wangrunji0408@163.com>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

@ -0,0 +1 @@
nightly-2020-06-04

@ -0,0 +1,9 @@
#![no_std]
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
assert_eq!(2 + 2, 4);
}
}
Loading…
Cancel
Save