From c1b43683f23f2e7f2b88f9f56859a708d558253d Mon Sep 17 00:00:00 2001 From: ravinperera00 Date: Sun, 1 Oct 2023 23:51:31 +0530 Subject: [PATCH] Add Global Descriptor Table --- Makefile | 11 ++++++++ bin/boot.bin | Bin 0 -> 512 bytes build.sh | 5 ++++ src/boot/boot.asm | 62 ++++++++++++++++++++++++++++++++++++++++++++++ src/kernel.asm | 17 +++++++++++++ src/linker.ld | 26 +++++++++++++++++++ 6 files changed, 121 insertions(+) create mode 100644 Makefile create mode 100644 bin/boot.bin create mode 100755 build.sh create mode 100644 src/boot/boot.asm create mode 100644 src/kernel.asm create mode 100644 src/linker.ld diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..94b2b4b --- /dev/null +++ b/Makefile @@ -0,0 +1,11 @@ +FILES = ./build/kernel.asm.o + +all: ./bin/boot.bin $(FILES) + dd -f=./bin/boot.bin >> ./bin/os.bin + +./bin/boot.bin: ./src/boot/boot.asm + nasm -f bin ./src/boot/boot.asm -o ./bin/boot.bin +./build/kernel.asm.o: ./src/kernel.asm + nasm -f elf -g ./src/kernel.asm -o ./build/kernel.asm.o +clean: + rm -rf ./bin/boot.bin \ No newline at end of file diff --git a/bin/boot.bin b/bin/boot.bin new file mode 100644 index 0000000000000000000000000000000000000000..a00e2c528033ef8b2e0ec10258133d49f8f7ee0e GIT binary patch literal 512 zcmaE@G=YH-c%@mx!0>Aa14G}9z5{(1_Au1^{>9HImQus7a3HPu1S7xFfmc~I9B^a) z{|7Q>oo4{klg=}UGxz`vNZTO*G2lVpi@pnc85k58I^R5*#KZJ#((8Y4y`v0zhCt{l E0FJ^cjQ{`u literal 0 HcmV?d00001 diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..fccb0bd --- /dev/null +++ b/build.sh @@ -0,0 +1,5 @@ +#/bin/bash +export PREFIX="$HOME/opt/cross" +export TARGET=i686-elf +export PATH="$PREFIX/bin:$PATH" +make all \ No newline at end of file diff --git a/src/boot/boot.asm b/src/boot/boot.asm new file mode 100644 index 0000000..99c0ed0 --- /dev/null +++ b/src/boot/boot.asm @@ -0,0 +1,62 @@ +ORG 0x7c00 +BITS 16 + +CODE_SEG equ gdt_code - gdt_start +DATA_SEG equ gdt_data - gdt_start + +_start: + jmp short start + nop + times 33 db 0 + +start: + jmp 0:step2 + +step2: + cli ; disable interrupts + mov ax, 0x00 + mov ds, ax + mov es, ax + mov ss, ax + mov sp, 0x7c00 + sti ; enable interrupts + +load_protected: + cli + lgdt[gdt_descriptor] + mov eax, cr0 + or eax, 1 + mov cr0, eax + ;jmp CODE_SEG:load32 + jmp $ + + +;GDT +gdt_start: +gdt_null: + dd 0x0 + dd 0x0 + +gdt_code: + dw 0xffff + dw 0 + db 0 + db 0x9a + db 11001111b + db 0 + +gdt_data: + dw 0xffff + dw 0 + db 0 + db 0x92 + db 11001111b + db 0 +gdt_end: + +gdt_descriptor: + dw gdt_end - gdt_start - 1 + dd gdt_start + +times 510-($-$$) db 0 +dw 0xAA55 \ No newline at end of file diff --git a/src/kernel.asm b/src/kernel.asm new file mode 100644 index 0000000..6da6128 --- /dev/null +++ b/src/kernel.asm @@ -0,0 +1,17 @@ +BITS 32 + +load32: + mov ax, DATA_SEG + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + mov ebp, 0x00200000 + mov esp, ebp + + in al, 0x92 + or al, 2 + out 0x92, al + + jmp $ \ No newline at end of file diff --git a/src/linker.ld b/src/linker.ld new file mode 100644 index 0000000..c0778ce --- /dev/null +++ b/src/linker.ld @@ -0,0 +1,26 @@ +ENTRY(_start) +OUTPUT_FORMAT(binary) +SECTIONS +{ + . = 1M; + .text : + { + *(.text) + } + + .rodata : + { + *(.rodata) + } + + .data : + { + *(.data) + } + + .bss : + { + *(COMMON) + *(.bss) + } +} \ No newline at end of file