Sourcecode layout of SWEB
In the following, we are going to illustrate the sourcecode layout of SWEB. When having a look at SWEB for the first time you might be overwhelmed by the big number of sourcecode files. In order to become familiar with the present layout, we are about to give you an overview.
The layout explained
In the following, the content of the most important sub-directories of SWEB is exposed.
This folder houses all different architectures sweb was ported to. This includes
Mandatory tasks will be done in the
x86/64/folder. However, you can port your x86-64 features to every architecture shown in this list. Even non-supported architectures can be implemented e.g.
RISC-V. SWEB runs on different architectures. You can choose to support one or more architectures during your exercises. Use
arm embedded toolchain and
u-boot-toolsare required for
arm, e.g. install with
on ubuntu-based systems. You can find the points in the Tutors Points List on the Assignments page.
sudo apt-get install gcc-arm-none-eabi
When looking into
x86/64/source/ some important files can be found, namely:
Here is the code used for context switches when an interrupt is fired.
This file will be one of the most important ones. Here you will find the hub for the process’ virtual memory management.
Contains methods to set up and maintain a thread’s register set as well as debug functionality for the x86-64 architecture. Furthermore, some methods to operate atomically on variables are provided.
The hub for serving all interrupts and exceptions that were fired, like page faults or timer interrupts.
This directory contains architecture-independent code, separated into
source (source code) and
include (header files) folders. The two directories have the same sub-directories in common, providing different parts of the OS kernel. Some of these components deserve special highlighting:
/console: Code for the normal character console as well as the VGA (frame buffer) console. You will only need to change this if you want to change the way text IO is handled.
/fs: A file system abstraction and some concrete, working implementations like MinixFS (a device file system), a RAM file system, and a pseudo file system.
Note especially the file
VfsSyscall.cppwhich contains the entry points for all important file system functions for the kernel to use.
/kernel: As the name suggests, this is where the actual kernel is located, including the scheduler, loader, threading, and locking support. This is most likely the place to start with your implementations.
/mm: The page manager which keeps track of free physical pages, the PageFaultHandler, and an implementation of the
delete/deleteoperators are located here.
ustl: An implementation of the C++ Standard Template Library, the uSTL. If you want to use a standard container (i.e. a
vector) from the uSTL, simply include
#include “ustl/vector.h”. All available uSTL containers are in the namespace ustl.
util: Provides useful functions like
strncpy, a bitmap-, and ring buffer implementation.
As scary as the rest of SWEB may seem in the beginning, this is a place where you should feel at home immediately. There is no operating system “magic” going on here, it is just normal C programming. Historically, the code is divided into two parts: The libc and userspace programs, residing in the
tests directory. The
libc contains parts of the C standard library that you should already be familiar with. As you proceed to add more and more functionality to the kernel, you will also need to add code to the libc to provide functionality to user programs (i.e. threading).