 尝试用RUST写教学操作系统尝试用RUST写教学操作系统 向勇、陈渝 清华大学计算机系 20181123 1 背景 • 用什么语言写操作系统? – 汇编 – C – C++ – GO – RUST – … 2 3 各位老师所教的课程信息统计 计算机组成原理 编译原理 操作系统 其他 A B C D 提交 多选题 1分 此题未设答案 此题未设答案 面临的问题 • 教学的要求 – 简洁 • 实验环境:Nachos、XV6、ucore • CPU:X86、MIPS、ARM、RISC-V • 语言:汇编、C、… – 真实 • QEMU、开发板、真实系统 – 开放 • 树莓派、Edison、FPGA 4 已有的尝试 • 用C语言写OS – MIT 6.828 – Harvard cs161 形成一组基于RustOS的操作系统课实验 https://rucore.gitbook.io/rust-os-docs/bootloader 20 后续工作 • 适合操作系统开发的语言剪裁 – 汇编 – C – Rust – … – 什么是适合内核开发的语言特征? 21 22 您认为系统软件教学应该选择什么程序设计语言? 作答 正常使用主观题需2.0以上版本雨课堂0 码力 | 23 页 | 1.53 MB | 1 年前3 尝试用RUST写教学操作系统尝试用RUST写教学操作系统 向勇、陈渝 清华大学计算机系 20181123 1 背景 • 用什么语言写操作系统? – 汇编 – C – C++ – GO – RUST – … 2 3 各位老师所教的课程信息统计 计算机组成原理 编译原理 操作系统 其他 A B C D 提交 多选题 1分 此题未设答案 此题未设答案 面临的问题 • 教学的要求 – 简洁 • 实验环境:Nachos、XV6、ucore • CPU:X86、MIPS、ARM、RISC-V • 语言:汇编、C、… – 真实 • QEMU、开发板、真实系统 – 开放 • 树莓派、Edison、FPGA 4 已有的尝试 • 用C语言写OS – MIT 6.828 – Harvard cs161 形成一组基于RustOS的操作系统课实验 https://rucore.gitbook.io/rust-os-docs/bootloader 20 后续工作 • 适合操作系统开发的语言剪裁 – 汇编 – C – Rust – … – 什么是适合内核开发的语言特征? 21 22 您认为系统软件教学应该选择什么程序设计语言? 作答 正常使用主观题需2.0以上版本雨课堂0 码力 | 23 页 | 1.53 MB | 1 年前3
 WebAssembly 简介 - 陈思衡局限于某一种语言) • 无法与现有生态配合 缺点 Async 的 Wasm 基于 fiber / ucontext Async Wasm 解决方案 wasmtime-fiber 是一个通过内联汇编,保存当前寄存 器和栈数据来实现有栈协程的 rust 库。 wasmtime-fiber Ucontext 和 fiber 功能相同,但是 linux 的系统库。 ucontext 执行流程 • 与 WASM 的语言无关。 • 可以复用 WASM 编写语言本身的生态。 • 不会对 WASM 执行产生性能损失 基于 fiber / ucontext 优点 • 实现困难,涉及到汇编。容易出错。 • 需要极其注意内存安全。 缺点 Async Wasm 解决方案 效果示例 Async Wasm 解决方案 基于 Asyncify(Binaryen) Async Wasm Photo / image / chart Asyncify 原理示意 Async Wasm 解决方案 执行流程 Async Wasm 解决方案 • 与 WASM 的语言无关。 • 与 CPU 汇编指令无关。 • 可以跨机器调度。 Asyncify(Binaryen) 优点 • 运行效率有所下降。 缺点 Async Wasm 解决方案 Asyncify 跨机器调度 Async0 码力 | 24 页 | 773.46 KB | 1 年前3 WebAssembly 简介 - 陈思衡局限于某一种语言) • 无法与现有生态配合 缺点 Async 的 Wasm 基于 fiber / ucontext Async Wasm 解决方案 wasmtime-fiber 是一个通过内联汇编,保存当前寄存 器和栈数据来实现有栈协程的 rust 库。 wasmtime-fiber Ucontext 和 fiber 功能相同,但是 linux 的系统库。 ucontext 执行流程 • 与 WASM 的语言无关。 • 可以复用 WASM 编写语言本身的生态。 • 不会对 WASM 执行产生性能损失 基于 fiber / ucontext 优点 • 实现困难,涉及到汇编。容易出错。 • 需要极其注意内存安全。 缺点 Async Wasm 解决方案 效果示例 Async Wasm 解决方案 基于 Asyncify(Binaryen) Async Wasm Photo / image / chart Asyncify 原理示意 Async Wasm 解决方案 执行流程 Async Wasm 解决方案 • 与 WASM 的语言无关。 • 与 CPU 汇编指令无关。 • 可以跨机器调度。 Asyncify(Binaryen) 优点 • 运行效率有所下降。 缺点 Async Wasm 解决方案 Asyncify 跨机器调度 Async0 码力 | 24 页 | 773.46 KB | 1 年前3
 Comprehensive Rust(简体中文) 202412264 53.1 准备使用 Rust . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 53.2 内嵌汇编 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 53.3 MMIO 的易失性内存访问 具有两个用于生成代码的主要“配置文件”:调试(进行额外运行时检查、较少优化)和发布(较 少运行时检查,进行大量优化)。可以在顶部的”Debug” 下访问这些内容。 • 如果感兴趣,您可以使用 ”...” 下的 ”ASM” 查看生成的汇编代码。 As students head into the break, encourage them to open up the playground and experiment a little panic = "abort" 进行编译,以避免出现与 eh_personality 相关的错误。 • 请注意,未提供 main 函数或任何其他入口点;您可以自行定义入口点。通常需要使用链接器脚本 和一些汇编代码进行设置工作,以便 Rust 代码能够顺利运行。 50.2 alloc 如需使用 alloc,您必须实现全局(堆)分配器。 extern crate alloc; extern crate0 码力 | 359 页 | 1.33 MB | 10 月前3 Comprehensive Rust(简体中文) 202412264 53.1 准备使用 Rust . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 53.2 内嵌汇编 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 53.3 MMIO 的易失性内存访问 具有两个用于生成代码的主要“配置文件”:调试(进行额外运行时检查、较少优化)和发布(较 少运行时检查,进行大量优化)。可以在顶部的”Debug” 下访问这些内容。 • 如果感兴趣,您可以使用 ”...” 下的 ”ASM” 查看生成的汇编代码。 As students head into the break, encourage them to open up the playground and experiment a little panic = "abort" 进行编译,以避免出现与 eh_personality 相关的错误。 • 请注意,未提供 main 函数或任何其他入口点;您可以自行定义入口点。通常需要使用链接器脚本 和一些汇编代码进行设置工作,以便 Rust 代码能够顺利运行。 50.2 alloc 如需使用 alloc,您必须实现全局(堆)分配器。 extern crate alloc; extern crate0 码力 | 359 页 | 1.33 MB | 10 月前3
 Rust 语言学习笔记M:N 模型:M 个绿色线程对应 N 个 OS 线程,这里 M 和 N 不必相同。 在当前上下文中,运行时 代表二进制文件中包含的由语言自身提供的代码。 这些代码根据语言的不同可大可小,不过任何非汇编语言都会有一定数量的运 行时代码。为此,通常人们说一个语言 “没有运行时”,一般意味着 “小运 行时”。更小的运行时拥有更少的功能不过其优势在于更小的二进制输出,这 使其易于在更多上下文中与其他语言相结合。虽然很多语言觉得增加运行时来0 码力 | 117 页 | 2.24 MB | 1 年前3 Rust 语言学习笔记M:N 模型:M 个绿色线程对应 N 个 OS 线程,这里 M 和 N 不必相同。 在当前上下文中,运行时 代表二进制文件中包含的由语言自身提供的代码。 这些代码根据语言的不同可大可小,不过任何非汇编语言都会有一定数量的运 行时代码。为此,通常人们说一个语言 “没有运行时”,一般意味着 “小运 行时”。更小的运行时拥有更少的功能不过其优势在于更小的二进制输出,这 使其易于在更多上下文中与其他语言相结合。虽然很多语言觉得增加运行时来0 码力 | 117 页 | 2.24 MB | 1 年前3
 Rust算法教程 The Algos (algorithms)栈是⼀种特殊的线性表,它只能在⼀个表的⼀个固定端进⾏数据结点的插⼊和删 除操作。栈按照后进先出的原则来存储数据,也就是说,先插⼊的数据将被压⼊栈底,最后 插⼊的数据在栈顶,读出数据时,从栈顶开始逐个读出。栈在汇编语⾔程序中,经常⽤于重 要数据的现场保护。栈中没有数据时,称为空栈。 3. 队列(Queue) 队列和栈类似,也是⼀种特殊的线性表。和栈不同的是,队列只允许在表的⼀ 端进⾏插⼊操作,⽽在另⼀端进0 码力 | 270 页 | 8.46 MB | 1 年前3 Rust算法教程 The Algos (algorithms)栈是⼀种特殊的线性表,它只能在⼀个表的⼀个固定端进⾏数据结点的插⼊和删 除操作。栈按照后进先出的原则来存储数据,也就是说,先插⼊的数据将被压⼊栈底,最后 插⼊的数据在栈顶,读出数据时,从栈顶开始逐个读出。栈在汇编语⾔程序中,经常⽤于重 要数据的现场保护。栈中没有数据时,称为空栈。 3. 队列(Queue) 队列和栈类似,也是⼀种特殊的线性表。和栈不同的是,队列只允许在表的⼀ 端进⾏插⼊操作,⽽在另⼀端进0 码力 | 270 页 | 8.46 MB | 1 年前3
 Rust 程序设计语言简体中文版qlp_shift 位。 像音频解码器这样的程序通常最看重计算的性能。这里,我们创建了一个迭代器,使用了两个 适配器,接着消费了其值。那么这段 Rust 代码将会被编译为什么样的汇编代码呢?好吧,在 编写本书的这个时候,它被编译成与手写的相同的汇编代码。遍历 coefficients 的值完全用 不到循环:Rust 知道这里会迭代 12 次,所以它“展开”(unroll)了循环。展开是一种将循环 迭代转换为重 块中,列出了我们希望能够调用的另一个语言中的外部函数的签名和名 称。"C" 部分定义了外部函数所使用的 应用二进制接口(application binary interface,ABI) —— ABI 定义了如何在汇编语言层面调用此函数。"C" ABI 是最常见的,并遵循 C 编程语言 的 ABI。 从其它语言调用 Rust 函数 也可以使用 extern 来创建一个允许其他语言调用 Rust 函数的接口。不同于创建整0 码力 | 600 页 | 12.99 MB | 1 年前3 Rust 程序设计语言简体中文版qlp_shift 位。 像音频解码器这样的程序通常最看重计算的性能。这里,我们创建了一个迭代器,使用了两个 适配器,接着消费了其值。那么这段 Rust 代码将会被编译为什么样的汇编代码呢?好吧,在 编写本书的这个时候,它被编译成与手写的相同的汇编代码。遍历 coefficients 的值完全用 不到循环:Rust 知道这里会迭代 12 次,所以它“展开”(unroll)了循环。展开是一种将循环 迭代转换为重 块中,列出了我们希望能够调用的另一个语言中的外部函数的签名和名 称。"C" 部分定义了外部函数所使用的 应用二进制接口(application binary interface,ABI) —— ABI 定义了如何在汇编语言层面调用此函数。"C" ABI 是最常见的,并遵循 C 编程语言 的 ABI。 从其它语言调用 Rust 函数 也可以使用 extern 来创建一个允许其他语言调用 Rust 函数的接口。不同于创建整0 码力 | 600 页 | 12.99 MB | 1 年前3
 Rust 程序设计语言 简体中文版 1.85.0qlp_shift 位。 像音频解码器这样的程序通常最看重计算的性能。这里,我们创建了一个迭代器,使用了两个 适配器,接着消费了其值。那么这段 Rust 代码将会被编译为什么样的汇编代码呢?好吧,在 编写本书的这个时候,它被编译成与手写的相同的汇编代码。遍历 coefficients 的值完全用 不到循环:Rust 知道这里会迭代 12 次,所以它“展开”(unroll)了循环。展开是一种将循环 迭代转换为重复 块中,我们列出了希望能够调用的另一个语言中的外部函数的签名和名 称。"C" 部分定义了外部函数所使用的 应用二进制接口(application binary interface,ABI) —— ABI 定义了如何在汇编语言层面调用此函数。"C" ABI 是最常见的,并遵循 C 编程语言的 ABI。有关 Rust 支持的所有 ABI 的信息请参见 the Rust Reference。 unsafe extern0 码力 | 562 页 | 3.23 MB | 25 天前3 Rust 程序设计语言 简体中文版 1.85.0qlp_shift 位。 像音频解码器这样的程序通常最看重计算的性能。这里,我们创建了一个迭代器,使用了两个 适配器,接着消费了其值。那么这段 Rust 代码将会被编译为什么样的汇编代码呢?好吧,在 编写本书的这个时候,它被编译成与手写的相同的汇编代码。遍历 coefficients 的值完全用 不到循环:Rust 知道这里会迭代 12 次,所以它“展开”(unroll)了循环。展开是一种将循环 迭代转换为重复 块中,我们列出了希望能够调用的另一个语言中的外部函数的签名和名 称。"C" 部分定义了外部函数所使用的 应用二进制接口(application binary interface,ABI) —— ABI 定义了如何在汇编语言层面调用此函数。"C" ABI 是最常见的,并遵循 C 编程语言的 ABI。有关 Rust 支持的所有 ABI 的信息请参见 the Rust Reference。 unsafe extern0 码力 | 562 页 | 3.23 MB | 25 天前3
共 7 条
- 1













