Giter Site home page Giter Site logo

wavix's Introduction

Primary repo: https://github.com/WAVM/Wavix

License

Overview

Wavix is a POSIX system that uses WebAssembly's Software Fault Isolation to run the complete system in a single host OS process.

Components

  • WAVM is the sister project of Wavix, and provides a browser-independent WebAssembly runtime.
  • Clang is a C/C++ compiler that targets WebAssembly. It depends on LLVM as its backend, and compiler-rt as a runtime library for various features.
  • LLD is the LLVM project's linker that supports linking the WebAssembly object files produced by LLVM's WebAssembly backend.
  • musl is a C standard library implementation for Linux. Currently, the Wavix "kernel" in WAVM emulates the Linux syscalls made by musl.
  • libcxx and libcxxabi are the LLVM project's implementation of the C++ standard library.
  • bash and coreutils are the GNU project's famous shell, and a core set of tools that complement it (think ls, cp, chmod, etc).

Bootstrapping

Bootstrapping Wavix will build the compiler (Clang, LLVM, and LLD) with your host compiler, then compile the runtime libraries (compiler-rt, musl, libcxx+libcxxabi), bash, and coreutils with the resulting compiler.

To bootstrap Wavix, I use Ubuntu 18.04 running on the Windows Subsystem for Linux. I originally used Ubuntu 16.04, and AFAIK that will still work.

  • You need these packages (and maybe more): sudo apt install build-essential gcc g++ ninja-build python

  • Clone this repository. You can clone it wherever you want, but for purposes of these instructions, I'll refer to the directory containing the source as ~/Wavix.

  • To bootstrap, make a directory somewhere for the build. You can call it whatever you want, but for purposes of these instructions, I'll call it ~/wavix-build.

  • From the ~/wavix-build directory, run python ~/Wavix/bootstrap/build.py. It will probably take a while to complete.

  • Upon successful completion, the ~/wavix-build/host directory will contain the host toolchain. The ~/wavix-build/sys directory will contain the bootstrapped Wavix system: Wavix binaries for bash+coreutils, the Wavix libraries for compiler-rt, libc, and libc++, and the headers for the same. To compile a C++ file to a Wavix binary, you can run ~/wavix-build/host/bin/clang++ -target wasm32-unknown-wavix --sysroot ~/wavix-build/sys a.cpp.

The bootstrap process will also work on Windows (without the Windows Subsystem for Linux) to compile the compiler, runtime libraries, and WAVM, but not to compile bash+coreutils.

Bootstrapping with Docker

The bootstrapping process can also be done with Docker. From the project root:

# Build the container
docker build -t wavix .

# Open a shell inside the container
docker run -it wavix /bin/bash

# Run the wavix bash binary
/build/host/bin/wavix --sysroot /build/sys /build/sys/bin/bash

Running Wavix

To run a Wavix binary, use the command ~/wavix-build/host/bin/wavix --sysroot ~/wavix-build/sys <binary>.

For example: ~/wavix-build/host/bin/wavix --sysroot ~/wavix-build/sys ~/wavix-build/sys/bin/bash

Status

The toolchain is mostly functional, thanks to the effort of the WebAssembly group on LLVM/LLD.

The Wavix runtime implements enough syscalls for bash to start, but not enough to do anything interesting with it.

Subtrees

This repository integrates many other repos as subdirectories using the git subtree feature. This allows making atomics commits that modify our version of all repos, but still tracks the relationship between those subdirectories and their upstream repos. To pull changes from the upstream repos, use these commands:

  • git subtree pull --squash --prefix clang https://llvm.org/git/clang.git master
  • git subtree pull --squash --prefix compiler-rt https://llvm.org/git/compiler-rt.git master
  • git subtree pull --squash --prefix libcxx https://llvm.org/git/libcxx.git master
  • git subtree pull --squash --prefix libcxxabi https://llvm.org/git/libcxxabi.git master
  • git subtree pull --squash --prefix lld https://llvm.org/git/lld.git master
  • git subtree pull --squash --prefix llvm https://llvm.org/git/llvm.git master
  • git subtree pull --squash --prefix musl https://github.com/jfbastien/musl wasm-prototype-1
  • git subtree pull --squash --prefix WAVM https://github.com/WAVM/WAVM master

wavix's People

Contributors

andrewscheidecker avatar shillaker avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.