Skip to content

Commit d8395a9

Browse files
committed
Update kernel memory layout docs
1 parent 830f4ac commit d8395a9

File tree

2 files changed

+77
-58
lines changed

2 files changed

+77
-58
lines changed

doc/memory

+71-58
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
KnightOS Memory Layout
1+
Kernel memory structures
22

33
Note that this describes the default settings, and that the actual layout of
44
memory is subject to change depending on how the kernel is configured. Userspace
5-
programs mucking around in memory manually is very strongly frowned upon.
5+
programs mucking around in memory manually is _very strongly_ frowned upon. All
6+
kernel data structures are subject to change.
67

7-
Overall Layout
8+
Overall layout
89

910
Address Length Description
1011

@@ -21,88 +22,85 @@ functions, including boot, filesystem access, context switching, etc.
2122
Volatile Flash access is generally only used with interrupts disabled to prevent
2223
other processes from ruining your day.
2324

24-
RAM Layout
25+
RAM layout
2526

2627
Right now, KnightOS only uses 0x8000 (32K) of RAM, even on devices that may have
2728
additional RAM available. Nothing of value is kept in RAM, and it may be safely
2829
wiped during a reboot (and in fact, the kernel does so).
2930

30-
Note that RAM data structures are scheduled to change dramatically for kernel
31-
0.7.0.
32-
3331
Address Length Description
3432

35-
0x8000 0x100 Thread table
36-
0x8100 0x40 Library table
37-
0x8140 0x40 Signal table
38-
0x8180 0x40 File handle table
39-
0x8200 0x100 Misc kernel state
40-
0x8300 0x100 Kernel flash functions
41-
0x8400 0x200 Volatile kernel garbage
42-
0x8600 0x7A00 Userspace memory
33+
0x8000 0x80 Miscellaneous kernel state
34+
0x8080 0x80 Flash execution space
35+
0x8100 0x100 Volatile kernel utility space (kernelGarbage)
36+
0x8200 0x7D00 Heap
37+
38+
Misc kernel state holds several statically allocated kernel variables. Flash
39+
execution space is reserved for the Flash driver to use to execute Flash
40+
operations, which must be run from RAM. Volatile kernel utility space is a fixed
41+
buffer used for various kernel operations where dynamic memory allocation cannot
42+
fail. Finally, the heap is where `malloc` allocates memory from.
4343

44-
Userspace memory is where `malloc` allocates memory. Volatile kernel garbage is
45-
used throughout the kernel whenever it just needs a little space to work, and is
46-
accessed with interrupts disabled. Kernel flash functions are where the Flash
47-
driver loads executable code to perform Flash manipulation from RAM. Misc kernel
48-
state is used for various things like the currently executing thread.
44+
The process table
4945

50-
Data Structures
46+
The kernel supports preemptive multitasking, and to this end it keeps track of
47+
running processes and their resources. The process table is where this state is
48+
stored, and it is allocated in the heap and grows or shrinks and demands change.
49+
There are some variables in misc kernel state that keep track of the process
50+
table:
5151

52-
Each of the tables is a fixed-length array that holds several of the following
53-
data structures.
52+
process_table Pointer to process table in the heap
53+
active_processes Number of active processes
54+
current_process Index of the currently running process
55+
last_pid The last PID allocated by the kernel
5456

55-
Threads
57+
At boot, the kernel allocates a process table large enough to hold 8 processes.
58+
As more processes are started, the process table may be `realloc`d to hold
59+
more or less process state (though never less than 8). Each process state
60+
structure is designed like so:
5661

5762
Address Length Description
5863

59-
0x0000 0x01 Thread ID
64+
0x0000 0x01 Process ID (pid)
6065
0x0001 0x02 Executable address
61-
0x0003 0x02 Stack pointer
66+
0x0003 0x02 Stack address (SP)
6267
0x0005 0x01 Flags (bitfield)
63-
1: May be suspended
64-
2: Is suspended
65-
3: Color enabled
66-
0x0006 0x02 Reserved for future use
67-
68-
Libraries
69-
70-
Address Length Description
71-
72-
0x0000 0x01 Library ID
73-
0x0001 0x02 Library address
74-
0x0003 0x01 Dependent threads
75-
76-
Signals
77-
78-
Address Length Description
79-
80-
0x0000 0x01 Target thread ID
81-
0x0001 0x01 Message type
82-
0x0002 0x02 Payload
83-
84-
File Handles
68+
0: May be suspended
69+
1: Is suspended
70+
2: Color enabled (84+CSE only)
71+
0x0006 0x02 Pointer to file handle table
72+
0x0007 0x01 Number of file handles
73+
0x0009 0x02 Pointer to library handle table
74+
0x000B 0x01 Number of libraries
75+
0x000C 0x02 Pointer to signal table
76+
0x000E 0x01 Number of signal handlers
77+
78+
Each process has its own stack, file descriptor table, library handle table, and
79+
signal table. These are also allocated in the heap and expand or shrink to meet
80+
the process's needs. By default, each process is allocated a file descriptor
81+
table 4 entries long, a library handle table 2 entries long, and no signal
82+
table (both the pointer and length will be zero).
83+
84+
File handle
8585

8686
Address Length Description
8787

88-
0x0000 0x01 Flags/Owner
88+
0x0000 0x01 Flags (bitfield)
89+
0: Writable if 1
90+
1: EoF if 1
91+
2: Flushed if 1
92+
3: Set if final block of the file*
93+
4-7: Reserved for future use
8994
0x0001 0x02 Buffer address
9095
0x0003 0x01 Stream pointer
9196
0x0004 0x02 Section ID
9297
0x0006 0x01 Length of final block
9398
0x0007 0x01 File entry page
9499
0x0008 0x02 File entry address
95100
0x000A 0x03 File working size
96-
0x000D 0x01 Writable stream flags
97-
0x000E 0x02 Reserved for future use
98-
99-
Flags/Owner is the thread ID of the file handle's owner. It takes the format of
100-
FTExxxxx, where xxxxx is the thread ID. F is set to indicate that the stream is
101-
pointing at the final block of the file. T is set if the thread is writable. E
102-
is set if the file handle is set to EOF.
101+
0x000D 0x03 Reserved for future use
103102

104-
Writable stream flags are set to xxxxxxF, where F is set if the stream has been
105-
flushed, and x is reserved for future use.
103+
All kernel data structures are subject to change, but this one especially so.
106104

107105
The buffer address refers to the address of the 256-byte stream buffer, which
108106
contains the contents of the current DAT block the stream points to. The stream
@@ -114,3 +112,18 @@ in the KFS docs.
114112

115113
The length of the final block is used to determine when EOF has been reached on
116114
the final block.
115+
116+
Library handle
117+
118+
Address Length Description
119+
120+
0x0000 0x02 Library ID
121+
0x0002 0x02 Library address
122+
123+
Signal handler
124+
125+
Address Length Description
126+
127+
0x0000 0x02 Signal handler
128+
0x0002 0x01 Signal number
129+
0x0003 0x01 Reserved for future use

src/00/flash.asm

+6
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ _: pop af
114114
ld (0), a
115115
jp .return
116116
.ram_end:
117+
.echo "writeFlashByte RAM footprint: 0x{0:X4}" .ram_end-.ram
117118

118119
;; writeFlashBuffer [Flash]
119120
;; Writes several bytes of memory to Flash
@@ -195,6 +196,7 @@ _: pop af
195196
jr nz, .loop
196197
jp .return
197198
.ram_end:
199+
.echo "writeFlashBuffer RAM footprint: 0x{0:X4}" .ram_end-.ram
198200

199201
;; eraseSwapSector [Flash]
200202
;; Erases the swap sector.
@@ -267,6 +269,7 @@ _: ld a, (0)
267269
ld (0x4000), a
268270
jp .return
269271
.ram_end:
272+
.echo "eraseFlashSector RAM footprint: 0x{0:X4}" .ram_end-.ram
270273

271274
;; eraseFlashPage [Flash]
272275
;; Erases a single page of Flash.
@@ -488,6 +491,7 @@ _: pop af
488491
jp .return
489492
.ram_end:
490493
#endif
494+
.echo "copySectorToSwap RAM footprint: 0x{0:X4}" .ram_end-.ram
491495

492496
;; copyFlashExcept [Flash]
493497
;; Copies one Flash page to another, but omits a certain range of bytes in increments of
@@ -690,6 +694,7 @@ _: inc hl
690694
jr .continue_loop
691695
.ram_end:
692696
#endif
697+
.echo "copyFlashExcept RAM footprint: 0x{0:X4}" .ram_end-.ram
693698

694699
;; copyFlashPage [Flash]
695700
;; Copies one page of Flash to another.
@@ -841,3 +846,4 @@ _: inc hl
841846
jp .return
842847
.ram_end:
843848
#endif
849+
.echo "copyFlashPage RAM footprint: 0x{0:X4}" .ram_end-.ram

0 commit comments

Comments
 (0)