@ -91,7 +91,7 @@
< nav id = "sidebar" class = "sidebar" aria-label = "Table of contents" >
< div class = "sidebar-scrollbox" >
< ol class = "chapter" > < li class = "chapter-item expanded affix " > < a href = "index.html" > 简明 zCore 教程< / a > < / li > < li class = "chapter-item expanded affix " > < a href = "zcore-intro.html" > zCore 整体结构和设计模式< / a > < / li > < li class = "chapter-item expanded affix " > < a href = "fuchsia.html" > Fuchsia OS 和 Zircon 微内核< / a > < / li > < li class = "chapter-item expanded " > < a href = "ch01-00-object.html" > < strong aria-hidden = "true" > 1.< / strong > 内核对象< / a > < / li > < li > < ol class = "section" > < li class = "chapter-item expanded " > < a href = "ch01-01-kernel-object.html" > < strong aria-hidden = "true" > 1.1.< / strong > 初识内核对象< / a > < / li > < li class = "chapter-item expanded " > < a href = "ch01-02-process-object.html" > < strong aria-hidden = "true" > 1.2.< / strong > 对象管理器: Process 对象< / a > < / li > < li class = "chapter-item expanded " > < a href = "ch01-03-channel-object.html" > < strong aria-hidden = "true" > 1.3.< / strong > 对象传送器: Channel 对象< / a > < / li > < / ol > < / li > < li class = "chapter-item expanded " > < a href = "ch02-00-task.html" > < strong aria-hidden = "true" > 2.< / strong > 任务管理< / a > < / li > < li > < ol class = "section" > < li class = "chapter-item expanded " > < a href = "ch02-01-zircon-task.html" > < strong aria-hidden = "true" > 2.1.< / strong > Zircon 任务管理体系< / a > < / li > < li class = "chapter-item expanded " > < a href = "ch02-02- hal-async .html"> < strong aria-hidden = "true" > 2.2.< / strong > 硬件抽象层与异步运行时 < / a > < / li > < li class = "chapter-item expanded " > < a href = "ch02-03-thread-object.html" > < strong aria-hidden = "true" > 2.3.< / strong > 线程管理: Thread 对象< / a > < / li > < li class = "chapter-item expanded " > < a href = "ch0 2-04-process-job-object .html"> < strong aria-hidden = "true" > 2.4.< / strong > 进程管理: Process 与 Job 对象< / a > < / li > < / ol > < / li > < li class = "chapter-item expanded " > < a href = "ch0 3-00-memory .html"> < strong aria-hidden = "true" > 3.< / strong > 内存管理 < / a > < / li > < li > < ol class = "section" > < li class = "chapter-item expanded " > < a href = "ch0 3-01-zircon-memory .html"> < strong aria-hidden = "true" > 3.1.< / strong > Zircon 内存管理模型 < / a > < / li > < li class = "chapter-item expanded " > < a href = "ch0 3-02-vmo .html"> < strong aria-hidden = "true" > 3.2.< / strong > 物理内存: VMO 对象 < / a > < / li > < li class = "chapter-item expanded " > < a href = "ch0 3-03-vmar .html"> < strong aria-hidden = "true" > 3.3.< / strong > 虚拟内存: VMAR 对象 < / a > < / li > < / ol > < / li > < li class = "chapter-item expanded " > < a href = "ch0 4-00-userspace .html"> < strong aria-hidden = "true" > 4.< / strong > 用户程序 < / a > < / li > < li > < ol class = "section" > < li class = "chapter-item expanded " > < a href = "ch0 4-01-user-program .html"> < strong aria-hidden = "true" > 4.1.< / strong > Zircon 用户程序 < / a > < / li > < li class = "chapter-item expanded " > < a href = "ch0 4-02-load-elf .html"> < strong aria-hidden = "true" > 4.2.< / strong > 加载 ELF 文件 < / a > < / li > < li class = "chapter-item expanded " > < a href = "ch0 4-03-context-switch .html"> < strong aria-hidden = "true" > 4.3.< / strong > 上下文切换 < / a > < / li > < li class = "chapter-item expanded " > < a href = "ch0 4-04-syscall .html"> < strong aria-hidden = "true" > 4.4.< / strong > 系统调用 < / a > < / li > < / ol > < / li > < / ol >
< ol class = "chapter" > < li class = "chapter-item expanded affix " > < a href = "index.html" > 简明 zCore 教程< / a > < / li > < li class = "chapter-item expanded affix " > < a href = "zcore-intro.html" > 🚧 zCore 整体结构和设计模式< / a > < / li > < li class = "chapter-item expanded affix " > < a href = "fuchsia.html" > 🚧 Fuchsia OS 和 Zircon 微内核< / a > < / li > < li class = "chapter-item expanded " > < a href = "ch01-00-object.html" > < strong aria-hidden = "true" > 1.< / strong > 内核对象< / a > < / li > < li > < ol class = "section" > < li class = "chapter-item expanded " > < a href = "ch01-01-kernel-object.html" > < strong aria-hidden = "true" > 1.1.< / strong > ✅ 初识内核对象< / a > < / li > < li class = "chapter-item expanded " > < a href = "ch01-02-process-object.html" > < strong aria-hidden = "true" > 1.2.< / strong > 🚧 对象管理器: Process 对象< / a > < / li > < li class = "chapter-item expanded " > < a href = "ch01-03-channel-object.html" > < strong aria-hidden = "true" > 1.3.< / strong > 🚧 对象传送器: Channel 对象< / a > < / li > < / ol > < / li > < li class = "chapter-item expanded " > < a href = "ch02-00-task.html" > < strong aria-hidden = "true" > 2.< / strong > 任务管理< / a > < / li > < li > < ol class = "section" > < li class = "chapter-item expanded " > < a href = "ch02-01-zircon-task.html" > < strong aria-hidden = "true" > 2.1.< / strong > 🚧 Zircon 任务管理体系< / a > < / li > < li class = "chapter-item expanded " > < a href = "ch02-02- process-job-object .html"> < strong aria-hidden = "true" > 2.2.< / strong > 🚧 进程管理: Process 与 Job 对象 < / a > < / li > < li class = "chapter-item expanded " > < a href = "ch02-03-thread-object.html" > < strong aria-hidden = "true" > 2.3.< / strong > 🚧 线程管理: Thread 对象< / a > < / li > < / ol > < / li > < li class = "chapter-item expanded " > < a href = "ch0 3-00-memory.html"> < strong aria-hidden = "true" > 3.< / strong > 内存管理< / a > < / li > < li > < ol class = "section" > < li class = "chapter-item expanded " > < a href = "ch03-01-zircon-memory.html" > < strong aria-hidden = "true" > 3.1.< / strong > 🚧 Zircon 内存管理模型< / a > < / li > < li class = "chapter-item expanded " > < a href = "ch03-02-vmo .html"> < strong aria-hidden = "true" > 3.2.< / strong > 🚧 物理内存: VMO 对象< / a > < / li > < li class = "chapter-item expanded " > < a href = "ch03-03-vmo-paged.html" > < strong aria-hidden = "true" > 3.3.< / strong > 🚧 物理内存:按页分配的 VMO< / a > < / li > < li class = "chapter-item expanded " > < a href = "ch03-04-vmar.html" > < strong aria-hidden = "true" > 3.4.< / strong > 🚧 虚拟内存: VMAR 对象< / a > < / li > < / ol > < / li > < li class = "chapter-item expanded " > < a href = "ch0 4-00-userspace .html"> < strong aria-hidden = "true" > 4.< / strong > 用户程序 < / a > < / li > < li > < ol class = "section" > < li class = "chapter-item expanded " > < a href = "ch0 4-01-user-program .html"> < strong aria-hidden = "true" > 4.1.< / strong > 🚧 Zircon 用户程序 < / a > < / li > < li class = "chapter-item expanded " > < a href = "ch0 4-02-context-switch .html"> < strong aria-hidden = "true" > 4.2.< / strong > 🚧 上下文切换 < / a > < / li > < li class = "chapter-item expanded " > < a href = "ch0 4-03-syscall .html"> < strong aria-hidden = "true" > 4.3.< / strong > 🚧 系统调用 < / a > < / li > < / ol > < / li > < li class = "chapter-item expanded " > < a href = "ch0 5-00-signal-and-waiting .html"> < strong aria-hidden = "true" > 5.< / strong > 信号和等待 < / a > < / li > < li > < ol class = "section" > < li class = "chapter-item expanded " > < a href = "ch0 5-01-wait-signal .html"> < strong aria-hidden = "true" > 5.1.< / strong > 🚧 等待内核对象的信号 < / a > < / li > < li class = "chapter-item expanded " > < a href = "ch0 5-02-port-object .html"> < strong aria-hidden = "true" > 5.2.< / strong > 🚧 同时等待多个信号: Port 对象 < / a > < / li > < li class = "chapter-item expanded " > < a href = "ch0 5-03-more-signal-objects .html"> < strong aria-hidden = "true" > 5.3.< / strong > 🚧 实现更多: EventPair, Timer 对象 < / a > < / li > < li class = "chapter-item expanded " > < a href = "ch0 5-04-futex-object .html"> < strong aria-hidden = "true" > 5.4.< / strong > 🚧 用户态同步互斥: Futex 对象 < / a > < / li > < / ol > < / li > < / ol >
< / div >
< div id = "sidebar-resize-handle" class = "sidebar-resize-handle" > < / div >
< / nav >
@ -200,7 +200,7 @@
< p > Zircon 是一个基于内核对象的系统。系统的功能被划分到若干组内核对象中。< / p >
< p > 作为一切的开始,本章首先构造了一个内核对象框架,作为后面实现的基础。
然后我们实现第一个内核对象 —— < code > Process< / code > ,它是所有对象的容器,也是将来我们操作对象的入口点。
最后会实现一个稍微复杂但是极其重要的对象 < code > Channel< / code > ,它是进程间通信(< em > IPC< / em > )的基础设施,也是传送对象的唯一管道。< / p >
最后会实现一个稍微复杂但是极其重要的对象 < code > Channel< / code > , 它是进程间通信( IPC) 的基础设施, 也是传送对象的唯一管道。< / p >
< h1 > < a class = "header" href = "#初识内核对象" id = "初识内核对象" > 初识内核对象< / a > < / h1 >
< h2 > < a class = "header" href = "#内核对象简介" id = "内核对象简介" > 内核对象简介< / a > < / h2 >
< p > 在动手编写我们的代码之前,需要首先进行调研和学习,对目标对象有一个全面系统的了解。
@ -596,26 +596,253 @@ pub struct DummyObject;
< p > 在下一节中,我们将介绍内核对象相关的另外两个概念:句柄和权限,并实现内核对象的存储和访问。< / p >
< h1 > < a class = "header" href = "#对象管理器process-对象" id = "对象管理器process-对象" > 对象管理器: Process 对象< / a > < / h1 >
< h2 > < a class = "header" href = "#句柄和权限" id = "句柄和权限" > 句柄和权限< / a > < / h2 >
< blockquote >
< p > 介绍并实现 Handle, Rights< / p >
< / blockquote >
< h2 > < a class = "header" href = "#实现第一个内核对象" id = "实现第一个内核对象" > 实现第一个内核对象< / a > < / h2 >
< blockquote >
< p > 使用上一节的方法,实现一个空的 Process 对象< / p >
< / blockquote >
< h2 > < a class = "header" href = "#存储内核对象句柄" id = "存储内核对象句柄" > 存储内核对象句柄< / a > < / h2 >
< blockquote >
< p > 添加成员变量 handles: BTreeMap< HandleValue, Handle> < / p >
< p > 实现 create, add_handle, remove_handle 函数< / p >
< / blockquote >
< h2 > < a class = "header" href = "#根据句柄查找内核对象" id = "根据句柄查找内核对象" > 根据句柄查找内核对象< / a > < / h2 >
< blockquote >
< p > 实现 get_object_with_rights 等其它相关函数< / p >
< p > 实现 handle 单元测试< / p >
< / blockquote >
< h1 > < a class = "header" href = "#对象传送器channel-对象" id = "对象传送器channel-对象" > 对象传送器: Channel 对象< / a > < / h1 >
< h2 > < a class = "header" href = "#创建一对内核对象" id = "创建一对内核对象" > 创建一对内核对象< / a > < / h2 >
< blockquote >
< p > 实现 Channel::create< / p >
< p > 讲一下互相持有对方 Weak 指针的目的,这里有不可避免的 unsafe< / p >
< / blockquote >
< h2 > < a class = "header" href = "#实现数据传输" id = "实现数据传输" > 实现数据传输< / a > < / h2 >
< blockquote >
< p > 实现 read, write 函数, read_write 单元测试< / p >
< / blockquote >
< h1 > < a class = "header" href = "#任务管理" id = "任务管理" > 任务管理< / a > < / h1 >
< p > 本章我们来实现第一类内核对象: 任务管理( Tasks) 。< / p >
< p > 任务对象主要包括:线程 < code > Thread< / code > ,进程 < code > Process< / code > ,作业 < code > Job< / code > 。以及一些辅助性的对象,例如负责暂停任务执行的 < code > SuspendToken< / code > 和负责处理异常的 < code > Exception< / code > 。< / p >
< p > 为了能够真实表现线程对象的行为,我们使用 Rust async 运行时 < a href = "https://docs.rs/async-std/1.6.2/async_std/index.html" > < code > async_std< / code > < / a > 中的< strong > 用户态协程< / strong > 来模拟< strong > 内核线程< / strong > 。
这样就可以在用户态的单元测试中检验实现的正确性。
考虑到未来这个 OS 会跑在裸机环境中,将会有不同的内核线程的实现,我们创建一个特殊的< strong > 硬件抽象层( Hardware Abstraction Layer, HAL) < / strong > ,来屏蔽底层平台的差异,对上提供一个统一的接口。
这个 HAL 的接口未来会根据需要进行扩充。< / p >
< p > 本章中我们只会实现运行一个程序所必需的最小功能子集,剩下的部分则留到跑起用户程序之后再按需实现。< / p >
< h1 > < a class = "header" href = "#zircon-任务管理体系" id = "zircon-任务管理体系" > Zircon 任务管理体系< / a > < / h1 >
< h1 > < a class = "header" href = "#硬件抽象层与异步运行时" id = "硬件抽象层与异步运行时" > 硬件抽象层与异步运行时< / a > < / h1 >
< h1 > < a class = "header" href = "#线程管理thread-对象" id = "线程管理thread-对象" > 线程管理: Thread 对象< / a > < / h1 >
< h1 > < a class = "header" href = "#进程管理process-与-job-对象" id = "进程管理process-与-job-对象" > 进程管理: Process 与 Job 对象< / a > < / h1 >
< h2 > < a class = "header" href = "#process-与-job" id = "process-与-job" > Process 与 Job< / a > < / h2 >
< blockquote >
< p > 介绍 Process 与 Job 的整体设计< / p >
< p > 实现 Process 和 Job 对象的基本框架,支持树状结构< / p >
< / blockquote >
< h2 > < a class = "header" href = "#job-policy-策略" id = "job-policy-策略" > Job Policy 策略< / a > < / h2 >
< blockquote >
< p > 实现 JobPolicy< / p >
< / blockquote >
< h1 > < a class = "header" href = "#线程管理thread-对象" id = "线程管理thread-对象" > 线程管理: Thread 对象< / a > < / h1 >
< h2 > < a class = "header" href = "#线程状态" id = "线程状态" > 线程状态< / a > < / h2 >
< blockquote >
< p > 状态转移:创建 -> 运行 -> 暂停 -> 退出,最好有个状态机的图< / p >
< p > 实现 ThreadState, 最好能加一个单元测试来验证转移过程< / p >
< / blockquote >
< h2 > < a class = "header" href = "#线程寄存器上下文" id = "线程寄存器上下文" > 线程寄存器上下文< / a > < / h2 >
< blockquote >
< p > 定义 ThreadState, 实现 read_state, write_state< / p >
< / blockquote >
< h2 > < a class = "header" href = "#async-运行时和-hal-硬件抽象层" id = "async-运行时和-hal-硬件抽象层" > Async 运行时和 HAL 硬件抽象层< / a > < / h2 >
< blockquote >
< p > 简单介绍 async-std 的异步机制< / p >
< p > 介绍 HAL 的实现方法:弱链接< / p >
< p > 实现 hal_thread_spawn< / p >
< / blockquote >
< h2 > < a class = "header" href = "#线程启动" id = "线程启动" > 线程启动< / a > < / h2 >
< blockquote >
< p > 将 HAL 接入 Thread::start, 编写单元测试验证能启动多线程< / p >
< / blockquote >
< h1 > < a class = "header" href = "#内存管理" id = "内存管理" > 内存管理< / a > < / h1 >
< h1 > < a class = "header" href = "#zircon-内存管理模型" id = "zircon-内存管理模型" > Zircon 内存管理模型< / a > < / h1 >
< h1 > < a class = "header" href = "#物理内存vmo-对象" id = "物理内存vmo-对象" > 物理内存: VMO 对象< / a > < / h1 >
< h2 > < a class = "header" href = "#vmo-简介" id = "vmo-简介" > VMO 简介< / a > < / h2 >
< blockquote >
< p > 根据文档梳理 VMO 的主要特性< / p >
< / blockquote >
< h2 > < a class = "header" href = "#实现-vmo-对象框架" id = "实现-vmo-对象框架" > 实现 VMO 对象框架< / a > < / h2 >
< blockquote >
< p > 实现 VmObject 结构,其中定义 VmObjectTrait 接口,并提供三个具体实现 Paged, Physical, Slice< / p >
< / blockquote >
< h2 > < a class = "header" href = "#hal用文件模拟物理内存" id = "hal用文件模拟物理内存" > HAL: 用文件模拟物理内存< / a > < / h2 >
< blockquote >
< p > 初步介绍 mmap, 引出用文件模拟物理内存的思想< / p >
< p > 创建文件并用 mmap 线性映射到进程地址空间< / p >
< p > 实现 pmem_read, pmem_write< / p >
< / blockquote >
< h2 > < a class = "header" href = "#实现物理内存-vmo" id = "实现物理内存-vmo" > 实现物理内存 VMO< / a > < / h2 >
< blockquote >
< p > 用 HAL 实现 VmObjectPhysical 的方法,并做单元测试< / p >
< / blockquote >
< h2 > < a class = "header" href = "#实现切片-vmo" id = "实现切片-vmo" > 实现切片 VMO< / a > < / h2 >
< blockquote >
< p > 实现 VmObjectSlice, 并做单元测试< / p >
< / blockquote >
< h1 > < a class = "header" href = "#物理内存按页分配的-vmo" id = "物理内存按页分配的-vmo" > 物理内存:按页分配的 VMO< / a > < / h1 >
< h2 > < a class = "header" href = "#简介" id = "简介" > 简介< / a > < / h2 >
< blockquote >
< p > 说明一下: Zircon 的官方实现中为了高效支持写时复制,使用了复杂精巧的树状数据结构,但它同时也引入了复杂性和各种 Bug。
我们在这里只实现一个简单版本,完整实现留给读者自行探索。< / p >
< p > 介绍 commit 操作的意义和作用< / p >
< / blockquote >
< h2 > < a class = "header" href = "#hal物理内存管理" id = "hal物理内存管理" > HAL: 物理内存管理< / a > < / h2 >
< blockquote >
< p > 在 HAL 中实现 PhysFrame 和最简单的分配器< / p >
< / blockquote >
< h2 > < a class = "header" href = "#辅助结构blockrange-迭代器" id = "辅助结构blockrange-迭代器" > 辅助结构: BlockRange 迭代器< / a > < / h2 >
< blockquote >
< p > 实现 BlockRange< / p >
< / blockquote >
< h2 > < a class = "header" href = "#实现按页分配的-vmo" id = "实现按页分配的-vmo" > 实现按页分配的 VMO< / a > < / h2 >
< blockquote >
< p > 实现 for_each_page, commit, read, write 函数< / p >
< / blockquote >
< h2 > < a class = "header" href = "#vmo-复制" id = "vmo-复制" > VMO 复制< / a > < / h2 >
< blockquote >
< p > 实现 create_child 函数< / p >
< / blockquote >
< h1 > < a class = "header" href = "#虚拟内存vmar-对象" id = "虚拟内存vmar-对象" > 虚拟内存: VMAR 对象< / a > < / h1 >
< h2 > < a class = "header" href = "#vmar-简介" id = "vmar-简介" > VMAR 简介< / a > < / h2 >
< h2 > < a class = "header" href = "#实现-vmar-对象框架" id = "实现-vmar-对象框架" > 实现 VMAR 对象框架< / a > < / h2 >
< blockquote >
< p > 定义 VmAddressRange, VmMapping< / p >
< p > 实现 create_child, map, unmap, destroy 函数,并做单元测试验证地址空间分配< / p >
< / blockquote >
< h2 > < a class = "header" href = "#hal用-mmap-模拟页表" id = "hal用-mmap-模拟页表" > HAL: 用 mmap 模拟页表< / a > < / h2 >
< blockquote >
< p > 实现页表接口 map, unmap, protect< / p >
< / blockquote >
< h2 > < a class = "header" href = "#实现内存映射" id = "实现内存映射" > 实现内存映射< / a > < / h2 >
< blockquote >
< p > 用 HAL 实现上面 VMAR 留空的部分,并做单元测试验证内存映射< / p >
< / blockquote >
< h1 > < a class = "header" href = "#用户程序" id = "用户程序" > 用户程序< / a > < / h1 >
< h1 > < a class = "header" href = "#zircon-用户程序" id = "zircon-用户程序" > Zircon 用户程序< / a > < / h1 >
< h1 > < a class = "header" href = "#加载-elf-文件" id = "加载-elf-文件" > 加载 ELF 文件< / a > < / h1 >
< h2 > < a class = "header" href = "#用户态启动流程" id = "用户态启动流程" > 用户态启动流程< / a > < / h2 >
< blockquote >
< p > kernel -> userboot -> bootsvc -> component_manager -> sh / device_manager< / p >
< p > ZBI 与 bootfs: ZBI 中包含初始文件系统 bootfs, 内核将 ZBI 完整传递给 userboot, 由它负责解析并对其它进程提供文件服务< / p >
< / blockquote >
< h2 > < a class = "header" href = "#用户程序的组成" id = "用户程序的组成" > 用户程序的组成< / a > < / h2 >
< blockquote >
< p > 内核不直接参与用户程序的加载工作(第一个进程除外)< / p >
< p > 用户程序强制使用 PIC 和 PIE( 位置无关代码) < / p >
< p > 内存地址空间组成: Program, Stack, vDSO, Dylibs< / p >
< p > 通过 Channel 传递启动信息和句柄< / p >
< / blockquote >
< h2 > < a class = "header" href = "#加载-elf-文件" id = "加载-elf-文件" > 加载 ELF 文件< / a > < / h2 >
< blockquote >
< p > 简单介绍 ELF 文件的组成结构< / p >
< p > 实现 VmarExt::load_from_elf 函数< / p >
< / blockquote >
< h2 > < a class = "header" href = "#系统调用的跳板vdso" id = "系统调用的跳板vdso" > 系统调用的跳板: vDSO< / a > < / h2 >
< blockquote >
< p > 介绍 vDSO 的作用< / p >
< p > 如何修改 vDSO 源码( libzircon) 将 syscall 改为函数调用< / p >
< p > 加载 vDSO 时修改 vDSO 代码段,填入跳转地址< / p >
< / blockquote >
< h2 > < a class = "header" href = "#第一个用户程序userboot" id = "第一个用户程序userboot" > 第一个用户程序: userboot< / a > < / h2 >
< blockquote >
< p > 实现 zircon-loader 中的 run_userboot 函数< / p >
< p > 能够进入用户态并在第一个系统调用时跳转回来< / p >
< / blockquote >
< h1 > < a class = "header" href = "#上下文切换" id = "上下文切换" > 上下文切换< / a > < / h1 >
< blockquote >
< p > 本节介绍 trapframe-rs 中 < a href = "https://github.com/rcore-os/trapframe-rs/blob/master/src/arch/x86_64/fncall.rs" > fncall.rs< / a > 的魔法实现< / p >
< / blockquote >
< h2 > < a class = "header" href = "#保存和恢复通用寄存器" id = "保存和恢复通用寄存器" > 保存和恢复通用寄存器< / a > < / h2 >
< blockquote >
< p > 定义 UserContext 结构体< / p >
< p > 保存 callee-saved 寄存器到栈上,恢复 UserContext 寄存器,进入用户态,反之亦然< / p >
< / blockquote >
< h2 > < a class = "header" href = "#找回内核上下文线程局部存储-与-fs-寄存器" id = "找回内核上下文线程局部存储-与-fs-寄存器" > 找回内核上下文:线程局部存储 与 FS 寄存器< / a > < / h2 >
< blockquote >
< p > 在用户程序跳转回内核代码的那一刻,如何在不破坏用户寄存器的情况下切换回内核栈?< / p >
< p > 进入用户态前,将内核栈指针保存在内核 glibc 的 TLS 区域中。为此我们需要查看 glibc 源码,找到一个空闲位置。< / p >
< p > Linux 和 macOS 下如何分别通过系统调用设置 fsbase / gsbase< / p >
< / blockquote >
< h2 > < a class = "header" href = "#测试" id = "测试" > 测试< / a > < / h2 >
< blockquote >
< p > 编写单元测试验证上述过程< / p >
< / blockquote >
< h2 > < a class = "header" href = "#macos-的麻烦动态二进制修改" id = "macos-的麻烦动态二进制修改" > macOS 的麻烦:动态二进制修改< / a > < / h2 >
< blockquote >
< p > 由于 macOS 用户程序无法修改 fs 寄存器,当运行相关指令时会访问非法内存地址触发段错误。< / p >
< p > 我们需要实现段错误信号处理函数,并在其中动态修改用户程序指令,将 fs 改为 gs。< / p >
< / blockquote >
< h1 > < a class = "header" href = "#系统调用" id = "系统调用" > 系统调用< / a > < / h1 >
< h2 > < a class = "header" href = "#获取系统调用参数" id = "获取系统调用参数" > 获取系统调用参数< / a > < / h2 >
< blockquote >
< p > 从寄存器中获取参数< / p >
< / blockquote >
< h2 > < a class = "header" href = "#系统调用上下文与处理函数" id = "系统调用上下文与处理函数" > 系统调用上下文与处理函数< / a > < / h2 >
< blockquote >
< p > 定义 Syscall 结构体,实现 syscall 函数< / p >
< / blockquote >
< h2 > < a class = "header" href = "#实现第一个系统调用" id = "实现第一个系统调用" > 实现第一个系统调用< / a > < / h2 >
< blockquote >
< p > 实现 sys_channel_read 和 sys_debuglog_write< / p >
< / blockquote >
< h1 > < a class = "header" href = "#信号和等待" id = "信号和等待" > 信号和等待< / a > < / h1 >
< h1 > < a class = "header" href = "#等待内核对象的信号" id = "等待内核对象的信号" > 等待内核对象的信号< / a > < / h1 >
< h2 > < a class = "header" href = "#信号与等待机制简介" id = "信号与等待机制简介" > 信号与等待机制简介< / a > < / h2 >
< h2 > < a class = "header" href = "#在内核对象中加入信号" id = "在内核对象中加入信号" > 在内核对象中加入信号< / a > < / h2 >
< blockquote >
< p > 定义 Signal 结构体< / p >
< p > 在 KObjectBase 中加入 signal 和 callbacks 变量,实现 signal 系列函数,并做单元测试< / p >
< / blockquote >
< h2 > < a class = "header" href = "#实现信号等待-future" id = "实现信号等待-future" > 实现信号等待 Future< / a > < / h2 >
< blockquote >
< p > 实现 wait_signal 函数,并做单元测试< / p >
< / blockquote >
< h2 > < a class = "header" href = "#利用-select-组合子实现多对象等待" id = "利用-select-组合子实现多对象等待" > 利用 select 组合子实现多对象等待< / a > < / h2 >
< blockquote >
< p > 实现 wait_signal_many 函数,并做单元测试< / p >
< / blockquote >
< h1 > < a class = "header" href = "#同时等待多个信号port-对象" id = "同时等待多个信号port-对象" > 同时等待多个信号: Port 对象< / a > < / h1 >
< h2 > < a class = "header" href = "#port-对象简介" id = "port-对象简介" > Port 对象简介< / a > < / h2 >
< blockquote >
< p > 同时提及一下 Linux 的 epoll 机制作为对比< / p >
< / blockquote >
< h2 > < a class = "header" href = "#实现-port-对象框架" id = "实现-port-对象框架" > 实现 Port 对象框架< / a > < / h2 >
< blockquote >
< p > 定义 Port 和 PortPacket 结构体< / p >
< / blockquote >
< h2 > < a class = "header" href = "#实现事件推送和等待" id = "实现事件推送和等待" > 实现事件推送和等待< / a > < / h2 >
< blockquote >
< p > 实现 KernelObject::send_signal_to_port 和 Port::wait 函数,并做单元测试< / p >
< / blockquote >
< h1 > < a class = "header" href = "#实现更多eventpair-timer-对象" id = "实现更多eventpair-timer-对象" > 实现更多: EventPair, Timer 对象< / a > < / h1 >
< h2 > < a class = "header" href = "#event-对象" id = "event-对象" > Event 对象< / a > < / h2 >
< h2 > < a class = "header" href = "#eventpair-对象" id = "eventpair-对象" > EventPair 对象< / a > < / h2 >
< h2 > < a class = "header" href = "#hal定时器" id = "hal定时器" > HAL: 定时器< / a > < / h2 >
< blockquote >
< p > 实现 timer_now, timer_set, 在此基础上实现 SleepFuture< / p >
< / blockquote >
< h2 > < a class = "header" href = "#timer-对象" id = "timer-对象" > Timer 对象< / a > < / h2 >
< h1 > < a class = "header" href = "#用户态同步互斥futex-对象" id = "用户态同步互斥futex-对象" > 用户态同步互斥: Futex 对象< / a > < / h1 >
< h2 > < a class = "header" href = "#futex-机制简介" id = "futex-机制简介" > Futex 机制简介< / a > < / h2 >
< blockquote >
< p > Futex 是现代 OS 中用户态同步互斥的唯一底层设施< / p >
< p > 为什么快:利用共享内存中的原子变量,避免进入内核< / p >
< / blockquote >
< h2 > < a class = "header" href = "#实现基础元语wait-和-wake" id = "实现基础元语wait-和-wake" > 实现基础元语: wait 和 wake< / a > < / h2 >
< blockquote >
< p > 实现 wait 和 wake 函数,并做单元测试< / p >
< / blockquote >
< h2 > < a class = "header" href = "#实现高级操作" id = "实现高级操作" > 实现高级操作< / a > < / h2 >
< blockquote >
< p > 实现 Zircon 中定义的复杂 API< / p >
< / blockquote >
< / main >