Initial commit
This commit is contained in:
commit
c32493cdf2
2
.cargo/config.toml
Normal file
2
.cargo/config.toml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
[unstable]
|
||||||
|
bindeps = true
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/target
|
1078
Cargo.lock
generated
Normal file
1078
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
14
Cargo.toml
Normal file
14
Cargo.toml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
[package]
|
||||||
|
name = "os"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
bootloader = "0.11"
|
||||||
|
kernel = { path = "kernel", artifact = "bin", target = "x86_64-unknown-none" }
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
# used for UEFI booting in QEMU
|
||||||
|
ovmf-prebuilt = "0.1.0-alpha.1"
|
||||||
|
|
||||||
|
[workspace]
|
||||||
|
members = ["kernel"]
|
36
OST OS/info.txt
Normal file
36
OST OS/info.txt
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
https://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf
|
||||||
|
CURRENT PAGE: 46
|
||||||
|
|
||||||
|
|
||||||
|
Name:
|
||||||
|
Obsidian Starlight OS
|
||||||
|
|
||||||
|
|
||||||
|
Compile Assembly:
|
||||||
|
cd "\Users\05wse01\Desktop\OST OS"
|
||||||
|
C:\Users\05wse01\AppData\Local\bin\NASM\nasm.exe boot_sect.asm -f bin -o boot_sect.bin
|
||||||
|
|
||||||
|
NOTE: The boot_sect.bin date wont change in the process... To clear out some confusions
|
||||||
|
|
||||||
|
|
||||||
|
Create VirtualBox disk:
|
||||||
|
Open admin cmd
|
||||||
|
cd "\Program Files\Oracle\VirtualBox"
|
||||||
|
VBoxManage.exe convertfromraw "C:\Users\05wse01\Desktop\OST OS\target" "C:\Users\05wse01\Desktop\OST OS\output.vdi" --format VDI
|
||||||
|
|
||||||
|
NOTE: Target has to be larger than 1mb (check file size in explorer)
|
||||||
|
AND: The file has to be a multiply of 512
|
||||||
|
AND: You need to set the the file as an available virtual disk in the VirtualBox interface (how?.. IDK)
|
||||||
|
|
||||||
|
|
||||||
|
Qemu emulator:
|
||||||
|
cd "C:\Program Files\qemu"
|
||||||
|
qemu-system-x86_64w.exe "C:\Users\05wse01\Desktop\OST OS\boot_sect.bin"
|
||||||
|
|
||||||
|
|
||||||
|
Compile C:
|
||||||
|
gcc -ffreestanding -c basic.c -o basic.o
|
||||||
|
ld -o basic.bin -Ttext 0x0 --oformat binary basic.o
|
||||||
|
ndisasm -b 32 basic.bin > basic.dis
|
||||||
|
Clean out rows with:
|
||||||
|
0000 add [eax],al
|
4
OST OS/kernel/basic.c
Normal file
4
OST OS/kernel/basic.c
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
int my_function () {
|
||||||
|
int my_var = 0xbaba ;
|
||||||
|
return my_var ;
|
||||||
|
}
|
2097160
OST OS/kernel/basic.dis
Normal file
2097160
OST OS/kernel/basic.dis
Normal file
File diff suppressed because it is too large
Load diff
15
OST OS/old/temp.asm
Normal file
15
OST OS/old/temp.asm
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
[ org 0x7c00 ]
|
||||||
|
|
||||||
|
mov ebx, RANDOM_MSG,
|
||||||
|
call printLn
|
||||||
|
|
||||||
|
mov dx, 0x1fb6 ; store the value to print in dx
|
||||||
|
call print_hex ; call the function
|
||||||
|
|
||||||
|
%include "./print/print.asm"
|
||||||
|
%include "./print/print_hex.asm"
|
||||||
|
|
||||||
|
RANDOM_MSG: db 'Will this work?',0
|
||||||
|
|
||||||
|
times 510-($-$$) db 0 ; Pad the boot sector out with zeros
|
||||||
|
dw 0xaa55
|
0
OST OS/os/basic.dis
Normal file
0
OST OS/os/basic.dis
Normal file
42
OST OS/os/boot_sect_16.asm
Normal file
42
OST OS/os/boot_sect_16.asm
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
[ org 0x7c00 ] ; Tells the assemble to start inside the boot location
|
||||||
|
|
||||||
|
mov [BOOT_DRIVE], dl
|
||||||
|
|
||||||
|
|
||||||
|
mov bp, 0x8000
|
||||||
|
mov sp, bp
|
||||||
|
|
||||||
|
mov ebx, BOOTING_MSG
|
||||||
|
mov edx, 2
|
||||||
|
call print
|
||||||
|
|
||||||
|
mov bx, 0x9000
|
||||||
|
mov dh, 5
|
||||||
|
mov dl, [BOOT_DRIVE]
|
||||||
|
call disk_load
|
||||||
|
|
||||||
|
mov dx, [0x9000]
|
||||||
|
call print_hex
|
||||||
|
|
||||||
|
mov dx, [0x9000 + 512]
|
||||||
|
call print_hex
|
||||||
|
|
||||||
|
jmp $
|
||||||
|
|
||||||
|
; Imports print
|
||||||
|
%include "./x16/print/print.asm"
|
||||||
|
%include "./x16/print/print_hex.asm"
|
||||||
|
%include "./x16/disk/disk_load.asm"
|
||||||
|
|
||||||
|
BOOT_DRIVE: db 0
|
||||||
|
|
||||||
|
BOOTING_MSG: db 'Booting Obsidian Starlight OS (OST OS)',0
|
||||||
|
RANDOM_MSG: db 'Ya like jazz?',0
|
||||||
|
|
||||||
|
times 510-($-$$) db 0 ; Pad the boot sector out with zeros
|
||||||
|
dw 0xaa55
|
||||||
|
|
||||||
|
times 256 dw 0xdada
|
||||||
|
times 256 dw 0xface
|
||||||
|
|
||||||
|
times 2097152 db 0 ; Only for VirtualBox
|
33
OST OS/os/boot_sect_32.asm
Normal file
33
OST OS/os/boot_sect_32.asm
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
[org 0x7c00]
|
||||||
|
|
||||||
|
mov bp, 0x9000
|
||||||
|
mov sp, bp
|
||||||
|
|
||||||
|
mov bx, MSG_REAL_MODE
|
||||||
|
call writeLn
|
||||||
|
|
||||||
|
call switch_to_pm
|
||||||
|
|
||||||
|
jmp $
|
||||||
|
|
||||||
|
%include "./x16/print/print.asm"
|
||||||
|
%include "./x32/init/gdt.asm"
|
||||||
|
%include "./x32/print/print_string_pm.asm"
|
||||||
|
%include "./x32/init/switch_to_pm.asm"
|
||||||
|
|
||||||
|
[bits 32]
|
||||||
|
|
||||||
|
BEGIN_PM:
|
||||||
|
mov ebx, MSG_PROT_MODE
|
||||||
|
call print_string_pm
|
||||||
|
|
||||||
|
jmp $
|
||||||
|
|
||||||
|
|
||||||
|
MSG_REAL_MODE: db "Starting OST OS in 16-bit Real Mode", 0
|
||||||
|
MSG_PROT_MODE: db "Successfully landed Obsidian Starlight in 32-bit Protected Mode", 0
|
||||||
|
|
||||||
|
times 510-($-$$) db 0
|
||||||
|
dw 0xaa55
|
||||||
|
|
||||||
|
;times 2097152 db 0 ; Only for VirtualBox
|
24
OST OS/os/x16/disk/disk_load.asm
Normal file
24
OST OS/os/x16/disk/disk_load.asm
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
disk_load:
|
||||||
|
push dx
|
||||||
|
|
||||||
|
mov ah, 0x02
|
||||||
|
mov al, dh
|
||||||
|
mov ch, 0x00
|
||||||
|
mov dh, 0x00
|
||||||
|
mov cl, 0x02
|
||||||
|
|
||||||
|
int 0x13
|
||||||
|
|
||||||
|
jc disk_error
|
||||||
|
|
||||||
|
pop dx
|
||||||
|
cmp dh, al
|
||||||
|
jne disk_error
|
||||||
|
ret
|
||||||
|
|
||||||
|
disk_error:
|
||||||
|
mov ebx, DISK_ERROR_MSG
|
||||||
|
call writeLn
|
||||||
|
jmp $
|
||||||
|
|
||||||
|
DISK_ERROR_MSG: db "Disk read error!", 0
|
33
OST OS/os/x16/print/print.asm
Normal file
33
OST OS/os/x16/print/print.asm
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
[ org 0x7c00 ]
|
||||||
|
|
||||||
|
write:
|
||||||
|
mov edx, 0
|
||||||
|
jmp print
|
||||||
|
|
||||||
|
writeLn:
|
||||||
|
mov edx, 1
|
||||||
|
|
||||||
|
print:
|
||||||
|
mov ah, 0x0e
|
||||||
|
|
||||||
|
print_loop:
|
||||||
|
mov al, [ ebx ]
|
||||||
|
cmp al, 0
|
||||||
|
je finish
|
||||||
|
int 0x10
|
||||||
|
add ebx, 0x01
|
||||||
|
call print_loop
|
||||||
|
|
||||||
|
finish:
|
||||||
|
cmp edx, 0
|
||||||
|
jle end
|
||||||
|
|
||||||
|
new_line:
|
||||||
|
mov al, 13
|
||||||
|
int 0x10
|
||||||
|
mov al, 10
|
||||||
|
int 0x10
|
||||||
|
dec edx
|
||||||
|
|
||||||
|
end:
|
||||||
|
ret
|
25
OST OS/os/x16/print/print_hex.asm
Normal file
25
OST OS/os/x16/print/print_hex.asm
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
print_hex:
|
||||||
|
mov cx, 4
|
||||||
|
mov di, HEX_OUT + 6
|
||||||
|
|
||||||
|
convert_loop:
|
||||||
|
mov ax, dx
|
||||||
|
and ax, 0x000F
|
||||||
|
|
||||||
|
add al, '0'
|
||||||
|
cmp al, '9'
|
||||||
|
jbe not_hex_letter
|
||||||
|
add al, 7
|
||||||
|
|
||||||
|
not_hex_letter:
|
||||||
|
dec di
|
||||||
|
mov [di], al
|
||||||
|
|
||||||
|
shr dx, 4
|
||||||
|
loop convert_loop
|
||||||
|
|
||||||
|
mov bx, HEX_OUT
|
||||||
|
call writeLn
|
||||||
|
ret
|
||||||
|
|
||||||
|
HEX_OUT: db '0x0000', 0
|
34
OST OS/os/x32/init/gdt.asm
Normal file
34
OST OS/os/x32/init/gdt.asm
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
; GDT
|
||||||
|
gdt_start:
|
||||||
|
|
||||||
|
gdt_null:
|
||||||
|
dd 0x0
|
||||||
|
dd 0x0
|
||||||
|
|
||||||
|
gdt_code:
|
||||||
|
dw 0xffff
|
||||||
|
dw 0x0
|
||||||
|
db 0x0
|
||||||
|
db 10011010b
|
||||||
|
db 11001111b
|
||||||
|
db 0x0
|
||||||
|
|
||||||
|
gdt_data:
|
||||||
|
dw 0xffff
|
||||||
|
dw 0x0
|
||||||
|
db 0x0
|
||||||
|
db 10010010b
|
||||||
|
db 11001111b
|
||||||
|
db 0x0
|
||||||
|
|
||||||
|
gdt_end:
|
||||||
|
|
||||||
|
|
||||||
|
gdt_descriptor:
|
||||||
|
dw gdt_end - gdt_start - 1
|
||||||
|
|
||||||
|
dd gdt_start
|
||||||
|
|
||||||
|
|
||||||
|
CODE_SEG equ gdt_code - gdt_start
|
||||||
|
DATA_SEG equ gdt_data - gdt_start
|
26
OST OS/os/x32/init/switch_to_pm.asm
Normal file
26
OST OS/os/x32/init/switch_to_pm.asm
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
[bits 16]
|
||||||
|
|
||||||
|
switch_to_pm:
|
||||||
|
cli
|
||||||
|
|
||||||
|
lgdt [gdt_descriptor]
|
||||||
|
|
||||||
|
mov eax, cr0
|
||||||
|
or eax, 0x1
|
||||||
|
mov cr0, eax
|
||||||
|
|
||||||
|
jmp CODE_SEG:init_pm
|
||||||
|
|
||||||
|
[bits 32]
|
||||||
|
init_pm:
|
||||||
|
mov ax, DATA_SEG
|
||||||
|
mov ds, ax
|
||||||
|
mov ss, ax
|
||||||
|
mov es, ax
|
||||||
|
mov fs, ax
|
||||||
|
mov gs, ax
|
||||||
|
|
||||||
|
mov ebp, 0x90000
|
||||||
|
mov esp, ebp
|
||||||
|
|
||||||
|
call BEGIN_PM
|
24
OST OS/os/x32/print/print_string_pm.asm
Normal file
24
OST OS/os/x32/print/print_string_pm.asm
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
[bits 32]
|
||||||
|
; Define some constants
|
||||||
|
VIDEO_MEMORY equ 0xb8000
|
||||||
|
WHITE_ON_BLACK equ 0x0f
|
||||||
|
|
||||||
|
; prints a null - terminated string pointed to by EDX
|
||||||
|
print_string_pm:
|
||||||
|
pusha
|
||||||
|
mov edx, VIDEO_MEMORY ; Set edx to the start of vid mem.
|
||||||
|
|
||||||
|
print_string_pm_loop:
|
||||||
|
mov al, [ ebx ] ; Store the char at EBX in AL
|
||||||
|
mov ah, WHITE_ON_BLACK ; Store the attributes in AH
|
||||||
|
cmp al, 0 ; if ( al == 0) , at end of string , so
|
||||||
|
je print_string_pm_done ; jump to done
|
||||||
|
mov [ edx ], ax ; Store char and attributes at current
|
||||||
|
; character cell.
|
||||||
|
add ebx, 1 ; Increment EBX to the next char in string.
|
||||||
|
add edx, 2 ; Move to next character cell in vid mem.
|
||||||
|
jmp print_string_pm_loop ; loop around to print the next char.
|
||||||
|
|
||||||
|
print_string_pm_done:
|
||||||
|
popa
|
||||||
|
ret ; Return from the function
|
BIN
OST OS/output1.vdi
Normal file
BIN
OST OS/output1.vdi
Normal file
Binary file not shown.
BIN
OST OS/output2.vdi
Normal file
BIN
OST OS/output2.vdi
Normal file
Binary file not shown.
BIN
OST OS/output3.vdi
Normal file
BIN
OST OS/output3.vdi
Normal file
Binary file not shown.
BIN
OST OS/output4.vdi
Normal file
BIN
OST OS/output4.vdi
Normal file
Binary file not shown.
BIN
OST OS/output5.vdi
Normal file
BIN
OST OS/output5.vdi
Normal file
Binary file not shown.
BIN
OST OS/output6.vdi
Normal file
BIN
OST OS/output6.vdi
Normal file
Binary file not shown.
BIN
OST OS/output7.vdi
Normal file
BIN
OST OS/output7.vdi
Normal file
Binary file not shown.
21
build.rs
Normal file
21
build.rs
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// set by cargo, build scripts should use this directory for output files
|
||||||
|
let out_dir = PathBuf::from(std::env::var_os("OUT_DIR").unwrap());
|
||||||
|
// set by cargo's artifact dependency feature, see
|
||||||
|
// https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#artifact-dependencies
|
||||||
|
let kernel = PathBuf::from(std::env::var_os("CARGO_BIN_FILE_KERNEL_kernel").unwrap());
|
||||||
|
|
||||||
|
// create an UEFI disk image (optional)
|
||||||
|
let uefi_path = out_dir.join("uefi.img");
|
||||||
|
bootloader::UefiBoot::new(&kernel).create_disk_image(&uefi_path).unwrap();
|
||||||
|
|
||||||
|
// create a BIOS disk image
|
||||||
|
let bios_path = out_dir.join("bios.img");
|
||||||
|
bootloader::BiosBoot::new(&kernel).create_disk_image(&bios_path).unwrap();
|
||||||
|
|
||||||
|
// pass the disk image paths as env variables to the `main.rs`
|
||||||
|
println!("cargo:rustc-env=UEFI_PATH={}", uefi_path.display());
|
||||||
|
println!("cargo:rustc-env=BIOS_PATH={}", bios_path.display());
|
||||||
|
}
|
16
kernel/Cargo.lock
generated
Normal file
16
kernel/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_api"
|
||||||
|
version = "0.11.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a35ba5100c2431e20b924c8103c2cf8adb919ed9880f625e8770c3cb9d1b06aa"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "geos"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"bootloader_api",
|
||||||
|
]
|
15
kernel/Cargo.toml
Normal file
15
kernel/Cargo.toml
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
[package]
|
||||||
|
name = "kernel"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
bootloader_api = "0.11.7"
|
||||||
|
|
||||||
|
[profile.dev]
|
||||||
|
panic = "abort"
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
panic = "abort"
|
26
kernel/src/main.rs
Normal file
26
kernel/src/main.rs
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#![no_std]
|
||||||
|
#![no_main]
|
||||||
|
|
||||||
|
use core::panic::PanicInfo;
|
||||||
|
|
||||||
|
static HELLO: &[u8] = b"Hello World!";
|
||||||
|
|
||||||
|
bootloader_api::entry_point!(kernel_main);
|
||||||
|
fn kernel_main(boot_info: &'static mut bootloader_api::BootInfo) -> ! {
|
||||||
|
let vga_buffer = 0xb8000 as *mut u8;
|
||||||
|
|
||||||
|
for (i, &byte) in HELLO.iter().enumerate() {
|
||||||
|
unsafe {
|
||||||
|
*vga_buffer.offset(i as isize * 2) = byte;
|
||||||
|
*vga_buffer.offset(i as isize * 2 + 1) = 0xb;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[panic_handler]
|
||||||
|
fn handler(_info: &PanicInfo) -> ! {
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
|
1
rust-toolchain
Normal file
1
rust-toolchain
Normal file
|
@ -0,0 +1 @@
|
||||||
|
nightly
|
36
shell.nix
Normal file
36
shell.nix
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
{ pkgs ? import <nixpkgs> {} }:
|
||||||
|
pkgs.mkShell rec {
|
||||||
|
buildInputs = with pkgs; [
|
||||||
|
clang
|
||||||
|
llvmPackages_17.bintools
|
||||||
|
rustup
|
||||||
|
qemu
|
||||||
|
];
|
||||||
|
RUSTC_VERSION = pkgs.lib.readFile ./rust-toolchain;
|
||||||
|
# https://github.com/rust-lang/rust-bindgen#environment-variables
|
||||||
|
LIBCLANG_PATH = pkgs.lib.makeLibraryPath [ pkgs.llvmPackages_latest.libclang.lib ];
|
||||||
|
shellHook = ''
|
||||||
|
rustup component add llvm-tools-preview
|
||||||
|
rustup component add rust-analyzer
|
||||||
|
rustup target add x86_64-unknown-none
|
||||||
|
export PATH=$PATH:''${CARGO_HOME:-~/.cargo}/bin
|
||||||
|
export PATH=$PATH:''${RUSTUP_HOME:-~/.rustup}/toolchains/$RUSTC_VERSION-x86_64-unknown-linux-gnu/bin/
|
||||||
|
'';
|
||||||
|
# Add precompiled library to rustc search path
|
||||||
|
RUSTFLAGS = (builtins.map (a: ''-L ${a}/lib'') [
|
||||||
|
# add libraries here (e.g. pkgs.libvmi)
|
||||||
|
]);
|
||||||
|
# Add glibc, clang, glib, and other headers to bindgen search path
|
||||||
|
BINDGEN_EXTRA_CLANG_ARGS =
|
||||||
|
# Includes normal include path
|
||||||
|
(builtins.map (a: ''-I"${a}/include"'') [
|
||||||
|
# add dev libraries here (e.g. pkgs.libvmi.dev)
|
||||||
|
pkgs.glibc.dev
|
||||||
|
])
|
||||||
|
# Includes with special directory paths
|
||||||
|
++ [
|
||||||
|
''-I"${pkgs.llvmPackages_latest.libclang.lib}/lib/clang/${pkgs.llvmPackages_latest.libclang.version}/include"''
|
||||||
|
''-I"${pkgs.glib.dev}/include/glib-2.0"''
|
||||||
|
''-I${pkgs.glib.out}/lib/glib-2.0/include/''
|
||||||
|
];
|
||||||
|
}
|
20
src/main.rs
Normal file
20
src/main.rs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
fn main() {
|
||||||
|
// read env variables that were set in build script
|
||||||
|
let uefi_path = env!("UEFI_PATH");
|
||||||
|
let bios_path = env!("BIOS_PATH");
|
||||||
|
|
||||||
|
// choose whether to start the UEFI or BIOS image
|
||||||
|
let uefi = false;
|
||||||
|
|
||||||
|
println!("{}", bios_path);
|
||||||
|
|
||||||
|
let mut cmd = std::process::Command::new("qemu-system-x86_64");
|
||||||
|
if uefi {
|
||||||
|
cmd.arg("-bios").arg(ovmf_prebuilt::ovmf_pure_efi());
|
||||||
|
cmd.arg("-drive").arg(format!("format=raw,file={uefi_path}"));
|
||||||
|
} else {
|
||||||
|
cmd.arg("-drive").arg(format!("format=raw,file={bios_path}"));
|
||||||
|
}
|
||||||
|
let mut child = cmd.spawn().unwrap();
|
||||||
|
child.wait().unwrap();
|
||||||
|
}
|
Loading…
Reference in a new issue