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:

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:

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
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