Tutorial for rCore OS step by step (3rd edition)

Overview

rCore-Tutorial V3(开发中)

Actions Status

本教学仓库是继 rCore_tutorial V2 后重构的 V3 版本。

本文档的目标主要针对「做实验的同学」,我们会对每章结束后提供完成的代码,你的练习题只需要基于我们给出的版本上增量实现即可,不需要重新按照教程写一遍。

而对想完整实现一个 rCore 的同学来说,我们的文档可能不太友好。因为在编写教程过程中,我们需要对清晰和全面做很多的权衡和考虑、需要省略掉大量 Rust 语法层面和 OS 无关的代码以带来更好的可读性和精简性,所以想参考本文档并完整实现的同学可能不会有从头复制到尾的流畅(这样的做法也不是学习的初衷),可能需要自己有一些完整的认识和思考。

另外,如果你觉得字体大小和样式不舒服,可以通过 GitBook 上方的按钮调节。

仓库目录

  • docs/:教学实验指导分实验内容和开发规范
  • notes/:开题报告和若干讨论
  • os/:操作系统代码
  • user/:用户态代码
  • SUMMARY.md:GitBook 目录页
  • book.json:GitBook 配置文件
  • rust-toolchain:限定 Rust 工具链版本
  • deploy.sh:自动部署脚本

实验指导

基于 GitBook,目前已经部署到了 GitHub Pages 上面。

文档本地使用方法

npm install -g gitbook-cli
gitbook install
gitbook serve

代码

操作系统代码

本项目基于 cargo 和 make 等工具,在根目录通过 make run 命令即可运行代码,更具体的细节请参见 Makefileos/Makefile 以及 user/Makefile

参考和感谢

本文档和代码部分参考了:

在此对仓库的开发和维护者表示感谢,同时也感谢很多在本项目开发中一起讨论和勘误的老师和同学们。

Comments
  • 关于与之前版本不同的线程切换过程

    关于与之前版本不同的线程切换过程

    @jiegec @wyfcyx @wangrunji0408 @LyricZhao @xy-plus

    之前在重构教程时,本着简洁性的目的,在抄 V2 教程时修改了线程切换的过程,现在看会对内核结构有一定影响。这里说明一下情况,询问大家意见。

    • 旧方法(V2)
      • 中断时保存 Trap Frame,然后用一个类似于协程 yield 的方式保存上下文并切换到 idle thread。之后 idle 进行线程调度并上下文切换到另一个线程,这个线程再执行原先 yield 之后的内容,即 restore Trap Frame。
      • 中断时,用户线程各自设有内核栈,内核线程直接使用自己的栈
    • 新方法(V3)
      • 中断时保存 Trap Frame,在中断处理中直接进行线程调度,然后加载另一个线程的 Trap Frame。
      • 中断时,所有用户线程公用一个内核栈(因为不会在一个用户线程中断处理完成前启动另一个用户线程),内核线程使用自己的栈

    一个显著的区别在于,V2 中会有内核线程来处理调度,而 V3 中则没有(在教程最后状态,不运行任何内核线程)。

    如果要在 V3 的系统上继续开发,我认为可能会涉及更多在中断时进行的任务(比如系统调用),而不怎么会用到内核线程。内核线程如果需要进行一些高权限操作,可能需要进行系统调用或者暂时关闭中断。

    不过我不清楚在多核上会出现什么情况?zCore(我只粗略看了一下)好像统一了 Trap Frame 和 Context,但是切换线程还是要分两层来切换,这样做是不是有什么优势我没有注意到(比如之后实现 async)?

    关于以前提到过的内核线程 bug

    目前的代码存在一个小 bug(但不难解决),即一个内核线程在中断调度的时候,把 Trap Frame 放在了线程自己的栈上,此时如果切换其他线程会先切换页表,然后找不到栈 PageFault。
    (如果是用户线程发生中断,中断处理就会用公用的内核栈,它是在所有线程页表中的,所以不会有问题)

    它的解决思路其实很简单,就是让内核线程也使用公用的内核栈。(如果大家觉得以 V3 的新思路进行下去没有问题我就这么修)

    bug help wanted question 
    opened by Tuyixiang 12
  • 关于所有权问题的一些理解,欢迎大家指正。

    关于所有权问题的一些理解,欢迎大家指正。

    rust函数中临时申请的数据要么存放在堆中要么存放在栈中,诸如i32,u32,&str等数据存放在栈中,因为他们自身容量较小,且size固定。而另一类可变size的数据,如Vec,String等类型的数据,由于其大小不固定,时刻需要因为长度变化而由操作系统重新分配内存,所以具体信息存放在堆中,只在栈中存储起始指针,长度的“胖指针”。当堆中数据需要被函数调用或者被赋值的时候,由于直接clone堆中信息代价太大,rust倾向于让新变量指向原本存储信息的地址,然而rust本身是一种变量离开作用域便会自动free的语言,两个指向同一个地址的指针会造成内存不安全,因此赋值或者函数调用会造成堆上变量的所有权转移。解决方式有两种,第一种,采用深度复制的方法,使得新获取的变量虽然与原变量内容相同,但是其实是指向其他地址的一个copy。另一种方式,利用&符号来进行借用,表示新变量只是借用了原变量的所有权,并无权释放,而一个变量无论是出借了value所有权还是本身所有权就是从别处借来的,他都无法再向别人出借所有权。不知自己对这块的理解是否有所偏差,欢迎指正!

    learning 
    opened by xushanpu123 7
  • Symbol format `elf64-littleriscv' unknown.

    Symbol format `elf64-littleriscv' unknown.

    涉及文件

    rCore-Tutorial/os/target/riscv64imac-unknown-none-elf/debug/os

    相关段落

    GDB 调试方法* 在 GDB 中执行 file target/riscv64imac-unknown-none-elf/debug/os 来加载未被 strip 过的内核文件中的各种符号

    遇到问题

    gdb中执行加载符号时出现错误: I'm sorry, Dave, I can't do that. Symbol format `elf64-littleriscv' unknown.

    操作系统:macOS Catalina 10.15.7 (19H15) 软件版本: riscv64-unknown-elf-gdb: GNU gdb (GDB) 10.1 --host=x86_64-apple-darwin19.6.0 --target=riscv64-unknown-elf qemu-system-riscv64: QEMU emulator version 5.1.0

    Big Sur也有此问题,但虚拟机中的Ubuntu 20.04是好的

    bug 
    opened by em2046 6
  • lab 2中关于堆上内存回收的一个问题

    lab 2中关于堆上内存回收的一个问题

    lab 2中关于堆上内存回收的一个问题

    大致描述问题

    “在堆上的内存回收出现行为不一致”

    在进行lab 2的时候,我对堆上的内存回收机制进行了调试,在如下代码

    let mut vec = Vec::new();
    for i in 0..100 {
        vec.push(i);
    }
    

    输出了符合预期的结果 图片 内存正常地申请回收了

    可是当主函数执行到物理页分配部分的代码时

    for _ in 0..2 {
            let frame_0 = match memory::frame::FRAME_ALLOCATOR.lock().alloc() {
                Result::Ok(frame_tracker) => frame_tracker,
                Result::Err(err) => panic!("{}", err),
            };
            let frame_1 = match memory::frame::FRAME_ALLOCATOR.lock().alloc() {
                Result::Ok(frame_tracker) => frame_tracker,
                Result::Err(err) => panic!("{}", err),
            };
            println!("{} and {}", frame_0.address(), frame_1.address());
    }
    panic!("end of rust_main");
    

    输出的结果如下 图片

    这里发生的内存分配和回收是由于在使用栈结构实现分配器的时候,用到了Vec,带来了动态的内存分配,但是让我疑惑的是,对于第一种情况下,Vec申请的内存最终都被回收了,而第二种情况下可以看到StackedAllocator中的Vec申请的一块大小为64的内存还没来得及回收,主函数就退出了,为什么这两种情况下Vec内存回收的机制不一样,希望有人能解答我的这个疑问,感谢。

    learning 
    opened by RINNE-TAN 5
  • 关于lab2实验题的堆的递归定义

    关于lab2实验题的堆的递归定义

    关于lab2实验题的堆的递归定义

    题目链接:https://rcore-os.github.io/rCore-Tutorial-deploy/docs/lab-2/practice.html

    题面:

    图片

    这个地方用“循环”这个词似乎不太准确。。用递归定义是否会更好?

    以及,这样执行一段时间以后是否会爆栈?

    learning 
    opened by stellarkey 5
  • 关于Lab2和Lab3中内存分配的一些问题

    关于Lab2和Lab3中内存分配的一些问题

    关于Lab2和Lab3中内存分配的一些问题

    Lab2和Lab3中实现的内存分配好像每次只能分配一页?

    下面是分配器代码:

    /// 使用栈结构实现分配器
    ///
    /// 在 `Vec` 末尾进行加入 / 删除。
    /// 每个元素 tuple `(start, end)` 表示 [start, end) 区间为可用。
    pub struct StackedAllocator {
        list: Vec<(usize, usize)>,
    }
    
    impl Allocator for StackedAllocator {
        fn new(capacity: usize) -> Self {
            Self {
                list: vec![(0, capacity)],
            }
        }
    
        fn alloc(&mut self) -> Option<usize> {
            if let Some((start, end)) = self.list.pop() {
                if end - start > 1 {
                    self.list.push((start + 1, end));
                }
                Some(start)
            } else {
                None
            }
        }
    
        fn dealloc(&mut self, index: usize) {
            self.list.push((index, index + 1));
        }
    }
    

    从这个分配器代码看来每次分配只能获得一页内存。
    但为什么不实现一次性分配一定大小的内存呢?是因为没必要,还是在rCore-Tutorial里面没实现呢?

    上面这个分配器算法实现好像有点问题?

    在上面代码中可以看到,每次从 list 中 pop 出一个 (start, end) ,如果 end - start > 1 就从这个对中分配出一个 (start, start + 1),(start + 1, end)入栈。这是 alloc 的做法。
    再来看看 dealloc 的做法:回收内存 (index, index + 1), 把 (index, index + 1) 进栈。
    结合 alloc 的实现我有一个疑问:那这样进栈的 (index, index + 1) 岂不是不能再被分配出去了?因为 index + 1 -index = 1 不符合 end - start > 1 的条件,实现中也没有任何方法让它和剩余的元素合并。这样这个 (index, index + 1) 不是就一直无法被重新分配了吗?

    learning 
    opened by SKTT1Ryze 5
  • 关于 Lab2 动态内存分配 一节中思考题的探讨

    关于 Lab2 动态内存分配 一节中思考题的探讨

    思考:动态分配的内存地址在哪个范围里?

    Lab2 动态内存分配

    参考答案

    .bss 段中,因为我们用来存放动态分配的这段是一个静态的没有初始化的数组,算是内核代码的一部分。

    个人理解

    动态分配的内存应该在堆中吧,而且在“调整内存布局”一节中关于.bss段及Heap段的解释为:

    .bss 段:存放被初始化为 0 的可读写数据,与 .data 段的不同之处在于我们知道它要被初始化为 0,因此在可执行文件中只需记录这个段的大小以及所在位置即可,而不用记录里面的数据,也不会实际占用二进制文件的空间

    Heap:堆,用来支持程序运行过程中内存的动态分配,比如说你要读进来一个字符串,在你写程序的时候你也不知道它的长度究竟为多少,于是你只能在运行过程中,知道了字符串的长度之后,再在堆中给这个字符串分配内存

    在Lab2这一节的代码中,有一段

        let v = Box::new(5);
    

    我用gdb调试输出,也可以看到该变量的位置是在堆空间以上的:

    (gdb) print v
    $1 = (*mut i32) 0x80a1c960 <os::memory::heap::HEAP_SPACE+8388600>
    

    其它变量可以用gdb输出,但无法看到在内存中的位置

    而且我在维基百科上查到:

    在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。.bss section 的空间结构类似于 stack

    结合以上,我认为 .bss 段是存放全局静态变量的

    所以为什么参考答案说动态分配的内存在 .bss 段中呢?

    参考文献

    learning 
    opened by wfly1998 5
  • lab1:part4 文档中汇编代码太长

    lab1:part4 文档中汇编代码太长

    欢迎提出任何问题

    涉及文件

    docs/lab-1/guide/part-4.md

    相关段落

    文中的代码片段 os/src/interrupt.asm

    遇到问题

    太长了。建议采用asm macro等方式,精简代码;如果不能精简代码,可以精简文档中的代码片段 比如:

     SAVE    x3, 3 
     ....
     SAVE    x31, 31
    
    documentation 
    opened by chyyuu 5
  • 关于实验一的一些思考

    关于实验一的一些思考

    关于实验一的一些思考

    在分析 Lab1 的代码过程中,遇到一些问题,其中包括在源码中注释的思考题,和我本人对实验代码提出的一些疑问。希望同学们能指出错误,并且给出建议。

    思考题1

    思考:sscratch的值最初是在什么地方写入的?
    sscratch的作用:
    在核(hart)运行用户态代码的时候,sscratch用来保存一个指向内核态上下文的指针。在trap handler的开始部分,sscratch和一个用户寄存器交换值来提供一个initial working register
    因此本人猜测sscratch的值最初是开机启动后操作系统运行第一个用户态程序的时候写入的。(不确定)

    思考题2

    思考:a0是在哪里被赋值的?(有两种情况)

    • 在进入函数handle_interrupt之前的参数准备阶段被赋值;
    • handle_interrupt返回时作为返回参数被赋值。

    思考题3

    思考:为什么不恢复scausestval?如果不恢复,为什么之前要保存?
    本人认为scausestval不需要恢复,之前也没有保存。
    从这两个寄存器的作用出发思考,scause指示发生异常的种类,而stval保存了trap的附加信息:出错的地址或者非法指令本身。因此这两个寄存器只在中断出现的时候派上用场,在一般情况下不影响程序的运行,而保存上下文的目的就是要保证中断处理完之后回到原来中断的地方程序能继续运行,从这个角度来看就不必保存这两个寄存器。而又回到之前为什么scausestval包含在数据结构Context中的问题,既然不需要保存,自然就不需要放在Context里面了。

    对实验代码的疑问

    在恢复上下文过程中,有这样一条指令:
    os/src/interrupt/interrupt.asm

    mv      sp, a0
    

    这是从handle_interrupt 中的返回值a0中读取sp,而a0 同时也是作为调用参数传入到handle_interrupt中的。
    疑问是:这样的实现方法不是会有风险吗?
    因为后面无论是恢复 CRSs 还是恢复通用寄存器,都与sp的值相关,如果返回值不对,或者说在handle_interrupt中修改了a0的值,那么后面的恢复上下文过程就无法正确执行,导致系统崩溃。在x86架构中的函数调用机制使用了一种栈帧结构,本人觉得与实验代码的恢复sp的机制相比,栈帧结构更为完全。
    另外,在实验代码有这么一行注释:

    // 返回的 Context 必须位于内核栈顶
    

    也就是说这里返回的指针必须指向内核栈的栈顶。
    这不正反映了这个机制的不稳定性吗。
    欢迎同学们参与讨论。

    learning 
    opened by SKTT1Ryze 5
  • 如何用 RISC-V 汇编打印字符

    如何用 RISC-V 汇编打印字符

    RISC-V汇编如何在屏幕输出字符串

    大致描述问题

    如下汇编代码如何正确输出字符串hello world?

    代码

    .section .text
    .global _start
    _start:
        lui     a1, %hi(msg)
        addi    a1,a1,%lo(msg)
        #jalr   ra,puts
        call puts
    2:  j       2b
    
    .section .rodata
    msg:
        .string "hello world\n"
    
    learning 
    opened by shiweiwww 5
  • 关于lab2 线段树分配器的DEBUG问题

    关于lab2 线段树分配器的DEBUG问题

    如题,写完以后虽然可以通过编译并运行,但是,如何验证Allocator的正确性呢?

    println! 宏因为禁用 std 而不能使用,对这一个 Allocator 进行单独的测试可行吗?Rust 是否支持类似 Java 一样的单个文件的测试(每个 Java 文件都是一个类,可以单独定义 main 函数并调试运行)?

    大家都是怎么测试的?只能在整个项目的 main.rs 里面测试吗?

    learning 
    opened by stellarkey 4
  • cargo install cargo-binutils failed

    cargo install cargo-binutils failed

    欢迎提出任何问题

    环境

    • rustc 1.62.0-nightly
    • wsl2 Ubuntu 20.04

    遇到问题

    安装环境时,cargo install cargo-binutils 失败。
    安装依赖clap v2.34.0时,提示:

    error[E0658]: `if` is not allowed in a `const fn`
      --> /home/ruiqurm/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/clap-2.34.0/src/app/settings.rs:7:1
       |
    7  | / bitflags! {
    8  | |     struct Flags: u64 {
    9  | |         const SC_NEGATE_REQS       = 1;
    10 | |         const SC_REQUIRED          = 1 << 1;
    ...  |
    51 | |     }
    52 | | }
       | |_^
       |
       = note: see issue #49146 <https://github.com/rust-lang/rust/issues/49146> for more information
       = help: add `#![feature(const_if_match)]` to the crate attributes to enable
       = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
    
    error[E0658]: `if` is not allowed in a `const fn`
      --> /home/ruiqurm/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/clap-2.34.0/src/args/settings.rs:6:1
       |
    6  | / bitflags! {
    7  | |     struct Flags: u32 {
    8  | |         const REQUIRED         = 1;
    9  | |         const MULTIPLE         = 1 << 1;
    ...  |
    28 | |     }
    29 | | }
       | |_^
       |
       = note: see issue #49146 <https://github.com/rust-lang/rust/issues/49146> for more information
       = help: add `#![feature(const_if_match)]` to the crate attributes to enable
       = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
    
       Compiling addr2line v0.17.0
       Compiling regex v1.5.5
    error: aborting due to 2 previous errors
    
    For more information about this error, try `rustc --explain E0658`.
    error: could not compile `clap`.
    

    尝试添加标志-Z minimal-versions : cargo install cargo-binutils -Z minimal-versions
    在编译backtrace v0.3.5处失败:

    Compiling backtrace v0.3.5
    error[E0425]: cannot find value `RTLD_LAZY` in crate `libc`
      --> /home/ruiqurm/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.5/src/dylib.rs:30:70
       |
    30 |         let ptr = libc::dlopen(name.as_ptr() as *const c_char, libc::RTLD_LAZY);
       |                                                                      ^^^^^^^^^ not found in `libc`
    
    error: aborting due to previous error
    
    For more information about this error, try `rustc --explain E0425`.
    error: could not compile `backtrace`.
    

    (可能的)解决方案

    切换nightly到stable:

    rustup override set stable
    
    bug 
    opened by ruiqurm 1
  • 实验一中构建裸机运行时执行环境一节gdb的选择问题

    实验一中构建裸机运行时执行环境一节gdb的选择问题

    opened by Carolmelon 3
  • Rustlings error6.rs

    Rustlings error6.rs

    寻求一下rustlings error_handling 部分的error6.rs的解答思路 (Rustings好像这一部分有变化,有的版本可能没有error6) 题目链接:
    https://github.com/rust-lang/rustlings/blob/main/exercises/error_handling/errors6.rs

    learning 
    opened by HaiQiu1998 4
  • 为什么 riscv64gc 上汇编代码中无法使用 mul 指令

    为什么 riscv64gc 上汇编代码中无法使用 mul 指令

    我们的实现中,我们的 target 设置为了 riscv64gc-unknown-none-elf ,这应该是包含了 RISCV 的 M 扩展的 (riscv64gc = RV64IMAFDC ISA)。

    然而在 entry.asm 中使用 mul 指令时报错:

    WeChat Image_20210706002844

    删除图中 mul 行后不会报错,且能正常运行第一章的实现。

    learning 
    opened by Shuumatsu 2
Owner
rCore OS
THU Rust operating system workshop. (mirror: https://gitee.com/rcore-os)
rCore OS
RCore-Tutorial-v3 - Let's write an OS which can run on RISC-V in Rust from zero!

rCore-Tutorial-v3 rCore-Tutorial version 3.5. See the Documentation in Chinese. Official QQ group number: 735045051 news 2021.11.20: Now we are updati

rCore OS 786 Jan 2, 2023
Tutorial for rCore OS step by step (2nd edition)

rCore_tutorial WARNING This project is no longer maintained, please try Tutorial v3.5. Documentations Please read https://rcore-os.github.io/rCore_tut

rCore OS 135 Nov 7, 2022
A comprehensive and FREE Online Rust hacking tutorial utilizing the x64, ARM64 and ARM32 architectures going step-by-step into the world of reverse engineering Rust from scratch.

FREE Reverse Engineering Self-Study Course HERE Hacking Rust A comprehensive and FREE Online Rust hacking tutorial utilizing the x64, ARM64 and ARM32

Kevin Thomas 98 Jun 21, 2023
Rust crate to implement a counterpart to the PBRT book's (3rd edition) C++ code.

Rust crate to implement a counterpart to the PBRT book's (3rd edition) C++ code.

Jan Walter 763 Dec 27, 2022
RCore-Tutorial-v3 - Let's write an OS which can run on RISC-V in Rust from zero!

rCore-Tutorial-v3 rCore-Tutorial version 3.5. See the Documentation in Chinese. Official QQ group number: 735045051 news 2021.11.20: Now we are updati

rCore OS 786 Jan 2, 2023
A Minecraft Java Edition to Bedrock Edition resource pack convertor in Rust

j2be A Minecraft Java Edition to Bedrock Edition resource pack convertor in Rust How to use Note: This project is still in development Run cargo build

Cqdet 11 Sep 15, 2021
Easy c̵̰͠r̵̛̠ö̴̪s̶̩̒s̵̭̀-t̶̲͝h̶̯̚r̵̺͐e̷̖̽ḁ̴̍d̶̖̔ ȓ̵͙ė̶͎ḟ̴͙e̸̖͛r̶̖͗ë̶̱́ṉ̵̒ĉ̷̥e̷͚̍ s̷̹͌h̷̲̉a̵̭͋r̷̫̊ḭ̵̊n̷̬͂g̵̦̃ f̶̻̊ơ̵̜ṟ̸̈́ R̵̞̋ù̵̺s̷̖̅ţ̸͗!̸̼͋

Rust S̵̓i̸̓n̵̉ I̴n̴f̶e̸r̵n̷a̴l mutability! Howdy, friendly Rust developer! Ever had a value get m̵̯̅ð̶͊v̴̮̾ê̴̼͘d away right under your nose just when

null 294 Dec 23, 2022
R1cs-tutorial - Tutorial for writing constraints in the `arkworks` framework

Introduction to SNARK Development with `arkworks` In this tutorial, we will learn how to write applications for use with state-of-the-art zkSNARKs usi

arkworks 113 Dec 29, 2022
3rd person shooter in the very early development phase

Station Iapetus Description: 3rd person shooter in the very early development phase. This is commercial project that will eventually be released in St

Dmitry Stepanov 242 Jan 1, 2023
An easy file system based on eazy-fs of rcore.

fs-rs An easy mixed index file system based on eazy-fs of rcore. Usage if you don't have rust environment, you can download rust by: curl https://sh.r

Clstilmldy 9 Dec 21, 2022
Angolmois BMS player, Rust edition

Angolmois Rust Edition This is a direct, one-to-one translation of Angolmois to Rust programming language. Angolmois is a BM98-like minimalistic music

Kang Seonghoon 95 Oct 20, 2022
Eclipse Corrosion - Rust edition in Eclipse IDE

Eclipse Corrosion Rust edition and debug in Eclipse IDE Corrosion is a Rust development plugin for the Eclipse IDE, providing a rich edition experienc

Eclipse Foundation 194 Dec 23, 2022
Reviving the Research Edition Unix speak command

This repository contains the source code of Unix speak program that appeared in the Third (1973) to Sixth (1975) Research Unix editions, slightly adjusted to run on a modern computer. Details on the code's provenance and the methods employed for reviving it can be found in this blog post.

Diomidis Spinellis 31 Jul 27, 2022
Code and Development environment for adventofcode.com - 2021 edition

aoc-2021 Warning Spoiler Alert! If you want to solve the aoc problems on your own, do not read any further. This repository contains solutions for the

docToolchain 11 Oct 22, 2022
My solutions for the 2021 edition of the Advent of Code, using Rust and SOM (Simple Object Machine)

Advent of Code 2021 These are my solutions for the 2021 edition of the Advent of Code. The solutions are all implemented using both Rust and SOM (Simp

Nicolas Polomack 1 Dec 23, 2021
CosmWasm implementation for limited edition, fixed-price NFTs

CW721 Editions This contract enables the creation of limited edition fixed price NFTs according to the cw721 token standard. Instantiation To instanti

Vernon Johnson 4 Oct 5, 2022
This repository contains the Rust source code for the algorithms in the textbook Algorithms, 4th Edition

Overview This repository contains the Rust source code for the algorithms in the textbook Algorithms, 4th Edition by Robert Sedgewick and Kevin Wayne.

chuan 549 Dec 26, 2022
Wasmcraft a compiler from WebAssembly to Minecraft Java Edition datapacks

Wasmcraft is a compiler from WebAssembly to Minecraft Java Edition datapacks. Since WebAssembly is a well-supported target for many languages, this means that you can run code written in e.g. C in Minecraft.

null 64 Dec 23, 2022
The Polkadot Hackathon Global Series North America edition is the second in a series of hackathons that brings the cutting edge of blockchain to a global community.

Polkadot Hackathon Project We are translating Uniswap v2 to Ink. Dependencies Install cargo-contract for building Ink contracts: cargo install dylint-

Kristiyan Dilov 3 Jun 28, 2022
Code and Development environment for adventofcode.com - 2022 edition

aoc-2022 Warning Spoiler Alert! If you want to solve the aoc problems on your own, do not read any further. This repository contains solutions for the

docToolchain 8 Dec 26, 2022