---
# System prepended metadata

title: Release Post - v0.16.0 (Telesto)
tags: [' app-compat', ' governance', ' milestone', unikraft, ' release']

---

:::info
To generate the feature list:

```bash
gh pr list -s closed -L 100 --search "is:pr is:closed closed:>2023-10-23" --json author,title,number --template '{{range .}}{{ printf "* %s (#%v) by @%s\n" .title .number .author.login }}{{end}}'
```

To generate the list of reviewers:

```bash
git --no-pager log --format="* %(trailers:key=Reviewed-by,valueonly,separator=%x2C )" --abbrev-commit HEAD...RELEASE-0.15.0 | sed 's/, /\n* /g' | sort -u
```
:::

:::danger
before submitting, please search the document for "TODO", "commit"
:::

:::info
Candidate text for the release note:

https://github.com/unikraft/unikraft/issues?q=label%3Arelease-note+is%3Aclosed+milestone%3A%22v0.15.0+%28Pandora%29%22
:::

[toc]

## GitHub Release Note

We are proud to announce the latest version update of Unikraft, v0.16.0!
This release brings important new features and further improvements and stabilizing to the previous release (0.15.0 - Pandora).
It adds new features, a healthy number of fixes and it enhances application support.

Here is the full updates list:

### 🚀 New Features

* `lib/posix-socket`: Socket events ([#1224](https://github.com/unikraft/unikraft/pull/1224)) by @skuenzer
* `.github/workflows`: Add workflow to merge approved PRs  ([#1223](https://github.com/unikraft/unikraft/pull/1223)) by @craciunoiuc
* Limit visibility of fdt libraries to fdt-capable platforms ([#1219](https://github.com/unikraft/unikraft/pull/1219)) by @michpappas
* `arch`: Introduce dedicated CPU Exception stack configuration ([#1214](https://github.com/unikraft/unikraft/pull/1214)) by @mogasergiu
* `.github/workflows`: Add workflow to merge approved PRs ([#1209](https://github.com/unikraft/unikraft/pull/1209)) by @craciunoiuc
* Add `lib/posix-fdtab` and `lib/vfscore` destructors ([#1205](https://github.com/unikraft/unikraft/pull/1205)) by @mogasergiu
* `lib/posix-{fdio,socket}`: Add stat support to socket files ([#1203](https://github.com/unikraft/unikraft/pull/1203)) by @andreittr
* `lib/vfscore`: initrd: `extract` option ([#1201](https://github.com/unikraft/unikraft/pull/1201)) by @skuenzer
* `lib/ramfs`: Implement copying of directories ([#1190](https://github.com/unikraft/unikraft/pull/1190)) by @mschlumpp
* `lib/posix-environ`: Add `README.md` file for posix-environ ([#1185](https://github.com/unikraft/unikraft/pull/1185)) by @DeliaPavel
* `lib/posix-environ`: Add comments for posix-environ ([#1184](https://github.com/unikraft/unikraft/pull/1184)) by @DeliaPavel
* `lib/*`: Introduce support for `AF_UNIX` sockets ([#1183](https://github.com/unikraft/unikraft/pull/1183)) by @andreittr
* `lib/posix-socket`: Port from vfscore to new `uk_file` ([#1182](https://github.com/unikraft/unikraft/pull/1182)) by @andreittr
* `lib/ukcpio`: Refactor and improve CPIO extraction ([#1181](https://github.com/unikraft/unikraft/pull/1181)) by @andreittr
* `lib/posix-timerfd`: Introduce timerfd support ([#1179](https://github.com/unikraft/unikraft/pull/1179)) by @andreittr
* `lib/posix-sysinfo`: Add documentation ([#1178](https://github.com/unikraft/unikraft/pull/1178)) by @StefanJum
* `lib/posix-user`: Add README.md file for posix-user ([#1177](https://github.com/unikraft/unikraft/pull/1177)) by @DeliaPavel
* `lib/posix-time`: Add README.md ([#1176](https://github.com/unikraft/unikraft/pull/1176)) by @RaduNichita
* Introduce `UK_LLSYSCALL_R_U_DEFINE` and register `clone` with it ([#1175](https://github.com/unikraft/unikraft/pull/1175)) by @mogasergiu
* Implement stack switching on system call entries and on ARM traps/IRQ's ([#1174](https://github.com/unikraft/unikraft/pull/1174)) by @mogasergiu
* `lib/*`: Move POSIX pipes out of vfscore ([#1172](https://github.com/unikraft/unikraft/pull/1172)) by @andreittr
* `lib/*`: Replace `posix-event` with independent libraries ([#1171](https://github.com/unikraft/unikraft/pull/1171)) by @andreittr
* `lib/*`: Introduce posix-fdio ([#1170](https://github.com/unikraft/unikraft/pull/1170)) by @andreittr
* `build`: Introduce `UK_IMAGE_NAME_OVERWRITE` make var ([#1169](https://github.com/unikraft/unikraft/pull/1169)) by @nderjung
* `lib/*`: Introduce posix-fdtab ([#1168](https://github.com/unikraft/unikraft/pull/1168)) by @andreittr
* `lib/uknetdev`: Add `ipv4_dns0_addr` configuration ([#1167](https://github.com/unikraft/unikraft/pull/1167)) by @mschlumpp
* `lib/ukfile`: Introduce the ukfile library ([#1165](https://github.com/unikraft/unikraft/pull/1165)) by @andreittr
* `lib/posix-user`: Add code comments ([#1164](https://github.com/unikraft/unikraft/pull/1164)) by @DeliaPavel
* `lib/uktimeconv`: Add conversion functions for common timestamp structs ([#1162](https://github.com/unikraft/unikraft/pull/1162)) by @andreittr
* `include`: Add strong/weak reference counting ([#1160](https://github.com/unikraft/unikraft/pull/1160)) by @andreittr
* `plat/common/arm` + `lib/posix-process`: Various fixes for Golang ARM64 support ([#1158](https://github.com/unikraft/unikraft/pull/1158)) by @eduardvintila
* `lib/ukboot`: Shutdown feature ([#1148](https://github.com/unikraft/unikraft/pull/1148)) by @skuenzer
* `lib/vfscore`: Introduce `ukopts`, a new `vfs.fstab` option and `mkmp`, a `ukopts` option ([#1145](https://github.com/unikraft/unikraft/pull/1145)) by @mogasergiu
* `lib/vfscore`: Re-enable the mounting of `initrd`'s through `fstab` ([#1144](https://github.com/unikraft/unikraft/pull/1144)) by @mogasergiu
* `.github/workflows`: Add PR auto-labelling ([#1142](https://github.com/unikraft/unikraft/pull/1142)) by @craciunoiuc
* `.github/workflows`: Add checkpatch checks for commits ([#1141](https://github.com/unikraft/unikraft/pull/1141)) by @craciunoiuc
* `.github`: Enable dependabot for action bumping ([#1140](https://github.com/unikraft/unikraft/pull/1140)) by @craciunoiuc
* `.github/workflows`: Add commit and PR format checks ([#1139](https://github.com/unikraft/unikraft/pull/1139)) by @craciunoiuc
* `.github/workflows`: Add github workflows checks ([#1137](https://github.com/unikraft/unikraft/pull/1137)) by @craciunoiuc
* `.github/workflows`: Add python checks for support scripts ([#1134](https://github.com/unikraft/unikraft/pull/1134)) by @craciunoiuc
* `.github/workflows`: Add shellcheck for scripts ([#1133](https://github.com/unikraft/unikraft/pull/1133)) by @craciunoiuc
* `{include/, lib/uksched, lib/uklock}`: Add static initializers ([#1126](https://github.com/unikraft/unikraft/pull/1126)) by @andreittr
* `include/arch`: Add atomic fetch & AND operation ([#1125](https://github.com/unikraft/unikraft/pull/1125)) by @andreittr
* `plat/kvm/efi.c`: Obtain MemoryMap again and retry when ExitBootService fails ([#1105](https://github.com/unikraft/unikraft/pull/1105)) by @kha-dinh
* `lib/nolibc`: Introduce 'FILE' object APIs ([#1043](https://github.com/unikraft/unikraft/pull/1043)) by @Starnox
* `plat`: Migrate ns16550 to drivers/uktty ([#1026](https://github.com/unikraft/unikraft/pull/1026)) by @michpappas
* `plat`: Migrate pl011 to drivers/uktty ([#1025](https://github.com/unikraft/unikraft/pull/1025)) by @michpappas
* `include/uk`: Move compiler definitions from `essentials.h` to `compiler.h` ([#960](https://github.com/unikraft/unikraft/pull/960)) by @rares-miculescu
* `lib`: Move `atomic.h` arhitecture specific code to new `ukatomic` ([#950](https://github.com/unikraft/unikraft/pull/950)) by @Starnox
* `plat`: Move register definitions into arch ([#937](https://github.com/unikraft/unikraft/pull/937)) by @rares-miculescu
* `lib/ukgcov`: Introduce library for code coverage ([#906](https://github.com/unikraft/unikraft/pull/906)) by @Starnox
* `lib/devfs`: Add Doxygen-style comments ([#714](https://github.com/unikraft/unikraft/pull/714)) by @calex257
* `[dynamic-apps]`: Couchdb src ([#56](https://github.com/unikraft/dynamic-apps/pull/56)) by @mtimaN
* `[app-elfloader]`: Namespace VDSO config option ([#68](https://github.com/unikraft/app-elfloader/pull/68)) by @skuenzer
* `[app-elfloader]`: build: Upgrade `Kraftfile` to v0.6 specification ([#66](https://github.com/unikraft/app-elfloader/pull/66)) by @nderjung
* `[app-elfloader]`: Register `arch_prctl` through `UK_LLSYSCALL_R_U_DEFINE` ([#65](https://github.com/unikraft/app-elfloader/pull/65)) by @mogasergiu
* `[app-python3]`: README.md: Fix typo and update kraft run ([#25](https://github.com/unikraft/app-elfloader/pull/25)) by @gabrielpitic
* `[app-uwebsockets]`: Pull uSockets and uWebSockets from Unikraft repos ([#1](https://github.com/unikraft/app-elfloader/pull/1)) by @jviotti
* `[lib-libgo]`: Add support for AArch64 ([#9](https://github.com/unikraft/lib-libgo/pull/9)) by @eduardvintila
* `[lib-lwip]`: Adapt to new auxiliary stack argument of `libuksched` API ([#41](https://github.com/unikraft/lib-lwip/pull/41)) by @mogasergiu
* `[lib-lwip]`: Update to latest inittab changes ([#40](https://github.com/unikraft/lib-lwip/pull/40)) by @skuenzer
* `[lib-lwip]`: socket.c: Port to the new posix-socket API ([#39](https://github.com/unikraft/lib-lwip/pull/39)) by @andreittr
* `[lib-lwip]`: Modify `atomic.h` import line to accomodate plat re-arch ([#36](https://github.com/unikraft/lib-lwip/pull/36)) by @Starnox
* `[lib-lwip]`: Add RAW socket type to LwIP ([#2](https://github.com/unikraft/lib-lwip/pull/2)) by @flapjack321
* `[lib-musl]`: patches: Prefault page tables used in stacks allocated for threads ([#73](https://github.com/unikraft/lib-musl/pull/73)) by @eduardvintila
* `[catalog]`: feat(library): Introduce Node 18 as library ([#22](https://github.com/unikraft/catalog/pull/22)) by @razvand
* `[catalog]`: feat(library): Update base configuration ([#21](https://github.com/unikraft/catalog/pull/21)) by @razvand
* `[catalog]`: feat: add "Hello, world!" Rust-based example ([#16](https://github.com/unikraft/catalog/pull/16)) by @mkroening
* `[catalog]`: feat(base): Introduce base (ELFLoader) to library ([#11](https://github.com/unikraft/catalog/pull/11)) by @razvand
* `[catalog]`: feat(library): Introduce Lua ([#6](https://github.com/unikraft/catalog/pull/6)) by @razvand
* `[catalog]`: feat(workflows): Add linting GitHub Actions ([#5](https://github.com/unikraft/catalog/pull/5)) by @gabrielmocanu
* `[catalog]`: feat(library): Introduce SQLite ([#4](https://github.com/unikraft/catalog/pull/4)) by @razvand
* `[catalog]`: feat(examples): Introduce HTTP C application ([#3](https://github.com/unikraft/catalog/pull/3)) by @razvand

### 🐛 Bug Fixes & Improvements

* `lib/posix-fdtab`: Fix fdtab cleanup w/o asserts ([#1239](https://github.com/unikraft/unikraft/pull/1239)) by @andreittr
* `lib/fdtab`: Fix compiler warnings ([#1237](https://github.com/unikraft/unikraft/pull/1237)) by @michpappas
* `lib/posix-unixsocket`: Silence unused variable warnings ([#1236](https://github.com/unikraft/unikraft/pull/1236)) by @michpappas
* `lib/vfscore`: Fix compiler warnings on mismatched bound ([#1235](https://github.com/unikraft/unikraft/pull/1235)) by @michpappas
* `drivers/virtio/9p`: Fix warning on unused `vq` parameter ([#1234](https://github.com/unikraft/unikraft/pull/1234)) by @michpappas
* `lib/posix-fdtab`: Export fdtab init priority ([#1231](https://github.com/unikraft/unikraft/pull/1231)) by @StefanJum
* `lib/posix-pipe`: Fix stack overflow on struct init ([#1228](https://github.com/unikraft/unikraft/pull/1228)) by @andreittr
* `lib/posix-fdio`: Handle ioctl(FIOCLEX|FIONCLEX) ([#1227](https://github.com/unikraft/unikraft/pull/1227)) by @andreittr
* `lib/uknetdev`: Include `semaphore.h` conditionally to DISPATCHERTHREADS ([#1220](https://github.com/unikraft/unikraft/pull/1220)) by @michpappas
* `plat/kvm/arm`: Fix implicit declaration of `enforce_w_xor_x()` ([#1217](https://github.com/unikraft/unikraft/pull/1217)) by @michpappas
* `lib/ukboot`: Fix warning on undefined variable ([#1216](https://github.com/unikraft/unikraft/pull/1216)) by @michpappas
* `lib/vfscore`: Use `unsigned long` for `fcntl`'s third argument's type ([#1213](https://github.com/unikraft/unikraft/pull/1213)) by @mogasergiu
* `lib/posix-fdtab`: Reprioritize fdtab init & cleanup ([#1210](https://github.com/unikraft/unikraft/pull/1210)) by @andreittr
* `.github/workflows`: Do not run checkpatch on pushes ([#1206](https://github.com/unikraft/unikraft/pull/1206)) by @craciunoiuc
* `lib/ramfs`: Return proper errors on `ioctl` calls ([#1202](https://github.com/unikraft/unikraft/pull/1202)) by @StefanJum
* `lib/posix-{pipe,unixsocket}`: Fix event delivery on closing ([#1208](https://github.com/unikraft/unikraft/pull/1208)) by @andreittr
* `lib/posix-fdio`: Handle `FD_CLOEXEC` flag in fcntl correctly ([#1200](https://github.com/unikraft/unikraft/pull/1200)) by @andreittr
* `lib/posix-poll`: Make `epoll_ctl` identify files by (fd + file description) ([#1198](https://github.com/unikraft/unikraft/pull/1198)) by @andreittr
* `build`: Do not run integration tests on markdown-only changes ([#1197](https://github.com/unikraft/unikraft/pull/1197)) by @nderjung
* `lib/uklock`: Fix recursive mutex static inititializer ([#1195](https://github.com/unikraft/unikraft/pull/1195)) by @StefanJum
* `lib/uklock`: Fix static initializer for recursive mutexes ([#1194](https://github.com/unikraft/unikraft/pull/1194)) by @skuenzer
* VFS re-arch fixes ([#1193](https://github.com/unikraft/unikraft/pull/1193)) by @skuenzer
* `lib/ukfile`: Ignore `MSG_NOSIGNAL` flags for UNIX sockets ([#1189](https://github.com/unikraft/unikraft/pull/1189)) by @mschlumpp
* `lib/vfscore`: Use recursive mutexes for vnodes ([#1192](https://github.com/unikraft/unikraft/pull/1192)) by @mschlumpp
* `lib/posix-fdio`: Remove pointer dereference from fcntl ([#1191](https://github.com/unikraft/unikraft/pull/1191)) by @mschlumpp
* `lib/syscall_shim`: Fix `arch_prctl`'s `ARCH_SET_FS` handling ([#1173](https://github.com/unikraft/unikraft/pull/1173)) by @mogasergiu
* `plat/xen/x86_64`: Add missing segment alignment for `xen` ([#1166](https://github.com/unikraft/unikraft/pull/1166)) by @andreistan26
* `include/arch`: Make time constants signed ([#1157](https://github.com/unikraft/unikraft/pull/1157)) by @andreittr
* `include/arch`: Add raw compare-exchange operation ([#1156](https://github.com/unikraft/unikraft/pull/1156)) by @andreittr
* `lib/vfscore`: Fix crash in fstatat on `NULL` args ([#1155](https://github.com/unikraft/unikraft/pull/1155)) by @andreittr
* `lib/posix-time`: Allow `NULL` arg in `clock_getres` ([#1154](https://github.com/unikraft/unikraft/pull/1154)) by @andreittr
* `ukboot`: Remove explicit `PLAT_KVM` dependency ([#1153](https://github.com/unikraft/unikraft/pull/1153)) by @kubanrob
* `plat/common`: Fix missing chosen node handling ([#1151](https://github.com/unikraft/unikraft/pull/1151)) by @kubanrob
* `arch/arm64`: Fix `ukarch_tlb_flush_entry` ([#1149](https://github.com/unikraft/unikraft/pull/1149)) by @kubanrob
* `lib/devfs`: Remove dependency on `LIBVFSCORE_AUTOMOUNT_ROOTFS` ([#1146](https://github.com/unikraft/unikraft/pull/1146)) by @mogasergiu
* `lib/nolibc,lib/isrlib`: Fix strncpy ([#973](https://github.com/unikraft/unikraft/pull/973)) by @haesbaert
* `[app-elfloader]`: Silence warning on unused `err_unload_vaimg` label ([#70](https://github.com/unikraft/app-elfloader/pull/70)) by @michpappas
* `[lib-libunwind]`: Fix unwinding ([#11](https://github.com/unikraft/lib-libunwind/pull/11)) by @mschlumpp
* `[lib-lwip]`: Silence warning on arithmetic operation on socket flags (corrected) ([#44](https://github.com/unikraft/lib-lwip/pull/44)) by @michpappas
* `[lib-lwip]`: Silence warning on arithmetic operation on socket flags ([#43](https://github.com/unikraft/lib-lwip/pull/43)) by @michpappas 
* `[lib-rust]`: lang/rust: Change cargo flag ([#4](https://github.com/unikraft/lib-rust/pull/4)) by @fabianpatras
* `[lib-uwebsockets]`: Upgrade uWebSockets to v20.49.0 ([#2](https://github.com/unikraft/lib-uwebsockets/pull/2)) by @jviotti
* `[lib-uwebsockets]`: Upgrade to uWebSockets v20.48.0 ([#1](https://github.com/unikraft/lib-uwebsockets/pull/1)) by @jviotti
* `[catalog]`: fix(nginx/1.15): Fix missing file (`error.log`) ([#18](https://github.com/unikraft/catalog/pull/18)) by @nderjung
* `[catalog]`: refactor: Application versions to their own directory ([#9](https://github.com/unikraft/catalog/pull/9)) by @nderjung
* `[catalog]`: fix(README): Correct paths to actions and library directories ([#13](https://github.com/unikraft/catalog/pull/13)) by @nderjung
* `[catalog]`: fix(merge-oci-digests): Show `--all` packages ([#8](https://github.com/unikraft/catalog/pull/8)) by @nderjung
* `[catalog]`: `library/*`: Use short form for target definitions ([#2](https://github.com/unikraft/catalog/pull/2)) by @razvand
* `[app-elfloader]`: Fix typo in README ([#67](https://github.com/unikraft/app-elfloader/pull/67)) by @RaduNichita
* `[app-elfloader]`: Correctly set `Program Header` offset used for aux vector's `AT_PHDR` ([#64](https://github.com/unikraft/app-elfloader/pull/64)) by @mogasergiu
* `[app-elfloader]`: Do not change real `fs_base` register in `arch_prctl` ([#63](https://github.com/unikraft/app-elfloader/pull/63)) by @mogasergiu

A big thank you also to all those who helped in the [review process](unikraft.org/docs/contributing/review-process/): [Alexander Jung](https://github.com/nderjung), [Cezar Crăciunoiu](https://github.com/craciunoiuc), [Eduard Mihăilescu](https://github.com/Starnox), [Teodor Țeugea](https://github.com/John-Ted), [Marco Schlumpp](https://github.com/mschlumpp), [Maria Sfîrăială](https://github.com/mariasfiraiala), [Michalis Pappas](https://github.com/michpappas), [Radu Nichita](https://github.com/RaduNichita), [Răzvan Deaconescu](https://github.com/razvand), [Răzvan Vîrtan](https://github.com/razvanvirtan), [Sergiu Moga](https://github.com/mogasergiu), [Simon Kuenzer](https://github.com/skuenzer), [Stefan Jumarea](https://github.com/StefanJum).

---

For more information, check out [the accompanying blog post](https://unikraft.org/blog/2024-01-02-unikraft-releases-telesto) or [view the full changelog](https://github.com/unikraft/unikraft/compare/RELEASE-0.15.0...RELEASE-0.16.0).

---

## Twitter

Unikraft v0.16.0 is here! 🚀 This release brings important new features and further improvements and stabilizing to the previous release (0.15.0 - Prometheus).

Check out the blog post for extensive details on the latest changes:https://unikraft.org/blog/2024-01-02-unikraft-releases-telesto

---

## LinkedIn

Unikraft v0.16.0 is here! 🚀 This release brings important new features and further improvements and stabilizing to the previous release (0.15.0 - Prometheus).
It adds new features, a healthy number of fixes and it enhances application support.

Check out the blog post for extensive details on the latest changes (https://unikraft.org/blog/2024-01-02-unikraft-releases-telesto) and join us on GitHub (https://github.com/unikraft/) and on Discord (https://bit.ly/UnikraftDiscord).

---

## Blog Post

We are excited to announce the update version of Unikraft, v0.16.0.

This release is the result of constant testing, debugging, fixing and improvements during the past couple of months.  It comes packed with plenty of fixes that improve the stability and application support of Unikraft.

In this blog post, we present the new features available in Unikraft.  For a full breakdown, please check out the [changelog](https://github.com/unikraft/unikraft/compare/RELEASE-0.15.0...RELEASE-0.16.0).

### Virtual Filesystem Interface Redesign

_This feature was championed by [Andrei Tătar](https://github.com/andreittr), with great support from [Simon Kuenzer](https://github.com/skuenzer)._

Unikraft's `vfscore`, a key element of the Unikraft project since its inception, [has historically excelled in virtualizing file systems](https://unikraft.org/blog/2023-06-09-tales-of-open-source-vfscore) but faced limitations in terms of modularity and addressing new constraints imposed by the unikernel model.  Acknowledging these challenges, the Unikraft team has completely redesigned and reimplemented the virtual filesystem abstractions which has previously represented `vfscore`.  The goal is to enhance modularity, scalability, and overall adaptability, addressing existing limitations and ensuring Unikraft remains a pioneering force in lightweight, specialized operating systems.  This effort aims to create a more flexible and extensible VFS system, forming a solid foundation for continued innovation within the Unikraft ecosystem.

TODO: Ask Andrei & Simon about limitations of vfscore and place below:

Originally, `vfscore` closely coupled file descriptors with actual files ...TODO...  New needs have been identified, such as with `posix-socket` which requires an open file descriptor to represent a connection, but might not have access to an actual underlying filesystem (even an in-memory one due to Unikraft's modularity).  A file descriptor can truly represent simply a pointer to a memory address ... TODO ...

This has led to the redesign of vfscore into a radically new design which splits the implementation into multiple libraries that provide separation of concerns. The new libraries are:

| Library | PR | Purpose |
|---------|----|---------|
| `ukfile` | [#1165](https://github.com/unikraft/unikraft/pull/1165) | A new low-level abstraction for "files". |
| `posix-fdio` | [#1170](https://github.com/unikraft/unikraft/pull/1170) | Offers the POSIX syscalls `(p)read(v)*`, `(p)write(v)*`, `lseek`, `fstat`, `fcntl`, `ioctl` |
| `posix-fdtab` | [#1168](https://github.com/unikraft/unikraft/pull/1168) | TODO |
| `posix-poll` | [#1171](https://github.com/unikraft/unikraft/pull/1171) | TODO |
| `posix-eventfd` | [#1171](https://github.com/unikraft/unikraft/pull/1171) | TODO |
| `posix-timerfd` | [#1179](https://github.com/unikraft/unikraft/pull/1179) | TODO |
| `posix-pipe` | [#1172](https://github.com/unikraft/unikraft/pull/1172/files) | TODO |


To begin addressing the challenge of modularity we must start with an introduction of a new fundemental internal library, [`ukfile`](#TODO), which contains basic primitives for Unikraft abstractions of a "file" as well as an "open file" (a.k.a. "open file descriptions").  These are low-level internals which do not have direct correspondents in any userspace-facing API.  Not to be confused with "file descriptors" or other similar POSIX-y concepts; these are later introduced via `posix-fd*` and others.

### So, what is a _file_?

To overuse a classical *NIX idiom, ["everything is a file"](https://en.wikipedia.org/wiki/Everything_is_a_file).  More concretely however, a file is an abstraction for any resource that offers a combination of input, output, and/or control operations.  A file in Unikraft is a combination of an _immutable identity_ coupled with _mutable state_.

Files are now represented in Unikraft by the [`struct uk_file`](#TODO) type, referenced in APIs as `const struct uk_file *` to enforce immutability.  Identity consists of:
- A volume identifier: driver-specific field, used to identify the file type as well as its originating driver instance
- A file node: reference to driver-specific data associated with the file
- Table of file operations: implementations of well-defined file operations (see below)

File state is used for bookkeeping purposes and includes:
- Reference counting (strong & weak references)
- Locks for synchronization
- Event set & queue for polling operations

#### File Operations

Files allow for a defined set of operations, some of which are driver-implemented, while others are common across all files.
Driver-specific operations have a well-defined interface and are implemented by file drivers.
These are:
- I/O: manipulating an array of unstructured bytes
  - `read`: retrieve a specific contiguous block of bytes from this array
  - `write`: ensure a specific contiguous block in this array has specific bytes
- Metadata: manipulating a defined structure of metadata related to the file
  - `getstat`: get file metadata fields
  - `setstat`: set file metadata fields
- Control: requests for special operations to be performed by the file
  - `ctl`
- (internal) cleanup/destructor: what happens, if anything, when we no longer need the file

Common operations are implemented centrally for all file objects:
- Reference counting: acquire/release of regular (strong) or weak references
  - Strong references allow the full functionality of files
  - Weak references allow only common operations (polling, locking)
- Event polling & notification:
  - Driver API:
    - Set & clear what event flags are active on the file
  - User API:
    - Check whether specific events are set on a file
    - Wait and be awoken when an event becomes set on a file
- Voluntary kernel-space synchronization mechanisms:
  - Driver operations provide no synchronization or atomicity guarantees themselves in the general case
  - Drivers are free to implement these operations as efficiently as their internal data model allows
  - Higher-level APIs that want to provide atomicity guarantees (e.g. POSIX read vs. write serialization) can and should use these mechanisms to achieve their goal


### What is an _open file_?

Open files are stateful and mutable references to a file that is "in use".  The precise definition of "in use" is intentionally left vague and up to client code.  Open file state consists of:
- Reference count, allowing multiple independent shared references
- Open "mode", a client-defined bitmask of open file options
- Current position for I/O (i.e. what one sets with `lseek()`)
- Lock for synchronizing changes to the above

Open files are represented in Unikraft by the `struct uk_ofile` type.  A single `struct uk_file` may be referenced by an arbitrary number of ofiles, each of which acts independently from the others.

Open files do not expose any operations themselves, instead providing only a base data structure for higher-level abstractions, such as file descriptor tables and POSIX I/O syscalls.







### initrd Extraction ([#1201](https://github.com/unikraft/unikraft/pull/1201))

_This feature was championed by [Simon Kuenzer](https://github.com/skuenzer) with support and feedback from [Sergiu Moga](https://github.com/mogasergiu) and [Alexander Jung](https://github.com/nderjung)._

In conjunction with the embedded initrd support, this feature allows a secondary filesystem to add and potentially overwrite items in the primary (root) filesystem.
This is implemented by passing the `extract` option to the `vfstab` command line argument, e.g. `vfs.fstab="initrd:/:initrd::extract:"`.

With this in place, user can customize their own application on top of an existing application / language frameworks.
A user would pull the base application from the registry and then run it with a secondary filesystem, that adds / overwrites required files.

### Shutdown Mechanism ([#1148](https://github.com/unikraft/unikraft/pull/1148))

_This feature was championed by [Simon Kuenzer](https://github.com/skuenzer) with great support from [Sergiu Moga](https://github.com/mogasergiu)._

The shutdown mechanism permits the closing of the Unikraft virtual machine.
Up until now, the virtual machine was left in a no-operation state, but didn't fully stop.

The change consists of an extension of `inittab`.
Each entry is extended to two function pointers: an initialization function pointer and a termination function pointer, which are handled in pairs and share the same priority.

While initialization means iterating over the inittab and calling the initialization functions, termination is done by iterating over the inittab in reverse order.

Initialization and termination are handled by the "init" thread of `lib/ukboot`.
With scheduling, there is an option to start the `main()` of the application in a separate "main" thread.
This allows shutdown requests to be handled independently of the state of `main()`.
A shutdown request driver (e.g., ACPI button) or any other application thread can send a request to the "init" thread to initiate a shutdown.

### GCOV Support (`ukgcov`) ([#906](https://github.com/unikraft/unikraft/pull/906))

_This feature was championed by [Eduard Mihăilescu](https://github.com/Starnox) and [Michalis Pappas](https://github.com/michpappas)._

This `ukgcov` library introduces initial setup with config options for console, binary file, and memory output.
It takes advantage of GCC's Profiling and Test Coverage in Freestanding Environments.
This feature was introduced in `GCC-13`, as such, this library won't work with any version lower than that.

To utilize this library, you will need to select and configure some options:

- Select `ukgcov` from `Library Configuration` KConfig menu.
- Choose the way you want to extract the `gcov` information from the kernel.

To extract the coverage file, you will need external filesystem support (9pfs):

- In `plat` -> `kvm` -> `virtio`, select:
  - `virtio PCI device support`
  - `virtio 9P device`
- In `lib` -> `vfscore`, select:
  - `Default root filesystem (9PFS)`
- Create a directory `fs0/` where the resulting filename with the name provided in `KConfig` will reside.

To extract the coverage information, you can call the `gcov_dump_info()` function at the end of the program

### Application Catalog

_This feature was championed by [Alexander Jung](https://github.com/nderjung) and [Razvan Deaconescu](https://github.com/razvand) with feedback from [Ștefan Jumărea](https://github.com/StefanJum)._

A new repository for building, running and deploying application is available, as the [`catalog`](https://github.com/unikraft/catalog) repository.
This is a replacement for the application repositories (`app-*`) and for the repositories for binary compatible applications ([`static-pie-apps`](https://github.com/unikraft/static-pie-apps), [`dynamic-apps`](https://github.com/unikraft/dynamic-apps)).

Applications and examples are to be aggregated in the catalog.
The user will use [`kraft`](https://github.com/unikraft/kraftkit) commands to build, run and deploy applications, without other steps required.

The catalog will be the focus of CI-based testing and, generally, any testing of submitted features and fixes in the Unikraft core and library repositories.

### UNIX Socket Support ([#1183](https://github.com/unikraft/unikraft/pull/1183))

_This feature was championed by [Andrei Tatar](https://github.com/andreittr) with great support from [Simon Kuenzer](https://github.com/skuenzer)._

This feature adds UNIX socket support (i.e. local domain sockets), up until now not-supported in Unikraft.
It adds `posix-unixsocket`, a library implementing `AF_UNIX` sockets on top of `posix-socket` using new VFS design, along with prerequisite changes:

- minor API extension for `posix-socket`
- addition of `<sys/un.h>` in `nolibc`

This work is part of the VFS redesign work, relying on the newly introduced `ukfile`, `posix-fdio`, `posix-fdtab` libraries.

### GitHub Workflows

_This feature was championed by [Cezar Crăciunoiu](https://github.com/craciunoiuc) with greate support from [Alexander Jung](https://github.com/nderjung)._

New GitHub workflows have been added to the [Unikraft core repository](https://github.com/unikraft/unikraft/tree/staging/.github/workflows).
These perform various checks on submitted work to ensure consistency and compliance.
They affect C, YAML, Python, shell code and Git commits.

### Plat Re-Arch Updates

_This work was championed by [Rareș Miculescu](https://github.com/rares-miculescu) and [Michalis Pappas](https://github.com/michpappas)._

The plat re-arch track continued with three new items:

- Move register definitions from `plat/` to `arch/` ([#937](https://github.com/unikraft/unikraft/pull/937))
- Introduce new `ukatomic` library and move atomic code to it ([#950](https://github.com/unikraft/unikraft/pull/950)
- Move compiler definitions from `essentials.h` to `compiler.h` ([#960](https://github.com/unikraft/unikraft/pull/960))

These further assist in the overall improved design of the Unikraft source code and a better separation between platform and architecture code.

### Internal Code Documentation Updates

_This feature was championed by [Ștefan Jumărea](https://github.com/StefanJum), [Radu Nichita](https://github.com/RaduNichita), [Delia Pavel](https://github.com/DeliaPavel) with support from [Răzvan Deaconescu](https://github.com/razvand)._

Further updates to the internal documentation, in the form of code comments and library `README` files, have been integrated.
This is part of the ongoing effort to have up-to-date documentation of the interfaces and inner workings of Unikraft internal libraries.

### Go on ARM64 ([#1158](https://github.com/unikraft/unikraft/pull/1158), [`lib-libgo#9`](https://github.com/unikraft/lib-libgo/pull/9))

_This feature was championed by [Eduard Vintilă](https://github.com/eduardvintila) with support from [Michalis Pappas](https://github.com/michpappas) and [Ștefan Jumărea](https://github.com/StefanJum)._

Previously updated Go support was only available for x86_64.
This feature enables it for ARM64.

This now makes it possible to run native Go applications on ARM64 with `lib-libgo`.

### Stack Switching for System Calls and ARM Exceptions

_This feature was championed by [Sergiu Moga](https://github.com/mogasergiu) with support from [Michalis Pappas](https://github.com/michpappas)._

Before, whenever a system call would be invoked throgh the `syscall` instruction on `x86_64`, Unikraft would continue using the application's stack to save context state, which would end up sometimes contaminating the Red Zone of the trapped application or even write past it in cases such as those of `Goroutines` that have a very [small stack size](https://go.dev/doc/go1.4#runtime).

In order to solve this, a [per-thread](https://github.com/unikraft/unikraft/pull/1174/commits/35d1dd1cfd599f679ec82ab9949cda18113ab09b) and [per-LCPU](https://github.com/unikraft/unikraft/pull/1174/commits/b04b64f3823fa3bb6ad095cc154ad7fc5feb325b) (logical CPU) auxiliary stack pointer has been introduced that we switch to on binary system call entry through the `swapgs` instruction.

Furthermore, ARM64 was suffering from the same thing, but worse: on every Asynchronous or Synchronous Exception, we were using the same application stack, since ARM64 does not have `Interrupt Stack Tables` like `x86_64`. To fix this, similarly to how we [store LCPU data into the `GS_BASE`/`KERNEL_GSB_BASE`](https://github.com/unikraft/unikraft/pull/1174/commits/065147b7c7a24727c2ab69dcb42ae1cbd2358e32) MSR's on `x86_64`, we use [`TPIDR_EL1`](https://github.com/unikraft/unikraft/pull/1174/commits/820c9ab8bad10c4fd12b3a029210f812e3d55ed0) to store this structure on ARM64 and [`TPIDRRO_EL0`](https://github.com/unikraft/unikraft/pull/1174/commits/014d637c65da22d8afd082877b58190fd4dd76a9#diff-6f06ae093526114b31051e5aa5326e75555b6bc10688515d75634b28426d5b76R77) as a scratch register used to switch to the auxiliary stack without touching anything from the current context.
The auxiliary stack pointer is mainly used for system calls, but for IRQ's/traps the unused [`SP_EL0`](https://github.com/unikraft/unikraft/pull/1174/commits/014d637c65da22d8afd082877b58190fd4dd76a9#diff-9b388adc5acf113b253e52c68de2b5076e254c92fc27eb0a457f9c0da93d262aR74) register will be used to hold a double buffer: a stack for IRQ's and a stack for traps.

### Introduce `UK_LLSYSCALL_R_U_DEFINE`

_This feature was championed by [Sergiu Moga](https://github.com/mogasergiu) with support from [Michalis Pappas](https://github.com/michpappas)._

On some rare cases, some application runtimes would prefer that after a `clone` system call the child's context will be the exact same as the parent's before the call, except of course for the scratch registers or the return value registers.
In our case we would not do this and instead have the child's context zeroed out. Therefore, we would need to give access to the caller's context to both native and binary system calls.

To make tracking of this context across system calls easier, two new context structures have been added: [`ukarch_sysregs`](https://github.com/unikraft/unikraft/pull/1175/commits/0994de5e681b52ee6de9a3646802eca419242a4b) (TLS and, for `x86_64`, `GS_BASE`) and [`uk_syscall_ctx`](https://github.com/unikraft/unikraft/pull/1175/commits/976fbc53e12dea9717c55ac46abc8390714dec4c) (for `ukarch_sysregs`, extended context and general purpose registers).

While in the case of binary system calls we had the generic `syscall` instruction entry, for the native ones system calls are just a function call so in order to also be able to store this context on native system calls, a new system call registration macro has been introduced: [`UK_LLSYSCALL_R_U_DEFINE`](https://github.com/unikraft/unikraft/pull/1175/commits/886dcc7c2b7ff1fc0461062e7ce6146dfbf6d563).
This new macro would append a context saving prologue for both [`x86_64`](https://github.com/unikraft/unikraft/pull/1175/commits/bd0e24660a98b928fe759bb39c27d966b97d9533) and [`ARM64`](https://github.com/unikraft/unikraft/pull/1175/commits/c7064c83eedf7182e92e0c182ec1723daccc69dc) to the actual function call of native system calls as well as define a hidden additional argument, `usc` (`struct uk_syscall_ctx`), to registered system calls. An example on how this system call registration macro can be used is the new [`clone`](https://github.com/unikraft/unikraft/pull/1175/commits/f1d17db16f30447a27dcffcbd2bcda7c314bdf23) system call registration, as well as the documentation in the [commit message](https://github.com/unikraft/unikraft/pull/1175/commits/886dcc7c2b7ff1fc0461062e7ce6146dfbf6d563) itself.

## Community Activities

### GSoC Mentors Summit 2023

Unikraft was part of [GSoC Mentors Summit 2023](https://summerofcode.withgoogle.com/programs/2023) taking place in Sunnyvale, California, US.
[Răzvan Deaconescu](https://github.com/razvand) represented the Unikraft community and its taking part in Google Summer of Code during the past two years.

It was a great time to interact with representatives from other open source projects and share ideas and experiences related to Google Summer of Code and beyond.

As part of the un-conference at the summit, Răzvan hosted the "Balancing Acts in Open Source Projects", engaging the participants in sharing their own views on potentially conflicting actions in open source communities, and best practicies in handling them.

There is now an ongoing discussion on Zulip channel to further strenghten the collaboration between open source communities.
And to increase the quality of future GSoC projects.

### SOSP'23 Tutorial

We organized the [Unikraft SOSP Tutorial](https://unikraft.org/hackathons/2023-10-sosp) hackathon as part of the [SOSP 2023](https://sosp2023.mpi-sws.org/) conference.
The tutorial was focused on recent updates to the Unikraft ecosystem, particularly application support and usability via KraftKit.

Paricipants were mostly researchers and academia staff, interested in using Unikraft as part of their research and teaching work.

### Monthly Hackathon

We continue organizing monthly hackathons, generally taking place in the last Saturday of each month.
Hackathons take place both online and in person, generally at the National University of Science and Technology POLITEHNICA of Bucharest.

We organized a monthly hackathon on Sunday, December 17, 2023.
It was targeted on the 0.16 release, application support, CI improvements and fixes.
It featured an extensive participation of 16 members of the community.

The next monthly hackathon is scheduled to take place on Saturday, January 27, 2024, ahead of a scheduled new release.

### Unikernel Alliance

As part of the Unikernel Alliance community, we now have a brand new [website](https://unikernelalliance.org/), created from a [repository](https://github.com/unikernelalliance/unikernelalliance.github.io).
The website presents information about member projects in the community, topics of interest and further information.

We continue organizing meetings in the community, generally taking place in the last Thursday of each month.
The next meeting is scheduled for Thursday, January 25, 2024, 6pm CET.

Current discussions focus on unikernel specifics and challenges in topics such as usability, performance, security, efficiency.

### Taking Part of FOSDEM

Unikraft will be part of [FOSDEM'24](https://fosdem.org/2024/), taking place on February 3 & 4, 2024, at the [Microkernel and Component-based OS devroom](https://fosdem.org/2024/schedule/track/microkernel/).
There will be two talks featured:

- "Linux Binary Compatible Unikernels with Unikraft", by [Simon Kuenzer](https://github.com/skuenzer)
- "Unikernels Are Here: Building, Running and Deploying Application Unikernels With One Command" by [Răzvan Deaconescu](https://github.com/razvand)

It will be a great time to meet in person with other members of the unikernel community and the larger open source community.

See you in Brussels!

### Getting Ready for GSoC'24

[Google Summer of Code 2024 (GSoC'24)](https://summerofcode.withgoogle.com/) has been announced.
We are making preparations for the future GSoC'24 submission period.
The aim is to get future applicants involved in the community such that they would be able to make consistent contributions as part of the application portfolio.

If you are interested in taking part in GSoC'24, and work on operating-systems, cloud and tooling items, join [Unikraft Discord](http://bit.ly/UnikraftDiscord), take part in discussions, make contributions and ask for support