NRE is supposed to be the successor of NUL (NOVA UserLand). It has the goal to be much simpler and cleaner than NUL, because NUL is quite complicated and difficult to maintain. This is achieved by providing easy-to-use abstractions, using C++ exception handling and the well known pattern RAII. Another important difference to NUL is that each service (typically a component that would be a single or a group of host-drivers in NUL) runs in its own protection domain to make it more reliable and reduce the dependencies between them. Additionally, the architecture x86_64 (besides x86_32) is supported from the beginning.
Please take the following steps:
download.sh <arch>
, where <arch>
is either x86_32
or x86_64
.
It will download the compiler into /opt/nre-cross-<arch>
. There are only
precompiled versions for certain host platforms, of course.build.sh <arch>
, where <arch>
is either x86_32
or x86_64
. This builds the cross compiler. Thus, it will take a few
minutes :)git submodule init && git submodule update
in the root directory of the repository.export NRE_TARGET=(x86_32|x86_64) NRE_BUILD=(debug|release)
./b
to build everything. It will
build NOVA and, of course, build NRE as well. Please run ./b -h
to see
the help of the script. For a quick start use ./b qemu boot/test
to run
the test application in qemu../b srv <script>
, you have to generate the novaboot-config by:./tools/novaboot --dump-config > ~/.novaboot
Note that there are few boot-scripts that require additional binaries and
images. You can download them via ./dist/download.sh
in the nre directory. They
will be put into dist/imgs/. You have to download quite a few MB and it will
probably get more over time, which is the reason it is not included in the
repo. Similarly, you have to invoke ./dist/build.sh
to build a few test
harddisks and iso images first to be able to use a few boot scripts that
reference them.
NRE provides a console service that allows multiple applications to write to the screen (not at the same time, of course). To do this, they request a sub- console in a specified console. A console groups multiple subconsoles together, so that e.g. all management stuff (Bootloader, Hypervisor, sysinfo, ...) can be put in one console and each VM can be put in a different one. The console service uses the following keybindings, where the modifier (ctrl by default) can also be changed via modifier=x in the cmdline of console:
In case you experience a problem and would like to debug it, here are a few general suggestions on how to hunt it down:
./b dbg=<app> <bootscript>
. This will start <bootscript>
and use the
debugging symbols of <app>
. Since every NRE application is linked to a
different address you shouldn't interfere with others.If you encounter a bug, you'll often see a backtrace that looks like this:
[4] Backtrace:
[4] 0000:0003:0030:a4d2
[4] 0000:0003:0030:2210
[4] 0000:0003:0030:fd5c
You can start ./b trace=<app>
, where <app>
is e.g. root
, and simply paste
the backtrace in there to decode it. Please always post the decoded backtrace,
because the addresses might map to different code for different people.
Errors should be reported via the issue tracker on github.
Please note in general, that NRE is still a young project and a work in progress. So, there will probably be bugs and a lot of missing features. Additionally, don't expect that the API stays stable.
The following lists a few known issues and limitations that you might run into: