Latest commit

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ChaOS

Tim Scheuermann, Julian Holzwarth & Adrian Herrmann

This project was developed during Barry Linnert's operating systems course at Freie Universität Berlin over the course of fourteen weeks in 2018-2019, plus minor adjustments in subsequent years.

It is a small operating system developed from scratch for the ARM-based taskit Portux MiniPC SoC with an AT91RM9200 CPU, 16 MiB Flash memory and 64 MiB RAM.

Supported features

  • Serial interface (DBGU) driver via MMIO (supports read/write, interrupts)
  • Dynamic kernel memory management
  • Processor modes, stacks (svc, und, abt, irq, fiq)
  • Interrupt handlers (Undefined Instruction, SWI, Prefetch Abort, Data Abort, IRQ, FIQ)
  • System timer and scheduling
  • Processes/threads, context switches, simple round-robin-based scheduling (preemptive multitasking)
  • Memory protection and logical address spaces via MMU
  • User/kernel interface (syscalls, utility library)

There are two example applications that demonstrate several capabilities of the kernel:

  1. An application to demonstrate address space separation, context switching, system calls and process/thread creation:
    • An initial process waits for user input and creates a new process when a character is entered (with that character as the process' input).
    • The new process stores the character in its address space, initializes a counter at 0 and starts two new threads in its own address space.
    • All three threads enter a loop where they increase the shared counter and a private counter as long as the former is under a predefined limit, print a message, and sleep for a moment.
    • The printed message is formatted as follows: <letter><thread number>: <global counter value> (<local counter value>)
  2. An application to demonstrate protection against various forbidden actions:
    • 0 - Accessing a NULL pointer.
    • 1 - Reading kernel data.
    • 2 - Writing into program text in memory.
    • 3 - Overflowing the stack.
    • 4 - Reading from an unmapped address.
    • 5 - Reading from an address that would normally be unmapped.

Limitations

  • No filesystem - everything happens in RAM.
  • Therefore, also no dynamic loading of code - everything is statically linked into the kernel binary.

Instructions

  • Recommended: Clone, patch and build QEMU by running make qemu.
  • Build by running app=<num> make, where <num> is the example application that should run (1 or 2).
  • Run by running make run (this assumes the QEMU binary to be in qemu/build/arm-softmmu/qemu-system-arm).
  • make debug starts a debuggable session (under TCP port 12345 by default) that GDB can then connect to (this also assumes the above location for the QEMU binary).
  • Exit from QEMU by pressing Ctrl + A, then X.

Requirements

  • The GNU Arm Embedded Toolchain (arm-none-eabi) is required for building.
  • A patched version of QEMU is required to virtualize the OS and can be built automatically by running make qemu. Alternatively, the patch and instructions for how to build and run the patched QEMU manually are available in the qemu-patch directory. Building QEMU requires that pkg-config, glib, gthread and pixman be installed. Refer to the QEMU patch's README for troubleshooting steps.

Design

Directory structure

src contains all the source code, in particular code for the kernel entry point, two example applications and the kernel linker script in its root.

[src/include]/drivers contains device drivers (e.g. for DBGU or ST) and functions that interact with hardware directly (e.g. for writing in specific memory areas).

[src/include]/lib contains application libraries with utilities and basic functions that facilitate application and driver development and do not interact with the hardware directly but via the drivers. E.g. math.c provides mathematical functions and buffer.c a ring buffer implementation.

[src/include]/sys contains operating system libraries that are not for application use but only for drivers and the system.

doc contains documentation, including the syscall documentation.

qemu-patch includes the patch necessary for QEMU to emulate the target platform.

Memory layout

All interrupt mode stacks are placed at the end of the internal RAM.

FIQ: 0x002FFFF8 - 0x002FDFF9
IRQ: 0x002FDFF8 - 0x002FBFF9
SVC: 0x002FBFF8 - 0x002F9FF9
ABT: 0x002F9FF8 - 0x002F7FF9
UND: 0x002F7FF8 - ...

The system mode stack is placed at the end of the external RAM.

SYS: 0x23FFFFF8 - ...

About

A small operating system developed from scratch for the ARM-based taskit Portux MiniPC SoC with an AT91RM9200 CPU, 16 MiB Flash memory and 64 MiB RAM. This project was developed during Barry Linnert's operating systems course at Freie Universität Berlin over the course of fourteen weeks in 2018-2019.

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ChaOS

Tim Scheuermann, Julian Holzwarth & Adrian Herrmann

This project was developed during Barry Linnert's operating systems course at Freie Universität Berlin over the course of fourteen weeks in 2018-2019, plus minor adjustments in subsequent years.

It is a small operating system developed from scratch for the ARM-based taskit Portux MiniPC SoC with an AT91RM9200 CPU, 16 MiB Flash memory and 64 MiB RAM.

Supported features

  • Serial interface (DBGU) driver via MMIO (supports read/write, interrupts)
  • Dynamic kernel memory management
  • Processor modes, stacks (svc, und, abt, irq, fiq)
  • Interrupt handlers (Undefined Instruction, SWI, Prefetch Abort, Data Abort, IRQ, FIQ)
  • System timer and scheduling
  • Processes/threads, context switches, simple round-robin-based scheduling (preemptive multitasking)
  • Memory protection and logical address spaces via MMU
  • User/kernel interface (syscalls, utility library)

There are two example applications that demonstrate several capabilities of the kernel:

  1. An application to demonstrate address space separation, context switching, system calls and process/thread creation:
    • An initial process waits for user input and creates a new process when a character is entered (with that character as the process' input).
    • The new process stores the character in its address space, initializes a counter at 0 and starts two new threads in its own address space.
    • All three threads enter a loop where they increase the shared counter and a private counter as long as the former is under a predefined limit, print a message, and sleep for a moment.
    • The printed message is formatted as follows: <letter><thread number>: <global counter value> (<local counter value>)
  2. An application to demonstrate protection against various forbidden actions:
    • 0 - Accessing a NULL pointer.
    • 1 - Reading kernel data.
    • 2 - Writing into program text in memory.
    • 3 - Overflowing the stack.
    • 4 - Reading from an unmapped address.
    • 5 - Reading from an address that would normally be unmapped.

Limitations

  • No filesystem - everything happens in RAM.
  • Therefore, also no dynamic loading of code - everything is statically linked into the kernel binary.

Instructions

  • Recommended: Clone, patch and build QEMU by running make qemu.
  • Build by running app=<num> make, where <num> is the example application that should run (1 or 2).
  • Run by running make run (this assumes the QEMU binary to be in qemu/build/arm-softmmu/qemu-system-arm).
  • make debug starts a debuggable session (under TCP port 12345 by default) that GDB can then connect to (this also assumes the above location for the QEMU binary).
  • Exit from QEMU by pressing Ctrl + A, then X.

Requirements

  • The GNU Arm Embedded Toolchain (arm-none-eabi) is required for building.
  • A patched version of QEMU is required to virtualize the OS and can be built automatically by running make qemu. Alternatively, the patch and instructions for how to build and run the patched QEMU manually are available in the qemu-patch directory. Building QEMU requires that pkg-config, glib, gthread and pixman be installed. Refer to the QEMU patch's README for troubleshooting steps.

Design

Directory structure

src contains all the source code, in particular code for the kernel entry point, two example applications and the kernel linker script in its root.

[src/include]/drivers contains device drivers (e.g. for DBGU or ST) and functions that interact with hardware directly (e.g. for writing in specific memory areas).

[src/include]/lib contains application libraries with utilities and basic functions that facilitate application and driver development and do not interact with the hardware directly but via the drivers. E.g. math.c provides mathematical functions and buffer.c a ring buffer implementation.

[src/include]/sys contains operating system libraries that are not for application use but only for drivers and the system.

doc contains documentation, including the syscall documentation.

qemu-patch includes the patch necessary for QEMU to emulate the target platform.

Memory layout

All interrupt mode stacks are placed at the end of the internal RAM.

FIQ: 0x002FFFF8 - 0x002FDFF9
IRQ: 0x002FDFF8 - 0x002FBFF9
SVC: 0x002FBFF8 - 0x002F9FF9
ABT: 0x002F9FF8 - 0x002F7FF9
UND: 0x002F7FF8 - ...

The system mode stack is placed at the end of the external RAM.

SYS: 0x23FFFFF8 - ...

About

A small operating system developed from scratch for the ARM-based taskit Portux MiniPC SoC with an AT91RM9200 CPU, 16 MiB Flash memory and 64 MiB RAM. This project was developed during Barry Linnert's operating systems course at Freie Universität Berlin over the course of fourteen weeks in 2018-2019.

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ChaOS

Tim Scheuermann, Julian Holzwarth & Adrian Herrmann

This project was developed during Barry Linnert's operating systems course at Freie Universität Berlin over the course of fourteen weeks in 2018-2019, plus minor adjustments in subsequent years.

It is a small operating system developed from scratch for the ARM-based taskit Portux MiniPC SoC with an AT91RM9200 CPU, 16 MiB Flash memory and 64 MiB RAM.

Supported features

  • Serial interface (DBGU) driver via MMIO (supports read/write, interrupts)
  • Dynamic kernel memory management
  • Processor modes, stacks (svc, und, abt, irq, fiq)
  • Interrupt handlers (Undefined Instruction, SWI, Prefetch Abort, Data Abort, IRQ, FIQ)
  • System timer and scheduling
  • Processes/threads, context switches, simple round-robin-based scheduling (preemptive multitasking)
  • Memory protection and logical address spaces via MMU
  • User/kernel interface (syscalls, utility library)

There are two example applications that demonstrate several capabilities of the kernel:

  1. An application to demonstrate address space separation, context switching, system calls and process/thread creation:
    • An initial process waits for user input and creates a new process when a character is entered (with that character as the process' input).
    • The new process stores the character in its address space, initializes a counter at 0 and starts two new threads in its own address space.
    • All three threads enter a loop where they increase the shared counter and a private counter as long as the former is under a predefined limit, print a message, and sleep for a moment.
    • The printed message is formatted as follows: <letter><thread number>: <global counter value> (<local counter value>)
  2. An application to demonstrate protection against various forbidden actions:
    • 0 - Accessing a NULL pointer.
    • 1 - Reading kernel data.
    • 2 - Writing into program text in memory.
    • 3 - Overflowing the stack.
    • 4 - Reading from an unmapped address.
    • 5 - Reading from an address that would normally be unmapped.

Limitations

  • No filesystem - everything happens in RAM.
  • Therefore, also no dynamic loading of code - everything is statically linked into the kernel binary.

Instructions

  • Recommended: Clone, patch and build QEMU by running make qemu.
  • Build by running app=<num> make, where <num> is the example application that should run (1 or 2).
  • Run by running make run (this assumes the QEMU binary to be in qemu/build/arm-softmmu/qemu-system-arm).
  • make debug starts a debuggable session (under TCP port 12345 by default) that GDB can then connect to (this also assumes the above location for the QEMU binary).
  • Exit from QEMU by pressing Ctrl + A, then X.

Requirements

  • The GNU Arm Embedded Toolchain (arm-none-eabi) is required for building.
  • A patched version of QEMU is required to virtualize the OS and can be built automatically by running make qemu. Alternatively, the patch and instructions for how to build and run the patched QEMU manually are available in the qemu-patch directory. Building QEMU requires that pkg-config, glib, gthread and pixman be installed. Refer to the QEMU patch's README for troubleshooting steps.

Design

Directory structure

src contains all the source code, in particular code for the kernel entry point, two example applications and the kernel linker script in its root.

[src/include]/drivers contains device drivers (e.g. for DBGU or ST) and functions that interact with hardware directly (e.g. for writing in specific memory areas).

[src/include]/lib contains application libraries with utilities and basic functions that facilitate application and driver development and do not interact with the hardware directly but via the drivers. E.g. math.c provides mathematical functions and buffer.c a ring buffer implementation.

[src/include]/sys contains operating system libraries that are not for application use but only for drivers and the system.

doc contains documentation, including the syscall documentation.

qemu-patch includes the patch necessary for QEMU to emulate the target platform.

Memory layout

All interrupt mode stacks are placed at the end of the internal RAM.

FIQ: 0x002FFFF8 - 0x002FDFF9
IRQ: 0x002FDFF8 - 0x002FBFF9
SVC: 0x002FBFF8 - 0x002F9FF9
ABT: 0x002F9FF8 - 0x002F7FF9
UND: 0x002F7FF8 - ...

The system mode stack is placed at the end of the external RAM.

SYS: 0x23FFFFF8 - ...

About

A small operating system developed from scratch for the ARM-based taskit Portux MiniPC SoC with an AT91RM9200 CPU, 16 MiB Flash memory and 64 MiB RAM. This project was developed during Barry Linnert's operating systems course at Freie Universität Berlin over the course of fourteen weeks in 2018-2019.

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ChaOS

Tim Scheuermann, Julian Holzwarth & Adrian Herrmann

This project was developed during Barry Linnert's operating systems course at Freie Universität Berlin over the course of fourteen weeks in 2018-2019, plus minor adjustments in subsequent years.

It is a small operating system developed from scratch for the ARM-based taskit Portux MiniPC SoC with an AT91RM9200 CPU, 16 MiB Flash memory and 64 MiB RAM.

Supported features

  • Serial interface (DBGU) driver via MMIO (supports read/write, interrupts)
  • Dynamic kernel memory management
  • Processor modes, stacks (svc, und, abt, irq, fiq)
  • Interrupt handlers (Undefined Instruction, SWI, Prefetch Abort, Data Abort, IRQ, FIQ)
  • System timer and scheduling
  • Processes/threads, context switches, simple round-robin-based scheduling (preemptive multitasking)
  • Memory protection and logical address spaces via MMU
  • User/kernel interface (syscalls, utility library)

There are two example applications that demonstrate several capabilities of the kernel:

  1. An application to demonstrate address space separation, context switching, system calls and process/thread creation:
    • An initial process waits for user input and creates a new process when a character is entered (with that character as the process' input).
    • The new process stores the character in its address space, initializes a counter at 0 and starts two new threads in its own address space.
    • All three threads enter a loop where they increase the shared counter and a private counter as long as the former is under a predefined limit, print a message, and sleep for a moment.
    • The printed message is formatted as follows: <letter><thread number>: <global counter value> (<local counter value>)
  2. An application to demonstrate protection against various forbidden actions:
    • 0 - Accessing a NULL pointer.
    • 1 - Reading kernel data.
    • 2 - Writing into program text in memory.
    • 3 - Overflowing the stack.
    • 4 - Reading from an unmapped address.
    • 5 - Reading from an address that would normally be unmapped.

Limitations

  • No filesystem - everything happens in RAM.
  • Therefore, also no dynamic loading of code - everything is statically linked into the kernel binary.

Instructions

  • Recommended: Clone, patch and build QEMU by running make qemu.
  • Build by running app=<num> make, where <num> is the example application that should run (1 or 2).
  • Run by running make run (this assumes the QEMU binary to be in qemu/build/arm-softmmu/qemu-system-arm).
  • make debug starts a debuggable session (under TCP port 12345 by default) that GDB can then connect to (this also assumes the above location for the QEMU binary).
  • Exit from QEMU by pressing Ctrl + A, then X.

Requirements

  • The GNU Arm Embedded Toolchain (arm-none-eabi) is required for building.
  • A patched version of QEMU is required to virtualize the OS and can be built automatically by running make qemu. Alternatively, the patch and instructions for how to build and run the patched QEMU manually are available in the qemu-patch directory. Building QEMU requires that pkg-config, glib, gthread and pixman be installed. Refer to the QEMU patch's README for troubleshooting steps.

Design

Directory structure

src contains all the source code, in particular code for the kernel entry point, two example applications and the kernel linker script in its root.

[src/include]/drivers contains device drivers (e.g. for DBGU or ST) and functions that interact with hardware directly (e.g. for writing in specific memory areas).

[src/include]/lib contains application libraries with utilities and basic functions that facilitate application and driver development and do not interact with the hardware directly but via the drivers. E.g. math.c provides mathematical functions and buffer.c a ring buffer implementation.

[src/include]/sys contains operating system libraries that are not for application use but only for drivers and the system.

doc contains documentation, including the syscall documentation.

qemu-patch includes the patch necessary for QEMU to emulate the target platform.

Memory layout

All interrupt mode stacks are placed at the end of the internal RAM.

FIQ: 0x002FFFF8 - 0x002FDFF9
IRQ: 0x002FDFF8 - 0x002FBFF9
SVC: 0x002FBFF8 - 0x002F9FF9
ABT: 0x002F9FF8 - 0x002F7FF9
UND: 0x002F7FF8 - ...

The system mode stack is placed at the end of the external RAM.

SYS: 0x23FFFFF8 - ...

About

A small operating system developed from scratch for the ARM-based taskit Portux MiniPC SoC with an AT91RM9200 CPU, 16 MiB Flash memory and 64 MiB RAM. This project was developed during Barry Linnert's operating systems course at Freie Universität Berlin over the course of fourteen weeks in 2018-2019.

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ChaOS

Tim Scheuermann, Julian Holzwarth & Adrian Herrmann

This project was developed during Barry Linnert's operating systems course at Freie Universität Berlin over the course of fourteen weeks in 2018-2019, plus minor adjustments in subsequent years.

It is a small operating system developed from scratch for the ARM-based taskit Portux MiniPC SoC with an AT91RM9200 CPU, 16 MiB Flash memory and 64 MiB RAM.

Supported features

  • Serial interface (DBGU) driver via MMIO (supports read/write, interrupts)
  • Dynamic kernel memory management
  • Processor modes, stacks (svc, und, abt, irq, fiq)
  • Interrupt handlers (Undefined Instruction, SWI, Prefetch Abort, Data Abort, IRQ, FIQ)
  • System timer and scheduling
  • Processes/threads, context switches, simple round-robin-based scheduling (preemptive multitasking)
  • Memory protection and logical address spaces via MMU
  • User/kernel interface (syscalls, utility library)

There are two example applications that demonstrate several capabilities of the kernel:

  1. An application to demonstrate address space separation, context switching, system calls and process/thread creation:
    • An initial process waits for user input and creates a new process when a character is entered (with that character as the process' input).
    • The new process stores the character in its address space, initializes a counter at 0 and starts two new threads in its own address space.
    • All three threads enter a loop where they increase the shared counter and a private counter as long as the former is under a predefined limit, print a message, and sleep for a moment.
    • The printed message is formatted as follows: <letter><thread number>: <global counter value> (<local counter value>)
  2. An application to demonstrate protection against various forbidden actions:
    • 0 - Accessing a NULL pointer.
    • 1 - Reading kernel data.
    • 2 - Writing into program text in memory.
    • 3 - Overflowing the stack.
    • 4 - Reading from an unmapped address.
    • 5 - Reading from an address that would normally be unmapped.

Limitations

  • No filesystem - everything happens in RAM.
  • Therefore, also no dynamic loading of code - everything is statically linked into the kernel binary.

Instructions

  • Recommended: Clone, patch and build QEMU by running make qemu.
  • Build by running app=<num> make, where <num> is the example application that should run (1 or 2).
  • Run by running make run (this assumes the QEMU binary to be in qemu/build/arm-softmmu/qemu-system-arm).
  • make debug starts a debuggable session (under TCP port 12345 by default) that GDB can then connect to (this also assumes the above location for the QEMU binary).
  • Exit from QEMU by pressing Ctrl + A, then X.

Requirements

  • The GNU Arm Embedded Toolchain (arm-none-eabi) is required for building.
  • A patched version of QEMU is required to virtualize the OS and can be built automatically by running make qemu. Alternatively, the patch and instructions for how to build and run the patched QEMU manually are available in the qemu-patch directory. Building QEMU requires that pkg-config, glib, gthread and pixman be installed. Refer to the QEMU patch's README for troubleshooting steps.

Design

Directory structure

src contains all the source code, in particular code for the kernel entry point, two example applications and the kernel linker script in its root.

[src/include]/drivers contains device drivers (e.g. for DBGU or ST) and functions that interact with hardware directly (e.g. for writing in specific memory areas).

[src/include]/lib contains application libraries with utilities and basic functions that facilitate application and driver development and do not interact with the hardware directly but via the drivers. E.g. math.c provides mathematical functions and buffer.c a ring buffer implementation.

[src/include]/sys contains operating system libraries that are not for application use but only for drivers and the system.

doc contains documentation, including the syscall documentation.

qemu-patch includes the patch necessary for QEMU to emulate the target platform.

Memory layout

All interrupt mode stacks are placed at the end of the internal RAM.

FIQ: 0x002FFFF8 - 0x002FDFF9
IRQ: 0x002FDFF8 - 0x002FBFF9
SVC: 0x002FBFF8 - 0x002F9FF9
ABT: 0x002F9FF8 - 0x002F7FF9
UND: 0x002F7FF8 - ...

The system mode stack is placed at the end of the external RAM.

SYS: 0x23FFFFF8 - ...

About

A small operating system developed from scratch for the ARM-based taskit Portux MiniPC SoC with an AT91RM9200 CPU, 16 MiB Flash memory and 64 MiB RAM. This project was developed during Barry Linnert's operating systems course at Freie Universität Berlin over the course of fourteen weeks in 2018-2019.

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ChaOS

Tim Scheuermann, Julian Holzwarth & Adrian Herrmann

This project was developed during Barry Linnert's operating systems course at Freie Universität Berlin over the course of fourteen weeks in 2018-2019, plus minor adjustments in subsequent years.

It is a small operating system developed from scratch for the ARM-based taskit Portux MiniPC SoC with an AT91RM9200 CPU, 16 MiB Flash memory and 64 MiB RAM.

Supported features

  • Serial interface (DBGU) driver via MMIO (supports read/write, interrupts)
  • Dynamic kernel memory management
  • Processor modes, stacks (svc, und, abt, irq, fiq)
  • Interrupt handlers (Undefined Instruction, SWI, Prefetch Abort, Data Abort, IRQ, FIQ)
  • System timer and scheduling
  • Processes/threads, context switches, simple round-robin-based scheduling (preemptive multitasking)
  • Memory protection and logical address spaces via MMU
  • User/kernel interface (syscalls, utility library)

There are two example applications that demonstrate several capabilities of the kernel:

  1. An application to demonstrate address space separation, context switching, system calls and process/thread creation:
    • An initial process waits for user input and creates a new process when a character is entered (with that character as the process' input).
    • The new process stores the character in its address space, initializes a counter at 0 and starts two new threads in its own address space.
    • All three threads enter a loop where they increase the shared counter and a private counter as long as the former is under a predefined limit, print a message, and sleep for a moment.
    • The printed message is formatted as follows: <letter><thread number>: <global counter value> (<local counter value>)
  2. An application to demonstrate protection against various forbidden actions:
    • 0 - Accessing a NULL pointer.
    • 1 - Reading kernel data.
    • 2 - Writing into program text in memory.
    • 3 - Overflowing the stack.
    • 4 - Reading from an unmapped address.
    • 5 - Reading from an address that would normally be unmapped.

Limitations

  • No filesystem - everything happens in RAM.
  • Therefore, also no dynamic loading of code - everything is statically linked into the kernel binary.

Instructions

  • Recommended: Clone, patch and build QEMU by running make qemu.
  • Build by running app=<num> make, where <num> is the example application that should run (1 or 2).
  • Run by running make run (this assumes the QEMU binary to be in qemu/build/arm-softmmu/qemu-system-arm).
  • make debug starts a debuggable session (under TCP port 12345 by default) that GDB can then connect to (this also assumes the above location for the QEMU binary).
  • Exit from QEMU by pressing Ctrl + A, then X.

Requirements

  • The GNU Arm Embedded Toolchain (arm-none-eabi) is required for building.
  • A patched version of QEMU is required to virtualize the OS and can be built automatically by running make qemu. Alternatively, the patch and instructions for how to build and run the patched QEMU manually are available in the qemu-patch directory. Building QEMU requires that pkg-config, glib, gthread and pixman be installed. Refer to the QEMU patch's README for troubleshooting steps.

Design

Directory structure

src contains all the source code, in particular code for the kernel entry point, two example applications and the kernel linker script in its root.

[src/include]/drivers contains device drivers (e.g. for DBGU or ST) and functions that interact with hardware directly (e.g. for writing in specific memory areas).

[src/include]/lib contains application libraries with utilities and basic functions that facilitate application and driver development and do not interact with the hardware directly but via the drivers. E.g. math.c provides mathematical functions and buffer.c a ring buffer implementation.

[src/include]/sys contains operating system libraries that are not for application use but only for drivers and the system.

doc contains documentation, including the syscall documentation.

qemu-patch includes the patch necessary for QEMU to emulate the target platform.

Memory layout

All interrupt mode stacks are placed at the end of the internal RAM.

FIQ: 0x002FFFF8 - 0x002FDFF9
IRQ: 0x002FDFF8 - 0x002FBFF9
SVC: 0x002FBFF8 - 0x002F9FF9
ABT: 0x002F9FF8 - 0x002F7FF9
UND: 0x002F7FF8 - ...

The system mode stack is placed at the end of the external RAM.

SYS: 0x23FFFFF8 - ...

About

A small operating system developed from scratch for the ARM-based taskit Portux MiniPC SoC with an AT91RM9200 CPU, 16 MiB Flash memory and 64 MiB RAM. This project was developed during Barry Linnert's operating systems course at Freie Universität Berlin over the course of fourteen weeks in 2018-2019.

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ChaOS

Tim Scheuermann, Julian Holzwarth & Adrian Herrmann

This project was developed during Barry Linnert's operating systems course at Freie Universität Berlin over the course of fourteen weeks in 2018-2019, plus minor adjustments in subsequent years.

It is a small operating system developed from scratch for the ARM-based taskit Portux MiniPC SoC with an AT91RM9200 CPU, 16 MiB Flash memory and 64 MiB RAM.

Supported features

  • Serial interface (DBGU) driver via MMIO (supports read/write, interrupts)
  • Dynamic kernel memory management
  • Processor modes, stacks (svc, und, abt, irq, fiq)
  • Interrupt handlers (Undefined Instruction, SWI, Prefetch Abort, Data Abort, IRQ, FIQ)
  • System timer and scheduling
  • Processes/threads, context switches, simple round-robin-based scheduling (preemptive multitasking)
  • Memory protection and logical address spaces via MMU
  • User/kernel interface (syscalls, utility library)

There are two example applications that demonstrate several capabilities of the kernel:

  1. An application to demonstrate address space separation, context switching, system calls and process/thread creation:
    • An initial process waits for user input and creates a new process when a character is entered (with that character as the process' input).
    • The new process stores the character in its address space, initializes a counter at 0 and starts two new threads in its own address space.
    • All three threads enter a loop where they increase the shared counter and a private counter as long as the former is under a predefined limit, print a message, and sleep for a moment.
    • The printed message is formatted as follows: <letter><thread number>: <global counter value> (<local counter value>)
  2. An application to demonstrate protection against various forbidden actions:
    • 0 - Accessing a NULL pointer.
    • 1 - Reading kernel data.
    • 2 - Writing into program text in memory.
    • 3 - Overflowing the stack.
    • 4 - Reading from an unmapped address.
    • 5 - Reading from an address that would normally be unmapped.

Limitations

  • No filesystem - everything happens in RAM.
  • Therefore, also no dynamic loading of code - everything is statically linked into the kernel binary.

Instructions

  • Recommended: Clone, patch and build QEMU by running make qemu.
  • Build by running app=<num> make, where <num> is the example application that should run (1 or 2).
  • Run by running make run (this assumes the QEMU binary to be in qemu/build/arm-softmmu/qemu-system-arm).
  • make debug starts a debuggable session (under TCP port 12345 by default) that GDB can then connect to (this also assumes the above location for the QEMU binary).
  • Exit from QEMU by pressing Ctrl + A, then X.

Requirements

  • The GNU Arm Embedded Toolchain (arm-none-eabi) is required for building.
  • A patched version of QEMU is required to virtualize the OS and can be built automatically by running make qemu. Alternatively, the patch and instructions for how to build and run the patched QEMU manually are available in the qemu-patch directory. Building QEMU requires that pkg-config, glib, gthread and pixman be installed. Refer to the QEMU patch's README for troubleshooting steps.

Design

Directory structure

src contains all the source code, in particular code for the kernel entry point, two example applications and the kernel linker script in its root.

[src/include]/drivers contains device drivers (e.g. for DBGU or ST) and functions that interact with hardware directly (e.g. for writing in specific memory areas).

[src/include]/lib contains application libraries with utilities and basic functions that facilitate application and driver development and do not interact with the hardware directly but via the drivers. E.g. math.c provides mathematical functions and buffer.c a ring buffer implementation.

[src/include]/sys contains operating system libraries that are not for application use but only for drivers and the system.

doc contains documentation, including the syscall documentation.

qemu-patch includes the patch necessary for QEMU to emulate the target platform.

Memory layout

All interrupt mode stacks are placed at the end of the internal RAM.

FIQ: 0x002FFFF8 - 0x002FDFF9
IRQ: 0x002FDFF8 - 0x002FBFF9
SVC: 0x002FBFF8 - 0x002F9FF9
ABT: 0x002F9FF8 - 0x002F7FF9
UND: 0x002F7FF8 - ...

The system mode stack is placed at the end of the external RAM.

SYS: 0x23FFFFF8 - ...

About

A small operating system developed from scratch for the ARM-based taskit Portux MiniPC SoC with an AT91RM9200 CPU, 16 MiB Flash memory and 64 MiB RAM. This project was developed during Barry Linnert's operating systems course at Freie Universität Berlin over the course of fourteen weeks in 2018-2019.

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ChaOS

Tim Scheuermann, Julian Holzwarth & Adrian Herrmann

This project was developed during Barry Linnert's operating systems course at Freie Universität Berlin over the course of fourteen weeks in 2018-2019, plus minor adjustments in subsequent years.

It is a small operating system developed from scratch for the ARM-based taskit Portux MiniPC SoC with an AT91RM9200 CPU, 16 MiB Flash memory and 64 MiB RAM.

Supported features

  • Serial interface (DBGU) driver via MMIO (supports read/write, interrupts)
  • Dynamic kernel memory management
  • Processor modes, stacks (svc, und, abt, irq, fiq)
  • Interrupt handlers (Undefined Instruction, SWI, Prefetch Abort, Data Abort, IRQ, FIQ)
  • System timer and scheduling
  • Processes/threads, context switches, simple round-robin-based scheduling (preemptive multitasking)
  • Memory protection and logical address spaces via MMU
  • User/kernel interface (syscalls, utility library)

There are two example applications that demonstrate several capabilities of the kernel:

  1. An application to demonstrate address space separation, context switching, system calls and process/thread creation:
    • An initial process waits for user input and creates a new process when a character is entered (with that character as the process' input).
    • The new process stores the character in its address space, initializes a counter at 0 and starts two new threads in its own address space.
    • All three threads enter a loop where they increase the shared counter and a private counter as long as the former is under a predefined limit, print a message, and sleep for a moment.
    • The printed message is formatted as follows: <letter><thread number>: <global counter value> (<local counter value>)
  2. An application to demonstrate protection against various forbidden actions:
    • 0 - Accessing a NULL pointer.
    • 1 - Reading kernel data.
    • 2 - Writing into program text in memory.
    • 3 - Overflowing the stack.
    • 4 - Reading from an unmapped address.
    • 5 - Reading from an address that would normally be unmapped.

Limitations

  • No filesystem - everything happens in RAM.
  • Therefore, also no dynamic loading of code - everything is statically linked into the kernel binary.

Instructions

  • Recommended: Clone, patch and build QEMU by running make qemu.
  • Build by running app=<num> make, where <num> is the example application that should run (1 or 2).
  • Run by running make run (this assumes the QEMU binary to be in qemu/build/arm-softmmu/qemu-system-arm).
  • make debug starts a debuggable session (under TCP port 12345 by default) that GDB can then connect to (this also assumes the above location for the QEMU binary).
  • Exit from QEMU by pressing Ctrl + A, then X.

Requirements

  • The GNU Arm Embedded Toolchain (arm-none-eabi) is required for building.
  • A patched version of QEMU is required to virtualize the OS and can be built automatically by running make qemu. Alternatively, the patch and instructions for how to build and run the patched QEMU manually are available in the qemu-patch directory. Building QEMU requires that pkg-config, glib, gthread and pixman be installed. Refer to the QEMU patch's README for troubleshooting steps.

Design

Directory structure

src contains all the source code, in particular code for the kernel entry point, two example applications and the kernel linker script in its root.

[src/include]/drivers contains device drivers (e.g. for DBGU or ST) and functions that interact with hardware directly (e.g. for writing in specific memory areas).

[src/include]/lib contains application libraries with utilities and basic functions that facilitate application and driver development and do not interact with the hardware directly but via the drivers. E.g. math.c provides mathematical functions and buffer.c a ring buffer implementation.

[src/include]/sys contains operating system libraries that are not for application use but only for drivers and the system.

doc contains documentation, including the syscall documentation.

qemu-patch includes the patch necessary for QEMU to emulate the target platform.

Memory layout

All interrupt mode stacks are placed at the end of the internal RAM.

FIQ: 0x002FFFF8 - 0x002FDFF9
IRQ: 0x002FDFF8 - 0x002FBFF9
SVC: 0x002FBFF8 - 0x002F9FF9
ABT: 0x002F9FF8 - 0x002F7FF9
UND: 0x002F7FF8 - ...

The system mode stack is placed at the end of the external RAM.

SYS: 0x23FFFFF8 - ...

About

A small operating system developed from scratch for the ARM-based taskit Portux MiniPC SoC with an AT91RM9200 CPU, 16 MiB Flash memory and 64 MiB RAM. This project was developed during Barry Linnert's operating systems course at Freie Universität Berlin over the course of fourteen weeks in 2018-2019.

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Contributors

Languages