bunch of stuff idek

This commit is contained in:
andromeda
2026-03-06 20:33:51 +01:00
parent fdf5bb9daf
commit 9c65697dd8
20 changed files with 329 additions and 101 deletions

View File

@@ -2,53 +2,15 @@ Call me Terry Davis because... actually please don't. I have visions: aspiration
# bootle
hobby kernel written in rust. It's just for playing around... for now :p
hobby kernel
run with `nix run git+https://git.mtgmonkey.net/andromeda/bootler#bootle`
status: basically nothing, come back later
# bootler
hobby bootloader written in asm. It's just for playing around... for now :p
hobby 1-stage legacy mode bootloader
run with `nix run git+https://git.mtgmonkey.net/andromeda/bootler#bootler`
### memory map
```
+------ 0x00100000 ------+
| hardware, bios stuff |
+------ 0x00080000 ------+
| |
| |
+------ 0x00010200 ------+
| x86_64 kernel |
+------ 0x00010000 ------+
| |
| |
+------ 0x00009000 ------+
| IDT |
+------ 0x00008000 ------+
| |
| |
+------ 0x00007E00 ------+
| bootloader (boot.asm) |
+------ 0x00007C00 ------+
| stack | TODO get real stack
+------ 0x00005000 ------+
| PT |
+------ 0x00004000 ------+
| PDT |
+------ 0x00003000 ------+
| PDPT |
+------ 0x00002000 ------+
| PML4T |
+------ 0x00001000 ------+
| |
| |
+------ 0x00000500 ------+
| bios stuff |
+------ 0x00000000 ------+
```
status: gets to long mode, loads+jumps to kernel, starts idt and gdt... :)
---

View File

28
bootle/README.md Normal file
View File

@@ -0,0 +1,28 @@
# bootle
hobby kernel written in rust. It's just for playing around... for now :p
run with `nix run git+https://git.mtgmonkey.net/andromeda/bootler#bootle`
### memory map
```
+------ 0x00100000 ------+
| hardware, bios stuff |
+------ 0x00080000 ------+
| |
| |
+------ 0x00010200 ------+
| kernel |
+------ 0x00010000 ------+
| bootloader stuff |
| includes stack, gdt, |
| idt for the time being |
+------ 0x00000500 ------+
| bios stuff |
+------ 0x00000000 ------+
```
---
this project follows [Common Changelog](https://common-changelog.org) guidelines

View File

@@ -6,14 +6,14 @@
qemu,
...
}: let
rust-toolchain = rust-bin.fromRustupToolchainFile ../../rust-toolchain.toml;
rust-toolchain = rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
naersk' = callPackage naersk {
cargo = rust-toolchain;
rustc = rust-toolchain;
clippy = rust-toolchain;
};
in (naersk'.buildPackage {
src = ../../.;
src = ./.;
# deps for rust-src
additionalCargoLock = "${rust-toolchain.availableComponents.rust-src}/lib/rustlib/src/rust/library/Cargo.lock";

7
bootler/CHANGELOG.md Normal file
View File

@@ -0,0 +1,7 @@
# Changelog
## [0.1.0] - 2026-03-06
### Added
- initialised CHANGELOG.md

43
bootler/README.md Normal file
View File

@@ -0,0 +1,43 @@
# bootler
hobby bootloader, 1-stage, legacy mode :p
run with `nix run git+https://git.mtgmonkey.net/andromeda/bootler#bootler`
### memory map
```
. .
: :
| longmode kernel |
+------ 0x00010000 ------+
| |
| |
+------ 0x00009000 ------+
| IDT |
+------ 0x00008000 ------+
| |
| |
+------ 0x00007E00 ------+
| bootloader (boot.asm) |
+------ 0x00007C00 ------+
| stack |
+------ 0x00005000 ------+
| PT |
+------ 0x00004000 ------+
| PDT |
+------ 0x00003000 ------+
| PDPT |
+------ 0x00002000 ------+
| PML4T |
+------ 0x00001000 ------+
| |
| |
+------ 0x00000500 ------+
| bios stuff |
+------ 0x00000000 ------+
```
---
this project follows [Common Changelog](https://common-changelog.org) guidelines

View File

@@ -9,19 +9,18 @@ in
stdenv.mkDerivation {
pname = "bootler";
version = "0.1.0";
src = ../../.;
src = ./.;
buildPhase = ''
${nasm}/bin/nasm asm/boot.asm -o boot.bin
${nasm}/bin/nasm asm/kernel.asm -o dummy.bin
dd if=/dev/zero of=${bootImg} bs=512 count=2
dd if=/dev/zero of=${bootImg} bs=512 count=2880
dd if=boot.bin of=${bootImg} conv=notrunc
dd if=dummy.bin of=${bootImg} bs=512 seek=1 conv=notrunc
'';
installPhase = ''
mkdir -p $out/bin
cp boot.bin $out/bin
cp dummy.bin $out/bin
cp ${bootImg} $out/bin
# create emulation binary

View File

@@ -18,15 +18,16 @@
...
}: let
system = "x86_64-linux";
pkgs = import nixpkgs {
inherit system;
overlays = [(import rust-overlay)];
};
pkgs = nixpkgs.legacyPackages.${system};
pkgsWithRustOverlay = pkgs.extend (import rust-overlay);
in {
packages.${system} = {
bootler = pkgs.callPackage ./nix/pkgs/bootler.nix {};
bootle = pkgs.callPackage ./nix/pkgs/bootle.nix {
naersk = naersk;
bootler = pkgs.callPackage ./bootler/package.nix {};
bootle = pkgsWithRustOverlay.callPackage ./bootle/package.nix {
inherit naersk;
bootler = self.packages.${system}.bootler;
};
twasm = pkgs.callPackage ./twasm/package.nix {
bootler = self.packages.${system}.bootler;
};
};
@@ -34,6 +35,7 @@
inputsFrom = [
self.packages.${system}.bootle
self.packages.${system}.bootler
self.packages.${system}.twasm
];
};
};

View File

@@ -1,47 +0,0 @@
{
stdenv,
nasm,
qemu,
...
}: let
bootImg = "boot";
in
stdenv.mkDerivation {
pname = "bootler";
version = "0.1.0";
src = ../.;
buildPhase = ''
${nasm}/bin/nasm asm/boot.asm -o boot.bin
${nasm}/bin/nasm asm/kernel.asm -o kernel.bin
dd if=/dev/zero of=${bootImg} bs=512 count=2
dd if=boot.bin of=${bootImg} conv=notrunc
dd if=kernel.bin of=${bootImg} bs=512 seek=1 conv=notrunc
'';
installPhase = ''
mkdir -p $out/bin
cp ${bootImg} $out/bin
# create emulation binary
cat<<EOF>$out/bin/bootler
#!/usr/bin/env bash
# create temp dir
mkdir -p ./.bootler
cp $(echo $out)/bin/${bootImg} ./.bootler/${bootImg}
chmod a+w ./.bootler/${bootImg}
# run image
${qemu}/bin/qemu-system-x86_64 \
-nographic \
-drive file=./.bootler/${bootImg},format=raw,index=0,media=disk
# clean up
rm ./.bootler -r
EOF
chmod +x $out/bin/${bootImg}
chmod +x $out/bin/bootler
'';
}

32
twasm/README.md Normal file
View File

@@ -0,0 +1,32 @@
# twasm
this will be a self hosted, very minimal subset of 64 bit asm
### goals
I want to compile Bootler and Twasm with the Twasm assembler
### memory map
```
+------ 0x00100000 ------+
| hardware, bios stuff |
+------ 0x00080000 ------+
| output binary |
+------ 0x00070000 ------+
| token table |
+------ 0x00060000 ------+
| |
| |
+------------------------+
| input |
+------------------------+ this is lined up to a sector
| | and this is less than a sector
+------------------------+
| assembler |
+------ 0x00010000 ------+
| bootloader, bios, etc. |
+------------------------+
```
each word represents a token on the token table.

161
twasm/asm/main.asm Normal file
View File

@@ -0,0 +1,161 @@
LOAD_ADDR equ 0x00010000 ; address this program is loaded at
TOKEN_TABLE_ADDR equ 0x00060000 ; address the token table is loaded at
TOKEN_TABLE_SIZE equ 0x1000 ; max length of table
TEST_ARENA_ADDR equ 0x00060000 ; address to run tests at
TEST_ARENA_SIZE equ 0x1000 ; maximum size tests can use
OUTPUT_ADDR equ 0x00070000 ; address of outputed binary
OUTPUT_SIZE equ 0x1000 ; max length of outputed binary
[bits 64]
[org LOAD_ADDR]
start:
mov rsi, msg_welcome
call print
call run_tests
jmp halt
;
; tokenising
;
; copy_token
;
; description:
; copies a token from one spot in memory to another
; and returns metadata about that token
;
; parameters:
; rdi -> start of asm command to be read
; rsi -> start of buffer to be written
;
; returned:
copy_token:
mov rax, rdi
.loop:
cmp al, " "
je .continue
jne .break
.continue:
call copy_byte
.break:
inc rax
ret
; copy_byte
;
; description:
; copies a byte from one spot in memory to another
;
; parameters:
; rdi -> word to be read
; rsi -> word to be written
;
; returned:
; al = byte that was read
copy_byte:
mov al, [rdi]
mov [rsi], al
ret
;
; utilities
;
; print
;
; description:
; prints a null-terminated string
;
; parameters:
; rsi -> start of null-terminated string
; dx = port to output to
print:
.loop:
mov al, [rsi]
test al, al
jz .done
out dx, al
inc rsi
jmp .loop
.done:
ret
; halt
;
; description:
; halts the program, silly :)
halt:
mov rsi, msg_halt
call print
hlt
jmp halt
;
; tests
;
; run_tests
;
; description:
; runs all tests
;
; parameters:
; dx = port to output to
run_tests:
mov rsi, .msg
call print
call test_copy_byte
ret
.msg db "running test suite...", 0x0D, 0x0A, 0x00
; test_copy_byte
;
; description:
; makes sure copy_byte function works by testing the following
; - that it copies one byte to a specified memory address
; - that it returns the copied byte in al
;
; parameters:
; dx = port to output to
test_copy_byte:
mov rsi, .msg
call print
mov rdi, test_byte ; byte to be copied
mov rsi, TEST_ARENA_ADDR ; location of test
call copy_byte
mov cx, [rsi]
cmp ax, cx ; compare returned byte to copied byte
jne .fail
je .pass
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.msg db "test_copy_byte...", 0x00
;
; data
;
msg_welcome db "Welcome to Twasm", 0x0D, 0x0A, 0x00
msg_halt db "halted.", 0x0D, 0x0A, 0x00
msg_pass db "passed.", 0x0D, 0x0A, 0x00
msg_fail db "failed.", 0x0D, 0x0A, 0x00
test_byte db "T"
test_token db "Test Token" ; two tokens, one followed by a space and one by nothing

41
twasm/package.nix Normal file
View File

@@ -0,0 +1,41 @@
{
bootler,
stdenv,
nasm,
qemu,
...
}:
stdenv.mkDerivation {
pname = "twasm";
version = "0.1.0";
src = ./.;
buildPhase = ''
${nasm}/bin/nasm asm/main.asm -o out.bin
'';
installPhase = ''
dd if=/dev/zero of=disk bs=512 count=2880
dd if=${bootler}/bin/boot.bin of=disk conv=notrunc
dd if=out.bin of=disk bs=512 seek=1 conv=notrunc
mkdir -p $out/bin
cat<<EOF>$out/bin/twasm
#!/usr/bin/env bash
mkdir -p ./.bootle
cp $(echo $out)/bin/disk ./.bootle/disk
chmod a+w ./.bootle/disk
${qemu}/bin/qemu-system-x86_64 \
-nographic \
-drive file=./.bootle/disk,format=raw,index=0,media=disk
rm ./.bootle -r
EOF
chmod +x $out/bin/twasm
cp out.bin $out/bin
cp disk $out/bin
'';
}