Mercurial > lcfOS
view doc/os.rst @ 410:6aa9743ed362 tip
Reflect change in c3 public modifier
author | Windel Bouwman |
---|---|
date | Mon, 23 Feb 2015 21:06:04 +0100 |
parents | 9eb1fc6aad6c |
children |
line wrap: on
line source
OS == Implementation -------------- Arm ~~~ Vexpress-a9 For the first implementation the qemu arm system vexpress-a9 machine was targeted. To launch this machine with a kernel use: .. code:: qemu-system-arm -M vexpress-a9 -m 128M -kernel kernel/kernel_arm.bin \ -serial stdio The memory layout of this image is as follows: - 0x00000000 - 0x10000000 : hardware. - 0x10009000 : pl011 --> the uart peripheral - 0x60000000 : bootloader of qemu itself. - 0x60010000 : main memory, where kernel is loaded by the bootloader. Design ------ Processes / threads ~~~~~~~~~~~~~~~~~~~ Processes are completely seperated and fully pre-emptive. This means a process can be unscheduled at any moment. Threads are co-operative. This means they yield control voluntary. This means that mutexes and locks are not required. This is done with the built-in language feature called tasks. If some heavy duty task must be performed, either way spawn a new process, or yield frequently from this hard labour. tasks ~~~~~ Consider the following: .. code:: function int insanemath(int a) { while (a > 0) { a = a -1; resume agent1; } return a - 1; } task agent1() { start agent2; } task agent2() { insanemath(55); insanemath(44); } task main() { start agent1; join agent1; } Say to tasks are running in concurrent / parallel. Stack layout for tasks. || || \/ +---------+ | return address | locals | +------ | return address | locals | +--- Assembly code for the functions above: .. code:: .code insanemath: L1: load r0, sp - 4 cmp r0, 0 jl L2 dec r0 store r0, sp - 4 jmp L1 L2: ret agent1: hlt? agent2: hlt? main: jmp agent1 .data agent1_task: dd 0 agent2_task: dd 0