Skip to content

Commit 2a06d44

Browse files
committed
Protected mode disk reads using BIOS interrupts
1 parent 6708f58 commit 2a06d44

File tree

14 files changed

+381
-84
lines changed

14 files changed

+381
-84
lines changed

Makefile

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ SRC_LIB_DS = src/lib/ds
77
SRC_LIB_UTILS = src/lib/utils
88
SRC_LIB = src/lib
99
SRC_APP = src/app
10+
SRC_REALMODE = src/real_mode
1011

1112
BUILD_BOOTLOADER = build/bootloader
1213
BUILD_KERNEL = build/kernel
@@ -15,14 +16,15 @@ BUILD_LIB_DS = build/lib/ds
1516
BUILD_LIB_UTILS = build/lib/utils
1617
BUILD_LIB = build/lib
1718
BUILD_APP = build/app
18-
19+
BUILD_REALMODE = build/real_mode
1920
.PHONY: all clean
2021

2122
# Files
2223
bt_stage1 = $(BUILD_BOOTLOADER)/stage1
2324
bt_stage2 = $(BUILD_BOOTLOADER)/stage2
2425
image_vmdk = $(BUILD_DIR)/image.vmdk
2526
app_entry = $(BUILD_LIB)/app/entry
27+
rm_static = $(BUILD_REALMODE)/static_library
2628

2729
# Kernel
2830
kernel_core = $(BUILD_DIR)/kernel/core
@@ -46,29 +48,34 @@ all: images binaries
4648

4749
images: $(image_vmdk)
4850

49-
binaries: $(bt_stage1) $(bt_stage2) $(kernel_core)
51+
binaries: $(bt_stage1) $(bt_stage2) $(kernel_core) $(rm_static)
5052

51-
$(image_vmdk): $(bt_stage1) $(bt_stage2) $(kernel_core) $(app_calc) $(app_tick_tac_toe)
53+
$(image_vmdk): $(bt_stage1) $(bt_stage2) $(kernel_core) $(app_calc) $(app_tick_tac_toe) $(rm_static)
5254
dd bs=512 count=2 if=$(bt_stage1) of=$@
5355
/bin/echo -ne "\x55\xaa" | dd seek=510 bs=1 of=$@
5456
@echo "Stage 1 Size : " $$(stat -c %s $(bt_stage1))
55-
@echo "BT_STAGE2_SECTOR_START : "$$(( 1 + $$(stat -c %s $(image_vmdk)) / 512 ))
57+
@echo "BT_STAGE2_SECTOR_START : "$$(( $$(stat -c %s $(image_vmdk)) / 512 ))
5658
cat $(bt_stage2) >> $@
5759
@echo "Stage 2 Size : " $$(stat -c %s $(bt_stage2))
5860
@echo "Want BT_STAGE2_SECTOR_COUNT : 0x"$$(printf "%x\n" $$(( $$(stat -c %s $(bt_stage2)) / 512)) )
5961
@echo "Got BT_STAGE2_SECTOR_COUNT : 0x"$(BT_STAGE2_SECTOR_COUNT)
6062

61-
@echo "AppCalc Sector Start : "$$(( 1 + $$(stat -c %s $(image_vmdk)) / 512 ))
63+
@echo "AppCalc Sector Start : "$$(( $$(stat -c %s $(image_vmdk)) / 512 ))
6264
cat $(app_calc) >> $@
6365
@echo "AppCalc Sector Count : "$$(( $$(stat -c %s $(app_calc)) / 512))
6466
@echo "App Calc Size : " $$(stat -c %s $(app_calc))
6567

66-
@echo "App TickTacToe Sector Start : "$$(( 1 + $$(stat -c %s $(image_vmdk)) / 512 ))
68+
@echo "App TickTacToe Sector Start : "$$(( $$(stat -c %s $(image_vmdk)) / 512 ))
6769
cat $(app_tick_tac_toe) >> $@
6870
@echo "App TickTacToe Sector Count : "$$(( $$(stat -c %s $(app_tick_tac_toe)) / 512))
6971
@echo "App TickTacToe Size : " $$(stat -c %s $(app_tick_tac_toe))
7072

71-
@echo "Kernel Core Sector Start : "$$(( 1 + $$(stat -c %s $(image_vmdk)) / 512 ))
73+
@echo "Static Library Sector Start : "$$(( $$(stat -c %s $(image_vmdk)) / 512 ))
74+
cat $(rm_static) >> $@
75+
@echo "Static Library Sector Count : "$$(( $$(stat -c %s $(rm_static)) / 512))
76+
@echo "Static Library Size : " $$(stat -c %s $(rm_static))
77+
78+
@echo "Kernel Core Sector Start : "$$(( $$(stat -c %s $(image_vmdk)) / 512 ))
7279
cat $(kernel_core) >> $@
7380
@echo "Kernel Core Sector Count : "$$(( $$(stat -c %s $(kernel_core)) / 512))
7481
@echo "Kernel Core Size : " $$(stat -c %s $(kernel_core))
@@ -92,6 +99,9 @@ qemu: $(image_vmdk)
9299
qemu_debug: $(image_vmdk)
93100
qemu-system-x86_64 -smp 1 -m 128M -hda $< -no-shutdown -no-reboot -d cpu,exec,in_asm
94101

102+
qemu_xdebug: $(image_vmdk)
103+
qemu-system-x86_64 -S -gdb tcp::9000 -smp 1 -m 128M -hda $< -no-shutdown -no-reboot -d cpu,exec,in_asm
104+
95105
clean:
96106
rm -r $(BUILD_DIR)/ || echo "Build directory is clean."
97107

@@ -101,19 +111,24 @@ $(bt_stage1): $(SRC_BOOTLOADER)/stage1.asm $(SRC_BOOTLOADER)/constants.asm $(SRC
101111
nasm -o $@ -f bin -i $(SRC_BOOTLOADER)/ -D BT_STAGE2_SECTOR_COUNT=$(BT_STAGE2_SECTOR_COUNT) $<
102112
truncate --size=%512 $@
103113

104-
$(bt_stage2): $(SRC_BOOTLOADER)/stage2.asm $(SRC_BOOTLOADER)/stage2.c $(SRC_BOOTLOADER)/io.asm $(SRC_BOOTLOADER)/constants.asm $(BUILD_LIB_UTILS)/libutils_16 $(BUILD_DRIVERS)/display/libtm_bios
114+
$(bt_stage2): $(SRC_BOOTLOADER)/stage2.asm $(SRC_BOOTLOADER)/stage2.c $(SRC_BOOTLOADER)/io.asm $(SRC_BOOTLOADER)/constants.asm $(SRC_REALMODE)/stub.asm $(BUILD_LIB_UTILS)/libutils_16 $(BUILD_DRIVERS)/display/libtm_bios $(BUILD_DRIVERS)/disk/libdisk_16
105115
mkdir -p $$(dirname $(bt_stage2))
106-
nasm -o $(BUILD_BOOTLOADER)/stage2_asm.o -f elf32 -i $(SRC_BOOTLOADER)/ $(SRC_BOOTLOADER)/stage2.asm
116+
nasm -o $(BUILD_BOOTLOADER)/stage2_asm.o -f elf32 -i $(SRC_BOOTLOADER)/ -i $(SRC_REALMODE)/ $(SRC_BOOTLOADER)/stage2.asm
107117
gcc -m16 -fno-pie -c -Isrc -D KERNEL_MEMORY_LOCATION=$(KERNEL_MEMORY_LOCATION) -o $(BUILD_BOOTLOADER)/stage2_c.o $(SRC_BOOTLOADER)/stage2.c
108-
ld --oformat binary -m elf_i386 -Ttext 0x8000 --strip-all -o $@ $(BUILD_BOOTLOADER)/stage2_asm.o $(BUILD_BOOTLOADER)/stage2_c.o $(BUILD_LIB_UTILS)/libutils_16 $(BUILD_DRIVERS)/display/libtm_bios
118+
ld --oformat binary -m elf_i386 -Ttext 0x8000 --strip-all -o $@ $(BUILD_BOOTLOADER)/stage2_asm.o $(BUILD_BOOTLOADER)/stage2_c.o $(BUILD_LIB_UTILS)/libutils_16 $(BUILD_DRIVERS)/display/libtm_bios $(BUILD_DRIVERS)/disk/libdisk_16
109119
truncate --size=%512 $@
110120

111-
$(kernel_core): $(SRC_KERNEL)/core.asm $(SRC_KERNEL)/core.c $(SRC_KERNEL)/essentials.c $(SRC_KERNEL)/interrupts.c $(SRC_KERNEL)/interrupts.asm $(SRC_LIB_UTILS)/output.h $(SRC_DRIVERS)/keyboard/keyboard.h $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/keyboard/libkeyboard $(BUILD_DRIVERS)/display/libtm_vga # And other output.h dependecies -_-
121+
$(BUILD_REALMODE)/static_library: $(SRC_REALMODE)/static_library.asm $(SRC_REALMODE)/stub.asm
122+
mkdir -p $(BUILD_REALMODE)/
123+
nasm -o $@ -f bin -i $(SRC_REALMODE)/ $(SRC_REALMODE)/static_library.asm
124+
truncate --size=%512 $@
125+
126+
$(kernel_core): $(SRC_KERNEL)/core.asm $(SRC_KERNEL)/core.c $(SRC_KERNEL)/essentials.c $(SRC_REALMODE)/stub.asm $(SRC_KERNEL)/interrupts.c $(SRC_KERNEL)/interrupts.asm $(SRC_LIB_UTILS)/output.h $(SRC_DRIVERS)/keyboard/keyboard.h $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/keyboard/libkeyboard $(BUILD_DRIVERS)/display/libtm_vga $(BUILD_DRIVERS)/disk/libdisk # And other output.h dependecies -_-
112127
mkdir -p $$(dirname $(kernel_core))
113-
nasm -o $(BUILD_KERNEL)/core_asm.o -f elf32 $(SRC_KERNEL)/core.asm
128+
nasm -o $(BUILD_KERNEL)/core_asm.o -f elf32 -i $(SRC_REALMODE)/ $(SRC_KERNEL)/core.asm
114129
nasm -o $(BUILD_KERNEL)/interrupts_asm.o -f elf32 $(SRC_KERNEL)/interrupts.asm
115130
gcc -m32 -fno-pie -c -Isrc -D KERNEL_MEMORY_LOCATION=$(KERNEL_MEMORY_LOCATION) -o $(BUILD_KERNEL)/core_c.o $(SRC_KERNEL)/core.c
116-
ld --oformat binary -m elf_i386 --trace -Ttext 0x0000 --strip-all -o $(kernel_core) $(BUILD_KERNEL)/core_asm.o $(BUILD_KERNEL)/core_c.o $(BUILD_KERNEL)/interrupts_asm.o $(BUILD_DRIVERS)/keyboard/libkeyboard $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga $(BUILD_LIB_DS)/libds
131+
ld --oformat binary -m elf_i386 --trace -Ttext 0x0000 --strip-all -o $(kernel_core) $(BUILD_KERNEL)/core_asm.o $(BUILD_KERNEL)/core_c.o $(BUILD_KERNEL)/interrupts_asm.o $(BUILD_DRIVERS)/keyboard/libkeyboard $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga $(BUILD_LIB_DS)/libds $(BUILD_DRIVERS)/disk/libdisk
117132
truncate --size=%512 $(kernel_core)
118133

119134
# Libraries
@@ -141,32 +156,40 @@ $(BUILD_DRIVERS)/keyboard/libkeyboard: $(SRC_DRIVERS)/keyboard/keyboard.c $(SRC_
141156
nasm -o $(BUILD_DRIVERS)/keyboard/keyboard_asm.o -f elf32 $(SRC_DRIVERS)/keyboard/keyboard.asm
142157
ar rc $@ $(BUILD_DRIVERS)/keyboard/keyboard_c.o $(BUILD_DRIVERS)/keyboard/keyboard_asm.o
143158

144-
$(BUILD_LIB_UTILS)/libutils_16: $(SRC_LIB_UTILS)/output.c $(SRC_LIB_UTILS)/output.h $(SRC_LIB_UTILS)/string.c $(SRC_LIB_UTILS)/string.h $(SRC_LIB_UTILS)/disk.c $(SRC_LIB_UTILS)/disk.asm $(SRC_LIB_UTILS)/disk.h $(SRC_LIB_UTILS)/panic.c $(SRC_LIB_UTILS)/panic.h $(SRC_LIB_UTILS)/panic.asm $(SRC_LIB_UTILS)/time.c $(SRC_LIB_UTILS)/time.h $(SRC_LIB_UTILS)/time.asm $(SRC_LIB_UTILS)/color.c $(SRC_LIB_UTILS)/color.h
159+
$(BUILD_DRIVERS)/disk/libdisk_16: $(SRC_DRIVERS)/disk/disk_16.c $(SRC_DRIVERS)/disk/disk_16.asm $(SRC_DRIVERS)/disk/disk.h
160+
mkdir -p $(BUILD_DRIVERS)/disk/
161+
gcc -m16 -fno-pie -c -Isrc -o $(BUILD_DRIVERS)/disk/disk_16_c.o $(SRC_DRIVERS)/disk/disk_16.c
162+
nasm -o $(BUILD_DRIVERS)/disk/disk_16_asm.o -f elf32 $(SRC_DRIVERS)/disk/disk_16.asm
163+
ar rc $@ $(BUILD_DRIVERS)/disk/disk_16_c.o $(BUILD_DRIVERS)/disk/disk_16_asm.o
164+
165+
$(BUILD_DRIVERS)/disk/libdisk: $(SRC_DRIVERS)/disk/disk.c $(SRC_DRIVERS)/disk/disk.asm $(SRC_DRIVERS)/disk/disk.h $(SRC_REALMODE)/stub.asm
166+
mkdir -p $(BUILD_DRIVERS)/disk/
167+
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_DRIVERS)/disk/disk_c.o $(SRC_DRIVERS)/disk/disk.c
168+
nasm -o $(BUILD_DRIVERS)/disk/disk_asm.o -f elf32 -i $(SRC_REALMODE)/ $(SRC_DRIVERS)/disk/disk.asm
169+
ar rc $@ $(BUILD_DRIVERS)/disk/disk_c.o $(BUILD_DRIVERS)/disk/disk_asm.o
170+
171+
$(BUILD_LIB_UTILS)/libutils_16: $(SRC_LIB_UTILS)/output.c $(SRC_LIB_UTILS)/output.h $(SRC_LIB_UTILS)/string.c $(SRC_LIB_UTILS)/string.h $(SRC_LIB_UTILS)/panic.c $(SRC_LIB_UTILS)/panic.h $(SRC_LIB_UTILS)/panic.asm $(SRC_LIB_UTILS)/time.c $(SRC_LIB_UTILS)/time.h $(SRC_LIB_UTILS)/time.asm $(SRC_LIB_UTILS)/color.c $(SRC_LIB_UTILS)/color.h
145172
mkdir -p $(BUILD_LIB_UTILS)/
146173
gcc -m16 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/output.o $(SRC_LIB_UTILS)/output.c
147174
gcc -m16 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/string.o $(SRC_LIB_UTILS)/string.c
148175
gcc -m16 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/color.o $(SRC_LIB_UTILS)/color.c
149-
gcc -m16 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/disk_c.o $(SRC_LIB_UTILS)/disk.c
150-
nasm -o $(BUILD_LIB_UTILS)/disk_asm.o -f elf32 $(SRC_LIB_UTILS)/disk.asm
151176
gcc -m16 -fno-pie -c -D__SOURCE_SNAPSHOT__=$(SOURCE_SNAPSHOT) -Isrc -o $(BUILD_LIB_UTILS)/panic_c.o $(SRC_LIB_UTILS)/panic.c
152177
nasm -o $(BUILD_LIB_UTILS)/panic_asm.o -f elf32 $(SRC_LIB_UTILS)/panic.asm
153178
gcc -m16 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/time_c.o $(SRC_LIB_UTILS)/time.c
154179
nasm -o $(BUILD_LIB_UTILS)/time_asm.o -f elf32 $(SRC_LIB_UTILS)/time.asm
155-
ar rc $@ $(BUILD_LIB_UTILS)/output.o $(BUILD_LIB_UTILS)/string.o $(BUILD_LIB_UTILS)/color.o $(BUILD_LIB_UTILS)/disk_c.o $(BUILD_LIB_UTILS)/disk_asm.o $(BUILD_LIB_UTILS)/panic_c.o $(BUILD_LIB_UTILS)/panic_asm.o $(BUILD_LIB_UTILS)/time_c.o $(BUILD_LIB_UTILS)/time_asm.o
180+
ar rc $@ $(BUILD_LIB_UTILS)/output.o $(BUILD_LIB_UTILS)/string.o $(BUILD_LIB_UTILS)/color.o $(BUILD_LIB_UTILS)/panic_c.o $(BUILD_LIB_UTILS)/panic_asm.o $(BUILD_LIB_UTILS)/time_c.o $(BUILD_LIB_UTILS)/time_asm.o
156181

157-
$(BUILD_LIB_UTILS)/libutils: $(SRC_LIB_UTILS)/output.c $(SRC_LIB_UTILS)/output.h $(SRC_LIB_UTILS)/input.c $(SRC_LIB_UTILS)/input.h $(SRC_LIB_UTILS)/string.c $(SRC_LIB_UTILS)/string.h $(SRC_LIB_UTILS)/disk.c $(SRC_LIB_UTILS)/disk.asm $(SRC_LIB_UTILS)/disk.h $(SRC_LIB_UTILS)/panic.c $(SRC_LIB_UTILS)/panic.h $(SRC_LIB_UTILS)/panic.asm $(SRC_LIB_UTILS)/time.c $(SRC_LIB_UTILS)/time.h $(SRC_LIB_UTILS)/time.asm $(SRC_LIB_UTILS)/color.c $(SRC_LIB_UTILS)/color.h
182+
$(BUILD_LIB_UTILS)/libutils: $(SRC_LIB_UTILS)/output.c $(SRC_LIB_UTILS)/output.h $(SRC_LIB_UTILS)/input.c $(SRC_LIB_UTILS)/input.h $(SRC_LIB_UTILS)/string.c $(SRC_LIB_UTILS)/string.h $(SRC_LIB_UTILS)/panic.c $(SRC_LIB_UTILS)/panic.h $(SRC_LIB_UTILS)/panic.asm $(SRC_LIB_UTILS)/time.c $(SRC_LIB_UTILS)/time.h $(SRC_LIB_UTILS)/time.asm $(SRC_LIB_UTILS)/color.c $(SRC_LIB_UTILS)/color.h
158183
mkdir -p $(BUILD_LIB_UTILS)/
159184
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/output.o $(SRC_LIB_UTILS)/output.c
160185
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/input.o $(SRC_LIB_UTILS)/input.c
161186
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/string.o $(SRC_LIB_UTILS)/string.c
162187
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/color.o $(SRC_LIB_UTILS)/color.c
163-
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/disk_c.o $(SRC_LIB_UTILS)/disk.c
164-
nasm -o $(BUILD_LIB_UTILS)/disk_asm.o -f elf32 $(SRC_LIB_UTILS)/disk.asm
165188
gcc -m32 -fno-pie -c -D__SOURCE_SNAPSHOT__=$(SOURCE_SNAPSHOT) -Isrc -o $(BUILD_LIB_UTILS)/panic_c.o $(SRC_LIB_UTILS)/panic.c
166189
nasm -o $(BUILD_LIB_UTILS)/panic_asm.o -f elf32 $(SRC_LIB_UTILS)/panic.asm
167190
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/time_c.o $(SRC_LIB_UTILS)/time.c
168191
nasm -o $(BUILD_LIB_UTILS)/time_asm.o -f elf32 $(SRC_LIB_UTILS)/time.asm
169-
ar rc $@ $(BUILD_LIB_UTILS)/output.o $(BUILD_LIB_UTILS)/input.o $(BUILD_LIB_UTILS)/string.o $(BUILD_LIB_UTILS)/color.o $(BUILD_LIB_UTILS)/disk_c.o $(BUILD_LIB_UTILS)/disk_asm.o $(BUILD_LIB_UTILS)/panic_c.o $(BUILD_LIB_UTILS)/panic_asm.o $(BUILD_LIB_UTILS)/time_c.o $(BUILD_LIB_UTILS)/time_asm.o
192+
ar rc $@ $(BUILD_LIB_UTILS)/output.o $(BUILD_LIB_UTILS)/input.o $(BUILD_LIB_UTILS)/string.o $(BUILD_LIB_UTILS)/color.o $(BUILD_LIB_UTILS)/panic_c.o $(BUILD_LIB_UTILS)/panic_asm.o $(BUILD_LIB_UTILS)/time_c.o $(BUILD_LIB_UTILS)/time_asm.o
170193

171194
$(BUILD_LIB_DS)/libds: $(SRC_LIB_DS)/queue.h $(SRC_LIB_DS)/queue.c
172195
mkdir -p $(BUILD_LIB_DS)/

memory_layout.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
### Memory Layout
2+
3+
| From | To | Size | Usage |
4+
|--------- |-------- |-------- |-------------------------------------------- |
5+
| 0x00000 | fill | 31KB | RESERVED |
6+
| 0x7C00 | 0x7DFF | 512B | BOOTLOADER STAGE 1 |
7+
| 0x7E00 | 0x7EFF | 256B | SHARED STATIC CODE for real_mode library |
8+
| 0x7F00 | 0x7FFF | 256B | SHARED STATIC MEMORY for real_mode library |
9+
| 0x8000 | 0xB1FF | 12.5KB | BOOT LOADER STAGE 2 |
10+
| 0xC000 | 0x10200 | - | KERNEL |
11+
| 0x20000 | fill | - | Application |
12+
| - | 0xFFFFF | - | 20-bit memory limit |

src/bootloader/stage2.asm

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,46 @@
11
; Fuzzy Bootloader Stage 2
22
%include "constants.asm"
33
%include "io.asm"
4+
%include "stub.asm"
45

56
[BITS 16]
67

78
extern entry_stage
9+
global _low_get_gdtr_address
810
global enter_protected_mode
911
global label_exit
1012

1113
[SECTION .text]
1214
MOV ax, 0x0000
1315
MOV es, ax ; es := 0
1416
set_blinking 0
15-
1617
print_string_ext bl_stage_2, bl_stage_2_len, 04, 09, C_WHITE, C_BLACK, 0
1718
call entry_stage
1819

19-
enter_protected_mode:
20-
; Args: (gdtr_address)
21-
; And never returns.
22-
20+
_low_get_gdtr_address:
2321
push ebp
2422
mov ebp, esp
2523

24+
get_gdtr_address
25+
26+
mov esp, ebp
27+
pop ebp
28+
ret
29+
30+
31+
enter_protected_mode:
32+
; Never returns.
33+
2634
; Load GDT Table
27-
mov eax, [esp+8] ; gdtr_address
28-
lgdt [eax] ; Load GDT Table
35+
get_gdtr_address
36+
lgdt [eax]
2937

3038
; Enter Protected mode
39+
set_protected_mode_entry_address_frm 0
3140
mov eax, cr0
3241
or eax, 0x00000001
3342
mov cr0, eax
34-
jmp 0x08:0x0000 ; address to kernel in memory
43+
jmp 0x08:0x0000 ; address of smart kernel init
3544

3645
label_exit:
3746
HLT

src/bootloader/stage2.c

Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
11
#include <lib/utils/color.h>
2-
#include <lib/utils/disk.h>
2+
#include <drivers/disk/disk.h>
33
#include <lib/utils/output.h>
44
#include <lib/utils/time.h>
55

6-
char message_welcome[] = "C says 'Hello World'";
7-
char message_dashboard[] = "Opening App 'Dashboard'";
8-
char message_kernel_loading[] = "Loading Kernel....";
9-
char message_calc_loading[] = "Loading Calc....";
10-
char message_protected_mode[] = "Enabling Protected Mode...";
11-
12-
#define GDT_TABLE_SIZE 3
6+
#define GDT_TABLE_SIZE 5
137

148
#pragma pack(push, 1)
159
struct GDTReference {
@@ -26,7 +20,7 @@ struct GDTEntry {
2620
};
2721
#pragma pack(pop)
2822

29-
struct GDTReference gdtr;
23+
struct GDTReference *gdtr;
3024
struct GDTEntry gdt_table[GDT_TABLE_SIZE];
3125

3226
void populate_gct_entry(struct GDTEntry *entry,
@@ -43,10 +37,11 @@ void populate_gct_entry(struct GDTEntry *entry,
4337
entry->access_byte = access_byte;
4438
}
4539

46-
extern void enter_protected_mode(int gdtr_address);
40+
extern int _low_get_gdtr_address();
41+
extern void enter_protected_mode();
4742
extern void label_exit();
4843

49-
int populate_gdt_table() {
44+
void populate_gdt_table() {
5045
// Assumption DS = 0
5146
// Populate simple overlapping code and data segment.
5247

@@ -58,33 +53,43 @@ int populate_gdt_table() {
5853
// Kernel Code Segment Selector
5954
populate_gct_entry(
6055
&gdt_table[1],
61-
// 0x00000000,0x0fffffff,
6256
KERNEL_MEMORY_LOCATION, 0x0fffffff,
6357
0b0100, // 32-bit protected mode
6458
0x9a);
6559
// Kernel Data Segment Selector
6660
populate_gct_entry(
6761
&gdt_table[2],
68-
// 0x00000000,0x0fffffff,
6962
KERNEL_MEMORY_LOCATION, 0x0fffffff,
7063
0b0100, // 32-bit protected mode
7164
0x92);
65+
// Absolute Code Segment Selector
66+
populate_gct_entry(
67+
&gdt_table[3],
68+
0, 0xfffff,
69+
0b0000, // 16-bit protected mode
70+
0x9a);
71+
// Absolute Data Segment Selector
72+
populate_gct_entry(
73+
&gdt_table[4],
74+
0, 0xfffff,
75+
0b0000, // 16-bit protected mode
76+
0x92);
7277

73-
gdtr.base_address = (int)gdt_table;
74-
gdtr.size = (sizeof(gdt_table));
78+
gdtr = (struct GDTReference*)_low_get_gdtr_address();
79+
gdtr->base_address = (int)gdt_table;
80+
gdtr->size = (sizeof(gdt_table));
7581

7682
// Print the table and table addresse.
7783
move_xy(8,15);
78-
print_int((int)&gdtr);
84+
print_int((int)gdtr);
7985
move_xy(8,16);
80-
print_int(gdtr.base_address);
86+
print_int(gdtr->base_address);
8187
move_xy(8,17);
82-
print_int(gdtr.size);
88+
print_int(gdtr->size);
8389
for(int i=0;i<GDT_TABLE_SIZE;i++) {
8490
move_xy(8,18+i);
8591
print_memory_hex(8*i+(char*)&gdt_table, 8);
8692
}
87-
return (int)&gdtr;
8893
}
8994

9095
void load_kernel() {
@@ -111,22 +116,33 @@ void load_calc() {
111116
}
112117
}
113118

119+
void load_static_library() {
120+
int err = load_sectors(0x7E00, 0x80, 76, 1);
121+
if(err) {
122+
print_line("Failed to load calc in memory.");
123+
print_int(err);
124+
label_exit();
125+
} else {
126+
print_memory_hex((char*)0x7E00, 16);
127+
}
128+
}
129+
114130
void entry_stage() {
115131
move_xy(6, 11);
116132
set_color_bg(C_BLACK);
117133
set_color_fg(C_GREEN);
118-
print_line(message_welcome);
134+
print_line("C says 'Hello World'");
119135
set_color_fg(C_WHITE);
120136
move_xy(6, 12);
121-
print_line(message_kernel_loading);
122-
load_kernel();
137+
print_line("Loading Static Library....");
138+
load_static_library();
123139
move_xy(6, 13);
124-
print_line(message_calc_loading);
125-
load_calc();
140+
print_line("Loading Kernel....");
141+
load_kernel();
126142
move_xy(6, 14);
127-
print_line(message_protected_mode);
128-
int gdtr_address = populate_gdt_table();
143+
print_line("Enabling Protected Mode...");
144+
populate_gdt_table();
129145
// Enter_protected_mode never returns.
130-
enter_protected_mode(gdtr_address);
146+
enter_protected_mode();
131147
// And thus PC should never reach here :)
132148
}

0 commit comments

Comments
 (0)