Compare commits
8 Commits
cleanup-re
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e8c4847b12 | ||
|
|
7e4cedcdc0 | ||
|
|
80a5815731 | ||
|
|
3ef8cbbf8c | ||
|
|
95c8480aac | ||
|
|
d504aa2a6d | ||
|
|
288dd537c0 | ||
|
|
4d80e10dbd |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,5 +1,8 @@
|
|||||||
|
|
||||||
*.o
|
*.o
|
||||||
|
*.iso
|
||||||
|
*.bin
|
||||||
gamarjoba_munde/gamarjoba
|
gamarjoba_munde/gamarjoba
|
||||||
baremetal_gamarjoba/baremetal_gamarjoba
|
baremetal_gamarjoba/baremetal_gamarjoba
|
||||||
keyboard/keyboard_kernel
|
keyboard/keyboard_kernel
|
||||||
|
target/
|
||||||
|
|||||||
48
Makefile
48
Makefile
@@ -1,48 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
gamarjoba: gamarjoba.asm
|
|
||||||
nasm -f elf64 -o gamarjoba.o gamarjoba.asm
|
|
||||||
ld -o gamarjoba gamarjoba.o
|
|
||||||
|
|
||||||
run_gamarjoba: gamarjoba
|
|
||||||
./gamarjoba
|
|
||||||
|
|
||||||
baremetal_gamarjoba: baremetal_gamarjoba.asm include.c
|
|
||||||
gcc -m32 -ffreestanding -o include.o -c include.c
|
|
||||||
nasm -f elf32 baremetal_gamarjoba.asm
|
|
||||||
ld -m elf_i386 -nostdlib -T linker.ld baremetal_gamarjoba.o include.o -o baremetal_gamarjoba
|
|
||||||
|
|
||||||
run_baremetal_gamarjoba: baremetal_gamarjoba
|
|
||||||
qemu-system-i386 -kernel baremetal_gamarjoba
|
|
||||||
|
|
||||||
keyboard: keyboard.asm c_keyboard.c keyboard.rs
|
|
||||||
gcc -m32 -ffreestanding -o c_keyboard.o -c c_keyboard.c
|
|
||||||
rustc --emit obj -o rust_keyboard.o --target i686-unknown-linux-gnu keyboard.rs
|
|
||||||
nasm -f elf32 keyboard.asm
|
|
||||||
ld -m elf_i386 -nostdlib -T linker.ld keyboard.o c_keyboard.o rust_keyboard.o -o keyboard
|
|
||||||
|
|
||||||
run_keyboard: keyboard
|
|
||||||
qemu-system-i386 -kernel keyboard
|
|
||||||
|
|
||||||
run_terminal_keyboard: keyboard
|
|
||||||
qemu-system-i386 -display curses -kernel keyboard
|
|
||||||
|
|
||||||
|
|
||||||
lightshow: lightshow.asm lightshow.rs
|
|
||||||
rustc --emit obj -o lightshow_rust.o --target i686-unknown-linux-gnu -g lightshow.rs
|
|
||||||
nasm -f elf32 -g lightshow.asm
|
|
||||||
ld -m elf_i386 -nostdlib -T linker.ld lightshow.o lightshow_rust.o -o lightshow
|
|
||||||
|
|
||||||
run_lightshow: lightshow
|
|
||||||
qemu-system-i386 -kernel lightshow
|
|
||||||
|
|
||||||
debug_lightshow: lightshow
|
|
||||||
qemu-system-i386 -kernel lightshow -gdb tcp::9999 -S
|
|
||||||
|
|
||||||
.PHONY: clean
|
|
||||||
clean:
|
|
||||||
rm -f *.o
|
|
||||||
rm -f gamarjoba
|
|
||||||
rm -f baremetal_gamarjoba
|
|
||||||
rm -f keyboard
|
|
||||||
rm -f lightshow
|
|
||||||
@@ -9,6 +9,7 @@ This repo contains the following executables:
|
|||||||
* `baremetal_gamarjoba` - bare-metal x86 program run with QEMU
|
* `baremetal_gamarjoba` - bare-metal x86 program run with QEMU
|
||||||
* `keyboard` - reads keycode information from keyboard. Also uses both Rust and C includes.
|
* `keyboard` - reads keycode information from keyboard. Also uses both Rust and C includes.
|
||||||
* `lightshow` - NOTE: Broken - an attempt at a substantial #[no_core] rust object file, currently crashes rustc
|
* `lightshow` - NOTE: Broken - an attempt at a substantial #[no_core] rust object file, currently crashes rustc
|
||||||
|
* `rust_kernel` - me following the 2015 version of the Phil Opp rust bare metal tutorial. Kept around for posterity
|
||||||
|
|
||||||
# Useful links
|
# Useful links
|
||||||
|
|
||||||
|
|||||||
6
justfile
6
justfile
@@ -1,6 +1,12 @@
|
|||||||
default:
|
default:
|
||||||
just --list
|
just --list
|
||||||
|
|
||||||
|
execute_rust_os:
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
cd os-in-rust
|
||||||
|
cargo bootimage
|
||||||
|
qemu-system-x86_64 -drive format=raw,file=target/x86_64_target/debug/bootimage-os-in-rust.bin
|
||||||
|
|
||||||
run_gamarjoba: build_gamarjoba
|
run_gamarjoba: build_gamarjoba
|
||||||
./gamarjoba_munde/gamarjoba
|
./gamarjoba_munde/gamarjoba
|
||||||
|
|
||||||
|
|||||||
6
os-in-rust/.cargo/config.toml
Normal file
6
os-in-rust/.cargo/config.toml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[unstable]
|
||||||
|
build-std = ["core", "compiler_builtins"]
|
||||||
|
build-std-features = ["compiler-builtins-mem"]
|
||||||
|
|
||||||
|
[build]
|
||||||
|
target = "x86_64_target.json"
|
||||||
16
os-in-rust/Cargo.lock
generated
Normal file
16
os-in-rust/Cargo.lock
generated
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bootloader"
|
||||||
|
version = "0.9.21"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a62c8f6168cd106687ee36a2b71a46c4144d73399f72814104d33094b8092fd2"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "os-in-rust"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"bootloader",
|
||||||
|
]
|
||||||
10
os-in-rust/Cargo.toml
Normal file
10
os-in-rust/Cargo.toml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
[package]
|
||||||
|
name = "os-in-rust"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
#bootloader = "0.10.12"
|
||||||
|
bootloader = "0.9.8"
|
||||||
30
os-in-rust/src/main.rs
Normal file
30
os-in-rust/src/main.rs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#![no_std]
|
||||||
|
#![no_main]
|
||||||
|
|
||||||
|
use core::panic::PanicInfo;
|
||||||
|
|
||||||
|
#[panic_handler]
|
||||||
|
fn panic(_info: &PanicInfo) -> ! {
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
|
||||||
|
static GAMARJOBA: &[u8] = b"Gamarjoba, MVNDE!";
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn _start() -> ! {
|
||||||
|
let vga_buffer = 0xb8000 as *mut u8;
|
||||||
|
|
||||||
|
for (i, &byte) in GAMARJOBA.iter().enumerate() {
|
||||||
|
let i = i as isize;
|
||||||
|
unsafe {
|
||||||
|
*vga_buffer.offset(i * 2) = byte;
|
||||||
|
*vga_buffer.offset(i * 2 + 1) = 0xd;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
|
||||||
18
os-in-rust/x86_64_target.json
Normal file
18
os-in-rust/x86_64_target.json
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"llvm-target": "x86_64-unknown-none",
|
||||||
|
"data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"target-endian": "little",
|
||||||
|
"target-pointer-width": "64",
|
||||||
|
"target-c-int-width": "32",
|
||||||
|
"os": "none",
|
||||||
|
"executables": true,
|
||||||
|
|
||||||
|
"linker-flavor": "ld.lld",
|
||||||
|
"linker": "rust-lld",
|
||||||
|
|
||||||
|
"panic-strategy": "abort",
|
||||||
|
"disable-redzone": true,
|
||||||
|
|
||||||
|
"features": "-mmx,-sse,+soft-float"
|
||||||
|
}
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
global start
|
|
||||||
|
|
||||||
section .text
|
|
||||||
bits 32
|
|
||||||
start:
|
|
||||||
mov dword [0xb800], 0x2f4b2f4f
|
|
||||||
hlt
|
|
||||||
7
thousand-line-os/Cargo.lock
generated
Normal file
7
thousand-line-os/Cargo.lock
generated
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 4
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thousand-line-os"
|
||||||
|
version = "0.1.0"
|
||||||
6
thousand-line-os/Cargo.toml
Normal file
6
thousand-line-os/Cargo.toml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "thousand-line-os"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
3
thousand-line-os/README.md
Normal file
3
thousand-line-os/README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Thousand Line OS
|
||||||
|
|
||||||
|
Aspirational. Following https://operating-system-in-1000-lines.vercel.app/en/
|
||||||
11
thousand-line-os/justfile
Normal file
11
thousand-line-os/justfile
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
_default:
|
||||||
|
@just --list
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
run:
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
QEMU=qemu-system-riscv32
|
||||||
|
# Start QEMU
|
||||||
|
$QEMU -machine virt -bios default -nographic -serial mon:stdio --no-reboot
|
||||||
28
thousand-line-os/kernel.ld
Normal file
28
thousand-line-os/kernel.ld
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
ENTRY(boot)
|
||||||
|
|
||||||
|
SECTIONS {
|
||||||
|
. = 0x80200000;
|
||||||
|
|
||||||
|
.text :{
|
||||||
|
KEEP(*(.text.boot));
|
||||||
|
*(.text .text.*);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rodata : ALIGN(4) {
|
||||||
|
*(.rodata .rodata.*);
|
||||||
|
}
|
||||||
|
|
||||||
|
.data : ALIGN(4) {
|
||||||
|
*(.data .data.*);
|
||||||
|
}
|
||||||
|
|
||||||
|
.bss : ALIGN(4) {
|
||||||
|
__bss = .;
|
||||||
|
*(.bss .bss.* .sbss .sbss.*);
|
||||||
|
__bss_end = .;
|
||||||
|
}
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
. += 128 * 1024; /* 128KB */
|
||||||
|
__stack_top = .;
|
||||||
|
}
|
||||||
14
thousand-line-os/src/lib.rs
Normal file
14
thousand-line-os/src/lib.rs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
#![no_std]
|
||||||
|
#![no_main]
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn _start() -> ! {
|
||||||
|
init()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn init() -> ! {
|
||||||
|
loop {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user