184 lines
4.8 KiB
Typst
184 lines
4.8 KiB
Typst
|
|
#set page(paper: "a3", margin: 2cm)
|
||
|
|
|
||
|
|
#let karlos-color = rgb("#009c72")
|
||
|
|
#show: it => block(
|
||
|
|
width: 100%,
|
||
|
|
height: 100%,
|
||
|
|
stroke: black,
|
||
|
|
radius: (
|
||
|
|
top-left: 64pt,
|
||
|
|
bottom-right: 64pt,
|
||
|
|
),
|
||
|
|
inset: 32pt,
|
||
|
|
it
|
||
|
|
)
|
||
|
|
|
||
|
|
#let logo-image = image(width: 64pt, "karlos-logo.svg")
|
||
|
|
#let logo = stack(
|
||
|
|
dir: ltr,
|
||
|
|
logo-image,
|
||
|
|
h(10pt),
|
||
|
|
[
|
||
|
|
#text(font: "fira sans", size: 64pt, weight: "black")[KarlOS] \
|
||
|
|
#text(font: "fira sans", size: 16pt, weight: "bold")[Karlsruhe Operating System]
|
||
|
|
]
|
||
|
|
)
|
||
|
|
|
||
|
|
#set text(font: "fira sans", size: 16pt)
|
||
|
|
#set list(marker: [•])
|
||
|
|
|
||
|
|
#let text-block(it) = block(
|
||
|
|
fill: rgb("#009c72").transparentize(70%),
|
||
|
|
radius: (
|
||
|
|
top-left: 8pt,
|
||
|
|
bottom-right: 8pt,
|
||
|
|
),
|
||
|
|
inset: 8pt,
|
||
|
|
it
|
||
|
|
)
|
||
|
|
|
||
|
|
#let text-block2(head, it) = stack(
|
||
|
|
dir: ttb,
|
||
|
|
block(
|
||
|
|
width: 100%,
|
||
|
|
fill: karlos-color.transparentize(50%),
|
||
|
|
radius: (
|
||
|
|
top-left: 8pt,
|
||
|
|
),
|
||
|
|
inset: 8pt,
|
||
|
|
heading(level: 2, head)
|
||
|
|
),
|
||
|
|
block(
|
||
|
|
width: 100%,
|
||
|
|
fill: karlos-color.transparentize(70%),
|
||
|
|
radius: (
|
||
|
|
bottom-right: 8pt,
|
||
|
|
),
|
||
|
|
inset: 8pt,
|
||
|
|
it
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|
||
|
|
#grid(columns: (1fr, 1fr), gutter: 16pt,
|
||
|
|
[
|
||
|
|
#logo
|
||
|
|
|
||
|
|
#text-block2("Who are we?", [
|
||
|
|
Hobbyist OS-enthusiast students at KIT
|
||
|
|
])
|
||
|
|
|
||
|
|
#text-block2("Our OS", [
|
||
|
|
- Architecture: x86
|
||
|
|
- Language: modern C
|
||
|
|
- Organization
|
||
|
|
- Monolithic kernel
|
||
|
|
- Multicore
|
||
|
|
- Non-POSIX, not Unix-like
|
||
|
|
#place(horizon + right, block(inset: 16pt, image("c-logo.svg", width: 20%)))
|
||
|
|
])
|
||
|
|
|
||
|
|
#text-block2("Goals", [
|
||
|
|
- Platform for experimentation
|
||
|
|
- Non-standard task/process model
|
||
|
|
- Tagged file system
|
||
|
|
])
|
||
|
|
], [
|
||
|
|
#show raw: set text(font: "fira mono", weight: "bold", size: 4.6pt)
|
||
|
|
```c
|
||
|
|
void
|
||
|
|
ram_init(void)
|
||
|
|
{
|
||
|
|
ASSERT(!ram_initialized);
|
||
|
|
|
||
|
|
// collect memory regions and remove initrd range, as well as page frame 0
|
||
|
|
populate_ranges(&bootboot_free_cover);
|
||
|
|
// TODO removing this is not really necessary anymore, at least in my qemu case.
|
||
|
|
// We still keep it in because in the worst case it does nothing.
|
||
|
|
cover_remove(&bootboot_free_cover, (struct mem_range) {
|
||
|
|
.start = pa_from_value(bootboot.initrd_ptr),
|
||
|
|
.size = bootboot.initrd_size
|
||
|
|
});
|
||
|
|
cover_remove(&bootboot_free_cover, (struct mem_range) {
|
||
|
|
.start = pa_from_value(0),
|
||
|
|
.size = PG_SIZE
|
||
|
|
});
|
||
|
|
|
||
|
|
// Calculate how many levels we need
|
||
|
|
uint64_t addrLimit = pa_to_value(cover_end(&bootboot_free_cover));
|
||
|
|
addrLimit = next_pow2(addrLimit);
|
||
|
|
if (addrLimit == 0) {
|
||
|
|
PANIC("Zero physical frames available.");
|
||
|
|
}
|
||
|
|
ram_num_levels = __builtin_ffsl(addrLimit); // log2(addrLimit) + 1
|
||
|
|
ram_num_levels -= PG_SHIFT;
|
||
|
|
DEBUG_PRINTF("addrLimit = %lu\n", addrLimit);
|
||
|
|
DEBUG_PRINTF("ram_num_levels = %u\n", ram_num_levels);
|
||
|
|
|
||
|
|
// Allocate bitmaps for all levels; Initialize all memory as allocated
|
||
|
|
for (unsigned level = 0; level < ram_num_levels; level++) {
|
||
|
|
ram_layers[level].first_free = pa_from_value(INVALID_FRAME_ADDR);
|
||
|
|
|
||
|
|
size_t bitmapSize = BITMAP_SIZE(1ul << (ram_num_levels - level - 1));
|
||
|
|
|
||
|
|
ASSERT(cover_steal(&bootboot_free_cover, bitmapSize, &ram_layers[level].avail_bitmap));
|
||
|
|
memset(pa_to_pointer(ram_layers[level].avail_bitmap), 0x00, bitmapSize);
|
||
|
|
|
||
|
|
ASSERT(cover_steal(&bootboot_free_cover, bitmapSize, &ram_layers[level].coherent_bitmap));
|
||
|
|
memset(pa_to_pointer(ram_layers[level].coherent_bitmap), 0x00, bitmapSize);
|
||
|
|
}
|
||
|
|
|
||
|
|
// align all segments to page size
|
||
|
|
cover_align(&bootboot_free_cover, PG_SHIFT);
|
||
|
|
|
||
|
|
// Mark free frames as available
|
||
|
|
for (unsigned int i = 0; i < bootboot_free_cover.num_ranges; i++) {
|
||
|
|
uint64_t start = pa_to_value(bootboot_free_cover.ranges[i].start);
|
||
|
|
uint64_t length = bootboot_free_cover.ranges[i].size;
|
||
|
|
|
||
|
|
uint64_t addr = start;
|
||
|
|
while (length >= PG_SIZE) {
|
||
|
|
unsigned level = 0;
|
||
|
|
for (;;) {
|
||
|
|
unsigned next_level_bytes = NUM_BYTES_COVERED_IN_LEVEL(level + 1);
|
||
|
|
// size and alignment need to fit
|
||
|
|
if (length < next_level_bytes || (addr & (next_level_bytes - 1)) != 0) {
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
level++;
|
||
|
|
}
|
||
|
|
|
||
|
|
DEBUG_PRINTF("freeing %lx at level %u\n", addr, level);
|
||
|
|
free_block(pa_from_value(addr), level);
|
||
|
|
|
||
|
|
addr += NUM_BYTES_COVERED_IN_LEVEL(level);
|
||
|
|
length -= NUM_BYTES_COVERED_IN_LEVEL(level);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
ram_initialized = true;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
]
|
||
|
|
)
|
||
|
|
|
||
|
|
#image(width: 100%, "kernel-diagram.svg")
|
||
|
|
|
||
|
|
#let qr = block(
|
||
|
|
stroke: 3pt + black,
|
||
|
|
inset: 8pt,
|
||
|
|
radius: 16pt,
|
||
|
|
image("qr-karlsruhe-os-de.svg")
|
||
|
|
)
|
||
|
|
#place(bottom, grid(
|
||
|
|
columns: (2fr, 1fr),
|
||
|
|
gutter: 16pt,
|
||
|
|
align(bottom, text-block2("Join us if you...", [
|
||
|
|
- are interested in systems programming
|
||
|
|
- want to see what goes into developing an OS
|
||
|
|
- have (or want to gain) experience in C programming
|
||
|
|
])),
|
||
|
|
qr,
|
||
|
|
[],
|
||
|
|
align(center, text(weight: "bold")[karlsruhe-os.de])
|
||
|
|
))
|