chore: make sure kernel.cr loads@@ -24,7 +24,13 @@ use_crystal_kernel=true
if [ "$use_crystal_kernel" = true ]
then
- crystal build --no-debug -Dkernel --cross-compile --target i386-unknown-linux-elf --prelude=../prelude.cr -o ./build/kernel ./kernel/kernel.cr
+ # Build crystal kernel without stdlib, using the custom prelude, and targeting i386-unknown-linux-elf
+ crystal build \
+ --no-debug -Dkernel \
+ --cross-compile --target i386-unknown-linux-elf \
+ --prelude=../prelude.cr \
+ -o ./build/kernel ./kernel/kernel.cr
+
# The object file should be at ./build/kernel.o, now link it with the entry point
ld -m elf_i386 -nostdlib -T ./kernel/linker.ld -o ./bin/kernel.bin ./build/kernelEntryPoint.o ./build/kernel.o || exit 1
else
@@ -33,10 +39,11 @@ fi
cp ./bin/kernel.bin ./iso/boot/kernel.bin || exit 1
-# touch ./bin/kernel.bin
./tools/genVDisk --output "crystalos.img" --floppy \
--bootloader ./bin/bootloader.bin --kernel ./bin/kernel.bin
+# Run
+
echo -e "\nRunning..."
qemu-system-i386 -drive if=floppy,index=0,format=raw,file=crystalos.img || exit 1
@@ -31,28 +31,44 @@ def clear_screen
end
end
+# clear screen using asm (intel) instructions
+def clear_screen_asm
+ asm(%(
+ mov %ax, 0xB8000
+ mov %es, %ax
+ xor %di, %di
+ mov %cx, 80 * 25
+ mov %al, ' '
+ mov %ah, 0x07
+ rep stosw
+ ))
+end
+
fun kmain
# IDT.enable_interrupts
# kprint "Hello from Fluorite."
address = Pointer(UInt8).new(0xb8000)
- string = "[CrystalOS Kernel] Hello from Crystal"
- # string_size = 33 # string.size
+ message = "[CrystalOS Kernel] Hello from Crystal\n"
+ # puts message
- # clear_screen
+ clear_screen
# Loop over each character in the string
- # i = 0
- # while i < string.size
- # # Write the character
- # address.value = string[i].to_u8
- # address += 1
- # # Write the attribute byte
- # address.value = 0xA0.to_u8
- # address += 1
- # i += 1
- # end
+ i = 0
+ while i < message.size
+ # Write the character
+ address.value = message[i].to_u8
+ address += 1
+ # Write the attribute byte
+ address.value = 0xA0.to_u8
+ address += 1
+ i += 1
+ end
+
+ while true
+ end
# prevent bootloader to take back
# while true
@@ -1,6 +1,5 @@
require "./prelude/atomic"
require "./prelude/primitives"
-require "./prelude/puts"
# order matters
require "./prelude/crystal_core/object"
@@ -22,4 +21,5 @@ require "./prelude/crystal_core/tuple"
require "./prelude/crystal_core/range"
require "./prelude/crystal_core/string"
require "./prelude/crystal_core/reference"
-require "./prelude/crystal_core/static_array"
+require "./prelude/crystal_core/static_array"
+require "./prelude/puts"
@@ -15,6 +15,3 @@ def puts(str : String)
end
end
-# Example usage with a static NUL-terminated string
-message = "[CrystalOS Kernel] Hello from C++\0"
-puts(message)