bunch of stuff idek
This commit is contained in:
46
README.md
46
README.md
@@ -2,53 +2,15 @@ Call me Terry Davis because... actually please don't. I have visions: aspiration
|
|||||||
|
|
||||||
# bootle
|
# 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
|
# 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`
|
status: gets to long mode, loads+jumps to kernel, starts idt and gdt... :)
|
||||||
|
|
||||||
### 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 ------+
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
0
Cargo.lock → bootle/Cargo.lock
generated
0
Cargo.lock → bootle/Cargo.lock
generated
28
bootle/README.md
Normal file
28
bootle/README.md
Normal 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
|
||||||
@@ -6,14 +6,14 @@
|
|||||||
qemu,
|
qemu,
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
rust-toolchain = rust-bin.fromRustupToolchainFile ../../rust-toolchain.toml;
|
rust-toolchain = rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
|
||||||
naersk' = callPackage naersk {
|
naersk' = callPackage naersk {
|
||||||
cargo = rust-toolchain;
|
cargo = rust-toolchain;
|
||||||
rustc = rust-toolchain;
|
rustc = rust-toolchain;
|
||||||
clippy = rust-toolchain;
|
clippy = rust-toolchain;
|
||||||
};
|
};
|
||||||
in (naersk'.buildPackage {
|
in (naersk'.buildPackage {
|
||||||
src = ../../.;
|
src = ./.;
|
||||||
|
|
||||||
# deps for rust-src
|
# deps for rust-src
|
||||||
additionalCargoLock = "${rust-toolchain.availableComponents.rust-src}/lib/rustlib/src/rust/library/Cargo.lock";
|
additionalCargoLock = "${rust-toolchain.availableComponents.rust-src}/lib/rustlib/src/rust/library/Cargo.lock";
|
||||||
7
bootler/CHANGELOG.md
Normal file
7
bootler/CHANGELOG.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## [0.1.0] - 2026-03-06
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- initialised CHANGELOG.md
|
||||||
43
bootler/README.md
Normal file
43
bootler/README.md
Normal 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
|
||||||
@@ -9,19 +9,18 @@ in
|
|||||||
stdenv.mkDerivation {
|
stdenv.mkDerivation {
|
||||||
pname = "bootler";
|
pname = "bootler";
|
||||||
version = "0.1.0";
|
version = "0.1.0";
|
||||||
src = ../../.;
|
src = ./.;
|
||||||
buildPhase = ''
|
buildPhase = ''
|
||||||
${nasm}/bin/nasm asm/boot.asm -o boot.bin
|
${nasm}/bin/nasm asm/boot.asm -o boot.bin
|
||||||
${nasm}/bin/nasm asm/kernel.asm -o dummy.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=boot.bin of=${bootImg} conv=notrunc
|
||||||
dd if=dummy.bin of=${bootImg} bs=512 seek=1 conv=notrunc
|
dd if=dummy.bin of=${bootImg} bs=512 seek=1 conv=notrunc
|
||||||
'';
|
'';
|
||||||
installPhase = ''
|
installPhase = ''
|
||||||
mkdir -p $out/bin
|
mkdir -p $out/bin
|
||||||
cp boot.bin $out/bin
|
cp boot.bin $out/bin
|
||||||
cp dummy.bin $out/bin
|
|
||||||
cp ${bootImg} $out/bin
|
cp ${bootImg} $out/bin
|
||||||
|
|
||||||
# create emulation binary
|
# create emulation binary
|
||||||
16
flake.nix
16
flake.nix
@@ -18,15 +18,16 @@
|
|||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
pkgs = import nixpkgs {
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
inherit system;
|
pkgsWithRustOverlay = pkgs.extend (import rust-overlay);
|
||||||
overlays = [(import rust-overlay)];
|
|
||||||
};
|
|
||||||
in {
|
in {
|
||||||
packages.${system} = {
|
packages.${system} = {
|
||||||
bootler = pkgs.callPackage ./nix/pkgs/bootler.nix {};
|
bootler = pkgs.callPackage ./bootler/package.nix {};
|
||||||
bootle = pkgs.callPackage ./nix/pkgs/bootle.nix {
|
bootle = pkgsWithRustOverlay.callPackage ./bootle/package.nix {
|
||||||
naersk = naersk;
|
inherit naersk;
|
||||||
|
bootler = self.packages.${system}.bootler;
|
||||||
|
};
|
||||||
|
twasm = pkgs.callPackage ./twasm/package.nix {
|
||||||
bootler = self.packages.${system}.bootler;
|
bootler = self.packages.${system}.bootler;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -34,6 +35,7 @@
|
|||||||
inputsFrom = [
|
inputsFrom = [
|
||||||
self.packages.${system}.bootle
|
self.packages.${system}.bootle
|
||||||
self.packages.${system}.bootler
|
self.packages.${system}.bootler
|
||||||
|
self.packages.${system}.twasm
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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
32
twasm/README.md
Normal 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
161
twasm/asm/main.asm
Normal 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
41
twasm/package.nix
Normal 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
|
||||||
|
'';
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user