mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-09-08 03:47:15 -04:00
Load the kernel
This commit is contained in:
parent
60d159af6f
commit
2892baa993
1
Makefile
1
Makefile
@ -15,6 +15,7 @@ thor.flp: bootloader/stage1.bin bootloader/stage2.bin kernel/kernel.bin
|
|||||||
dd if=bootloader/stage1.bin of=hdd.img conv=notrunc
|
dd if=bootloader/stage1.bin of=hdd.img conv=notrunc
|
||||||
dd if=bootloader/stage2.bin of=hdd.img seek=1 conv=notrunc
|
dd if=bootloader/stage2.bin of=hdd.img seek=1 conv=notrunc
|
||||||
sudo /sbin/losetup -o1048576 /dev/loop0 hdd.img
|
sudo /sbin/losetup -o1048576 /dev/loop0 hdd.img
|
||||||
|
sudo mkdosfs -F32 /dev/loop0
|
||||||
sudo /bin/mount -t vfat /dev/loop0 /mnt/fake_cdrom/
|
sudo /bin/mount -t vfat /dev/loop0 /mnt/fake_cdrom/
|
||||||
sudo /bin/cp kernel/kernel.bin /mnt/fake_cdrom/
|
sudo /bin/cp kernel/kernel.bin /mnt/fake_cdrom/
|
||||||
sleep 0.1
|
sleep 0.1
|
||||||
|
@ -12,7 +12,7 @@ jmp second_step
|
|||||||
%include "intel_16.asm"
|
%include "intel_16.asm"
|
||||||
%include "sectors.asm"
|
%include "sectors.asm"
|
||||||
|
|
||||||
KERNEL_BASE equ 0x100 ; 0x100:0x0 = 0x1000
|
KERNEL_BASE equ 0x200 ; 0x200:0x0 = 0x2000
|
||||||
|
|
||||||
DAP:
|
DAP:
|
||||||
.size db 0x10
|
.size db 0x10
|
||||||
@ -215,15 +215,109 @@ second_step:
|
|||||||
|
|
||||||
jmp error_end
|
jmp error_end
|
||||||
|
|
||||||
; TODO Find kernel.bin in the directory
|
|
||||||
|
|
||||||
.found:
|
.found:
|
||||||
|
|
||||||
mov si, kernel_found
|
mov si, kernel_found
|
||||||
call print_line_16
|
call print_line_16
|
||||||
|
|
||||||
|
; 4. Load the kernel into memory
|
||||||
|
|
||||||
|
mov ax, [cluster_low]
|
||||||
|
mov [current_cluster], ax
|
||||||
|
mov word [current_segment], KERNEL_BASE
|
||||||
|
|
||||||
|
.next_cluster:
|
||||||
|
mov si, star
|
||||||
|
call print_16
|
||||||
|
|
||||||
|
mov ah, [sectors_per_cluster]
|
||||||
|
mov byte [DAP.count], ah
|
||||||
|
mov word [DAP.offset], 0x0
|
||||||
|
|
||||||
|
mov ax, [current_segment]
|
||||||
|
mov word [DAP.segment], ax
|
||||||
|
|
||||||
|
; Compute LBA from current_cluster
|
||||||
|
mov ax, [current_cluster]
|
||||||
|
sub ax, 2
|
||||||
|
movzx bx, byte [sectors_per_cluster]
|
||||||
|
mul bx
|
||||||
|
mov bx, [cluster_begin]
|
||||||
|
add ax, bx
|
||||||
|
|
||||||
|
mov word [DAP.lba], ax
|
||||||
|
|
||||||
|
mov ah, 0x42
|
||||||
|
mov si, DAP
|
||||||
|
mov dl, 0x80
|
||||||
|
int 0x13
|
||||||
|
|
||||||
|
jc read_failed
|
||||||
|
|
||||||
|
; Compute next cluster
|
||||||
|
|
||||||
|
; Compute the sector of the FAT to read
|
||||||
|
mov ax, [current_cluster]
|
||||||
|
shl ax, 2 ; current_cluster * 4
|
||||||
|
shr ax, 9 ; (current_cluster * 4) / 512
|
||||||
|
mov bx, [fat_begin]
|
||||||
|
add ax, bx ; fat_sector
|
||||||
|
|
||||||
|
; Read the FAT sector
|
||||||
|
mov byte [DAP.count], 1
|
||||||
|
mov word [DAP.offset], 0x100
|
||||||
|
mov word [DAP.segment], 0x0
|
||||||
|
mov word [DAP.lba], ax
|
||||||
|
|
||||||
|
mov ah, 0x42
|
||||||
|
mov si, DAP
|
||||||
|
mov dl, 0x80
|
||||||
|
int 0x13
|
||||||
|
|
||||||
|
jc read_failed
|
||||||
|
|
||||||
|
mov si, [current_cluster]
|
||||||
|
and si, 512 - 1 ; current_cluster % 512
|
||||||
|
shl si, 2
|
||||||
|
|
||||||
|
; cluster low
|
||||||
|
mov ax, [gs:(0x100 + si)]
|
||||||
|
; cluster high
|
||||||
|
mov bx, [gs:(0x100 + si + 2)]
|
||||||
|
|
||||||
|
cmp bx, 0x0FFF
|
||||||
|
jl .ok
|
||||||
|
|
||||||
|
cmp ax, 0xFFF7
|
||||||
|
je corrupted
|
||||||
|
|
||||||
|
cmp ax, 0xFFF8
|
||||||
|
jge .fully_loaded
|
||||||
|
|
||||||
|
.ok:
|
||||||
|
mov [current_cluster], ax
|
||||||
|
|
||||||
|
mov ax, sectors_per_cluster
|
||||||
|
mov bx, 0x20
|
||||||
|
mul bx
|
||||||
|
mov bx, [current_segment]
|
||||||
|
add ax, bx
|
||||||
|
mov [current_segment], ax
|
||||||
|
|
||||||
|
jmp .next_cluster
|
||||||
|
|
||||||
|
.fully_loaded:
|
||||||
|
mov si, kernel_loaded
|
||||||
|
call print_line_16
|
||||||
|
|
||||||
jmp $
|
jmp $
|
||||||
|
|
||||||
|
corrupted:
|
||||||
|
mov si, corrupted_disk
|
||||||
|
call print_line_16
|
||||||
|
|
||||||
|
jmp error_end
|
||||||
|
|
||||||
read_failed:
|
read_failed:
|
||||||
mov si, read_failed_msg
|
mov si, read_failed_msg
|
||||||
call print_line_16
|
call print_line_16
|
||||||
@ -251,12 +345,16 @@ error_end:
|
|||||||
size_high dw 0
|
size_high dw 0
|
||||||
size_low dw 0
|
size_low dw 0
|
||||||
|
|
||||||
|
current_cluster dw 0
|
||||||
|
current_segment dw 0
|
||||||
|
|
||||||
; Constant Datas
|
; Constant Datas
|
||||||
|
|
||||||
load_kernel db 'Attempt to load the kernel...', 0
|
load_kernel db 'Attempt to load the kernel...', 0
|
||||||
kernel_found db 'Kernel found. Starting kernel loading...', 0
|
kernel_found db 'Kernel found. Starting kernel loading...', 0
|
||||||
kernel_not_found db 'Kernel not found...', 0
|
kernel_not_found db 'Kernel not found...', 0
|
||||||
kernel_loaded db 'Kernel fully loaded', 0
|
kernel_loaded db 'Kernel fully loaded', 0
|
||||||
|
corrupted_disk db 'The disk seeems to be corrupted', 0
|
||||||
star db '*', 0
|
star db '*', 0
|
||||||
|
|
||||||
read_failed_msg db 'Read disk failed', 0
|
read_failed_msg db 'Read disk failed', 0
|
||||||
|
@ -93,10 +93,10 @@ struct long_entry {
|
|||||||
static_assert(sizeof(cluster_entry) == 32, "A cluster entry is 32 bytes");
|
static_assert(sizeof(cluster_entry) == 32, "A cluster entry is 32 bytes");
|
||||||
static_assert(sizeof(long_entry) == 32, "A cluster entry is 32 bytes");
|
static_assert(sizeof(long_entry) == 32, "A cluster entry is 32 bytes");
|
||||||
|
|
||||||
constexpr const bool CLUSTER_FREE = 0x0;
|
constexpr const uint32_t CLUSTER_FREE = 0x0;
|
||||||
constexpr const bool CLUSTER_RESERVED= 0x1;
|
constexpr const uint32_t CLUSTER_RESERVED= 0x1;
|
||||||
constexpr const bool CLUSTER_CORRUPTED = 0x0FFFFFF7;
|
constexpr const uint32_t CLUSTER_CORRUPTED = 0x0FFFFFF7;
|
||||||
constexpr const bool CLUSTER_END = 0x0FFFFFF8;
|
constexpr const uint32_t CLUSTER_END = 0x0FFFFFF8;
|
||||||
|
|
||||||
uint64_t cached_disk = -1;
|
uint64_t cached_disk = -1;
|
||||||
uint64_t cached_partition = -1;
|
uint64_t cached_partition = -1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user