Project assignment 2 work complete
This commit is contained in:
commit
343f0cfd43
18
.vscode/c_cpp_properties.json
vendored
Normal file
18
.vscode/c_cpp_properties.json
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"name": "linux-gcc-x64",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/**"
|
||||
],
|
||||
"compilerPath": "/usr/bin/gcc",
|
||||
"cStandard": "${default}",
|
||||
"cppStandard": "${default}",
|
||||
"intelliSenseMode": "linux-gcc-x64",
|
||||
"compilerArgs": [
|
||||
""
|
||||
]
|
||||
}
|
||||
],
|
||||
"version": 4
|
||||
}
|
24
.vscode/launch.json
vendored
Normal file
24
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "C/C++ Runner: Debug Session",
|
||||
"type": "cppdbg",
|
||||
"request": "launch",
|
||||
"args": [],
|
||||
"stopAtEntry": false,
|
||||
"externalConsole": false,
|
||||
"cwd": "/home/river/Documents/School/2024-2025/2024-2025 Semester 2/Op Sys/myos",
|
||||
"program": "/home/river/Documents/School/2024-2025/2024-2025 Semester 2/Op Sys/myos/build/Debug/outDebug",
|
||||
"MIMode": "gdb",
|
||||
"miDebuggerPath": "gdb",
|
||||
"setupCommands": [
|
||||
{
|
||||
"description": "Enable pretty-printing for gdb",
|
||||
"text": "-enable-pretty-printing",
|
||||
"ignoreFailures": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
60
.vscode/settings.json
vendored
Normal file
60
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,60 @@
|
||||
{
|
||||
"C_Cpp_Runner.cCompilerPath": "gcc",
|
||||
"C_Cpp_Runner.cppCompilerPath": "g++",
|
||||
"C_Cpp_Runner.debuggerPath": "gdb",
|
||||
"C_Cpp_Runner.cStandard": "",
|
||||
"C_Cpp_Runner.cppStandard": "",
|
||||
"C_Cpp_Runner.msvcBatchPath": "",
|
||||
"C_Cpp_Runner.useMsvc": false,
|
||||
"C_Cpp_Runner.warnings": [
|
||||
"-Wall",
|
||||
"-Wextra",
|
||||
"-Wpedantic",
|
||||
"-Wshadow",
|
||||
"-Wformat=2",
|
||||
"-Wcast-align",
|
||||
"-Wconversion",
|
||||
"-Wsign-conversion",
|
||||
"-Wnull-dereference"
|
||||
],
|
||||
"C_Cpp_Runner.msvcWarnings": [
|
||||
"/W4",
|
||||
"/permissive-",
|
||||
"/w14242",
|
||||
"/w14287",
|
||||
"/w14296",
|
||||
"/w14311",
|
||||
"/w14826",
|
||||
"/w44062",
|
||||
"/w44242",
|
||||
"/w14905",
|
||||
"/w14906",
|
||||
"/w14263",
|
||||
"/w44265",
|
||||
"/w14928"
|
||||
],
|
||||
"C_Cpp_Runner.enableWarnings": true,
|
||||
"C_Cpp_Runner.warningsAsError": false,
|
||||
"C_Cpp_Runner.compilerArgs": [],
|
||||
"C_Cpp_Runner.linkerArgs": [],
|
||||
"C_Cpp_Runner.includePaths": [],
|
||||
"C_Cpp_Runner.includeSearch": [
|
||||
"*",
|
||||
"**/*"
|
||||
],
|
||||
"C_Cpp_Runner.excludeSearch": [
|
||||
"**/build",
|
||||
"**/build/**",
|
||||
"**/.*",
|
||||
"**/.*/**",
|
||||
"**/.vscode",
|
||||
"**/.vscode/**"
|
||||
],
|
||||
"C_Cpp_Runner.useAddressSanitizer": false,
|
||||
"C_Cpp_Runner.useUndefinedSanitizer": false,
|
||||
"C_Cpp_Runner.useLeakSanitizer": false,
|
||||
"C_Cpp_Runner.showCompilationTime": false,
|
||||
"C_Cpp_Runner.useLinkTimeOptimization": false,
|
||||
"C_Cpp_Runner.msvcSecureNoWarnings": false,
|
||||
"makefile.configureOnOpen": false
|
||||
}
|
6
Dockerfile
Normal file
6
Dockerfile
Normal file
@ -0,0 +1,6 @@
|
||||
FROM alpine:3.21
|
||||
RUN mkdir -p /usr/src/myos
|
||||
COPY ./* /usr/src/myos
|
||||
RUN apk add bash nasm make gcc qemu-system-i386 git vim
|
||||
CMD ["/bin/bash"]
|
||||
|
19
Makefile
Normal file
19
Makefile
Normal file
@ -0,0 +1,19 @@
|
||||
C_FILES=./kernel.c ./console/console.c
|
||||
O_FILES=$(C_FILES:.c=.o)
|
||||
|
||||
all: qemu_launch
|
||||
|
||||
qemu_launch: os.bin
|
||||
qemu-system-i386 -drive format=raw,file=$<,index=0,if=floppy
|
||||
os.bin: boot.bin kernel.bin
|
||||
cat $^ > $@
|
||||
boot.bin: boot.asm
|
||||
nasm $< -f bin -o $@
|
||||
kernel.bin: kernel-entry.o $(O_FILES)
|
||||
ld -m elf_i386 -s -o $@ -Ttext 0x1000 $^ --oformat binary
|
||||
kernel-entry.o: kernel-entry.elf
|
||||
nasm $< -f elf -o $@
|
||||
$(O_FILES):
|
||||
gcc -Iinclude -fno-pie -m32 -ffreestanding -c ${@:.o=.c} -o $@
|
||||
clean:
|
||||
find . -name \*.o | xargs --no-run-if-empty rm
|
87
boot.asm
Normal file
87
boot.asm
Normal file
@ -0,0 +1,87 @@
|
||||
[bits 16]
|
||||
[org 0x7c00]
|
||||
|
||||
KERNEL_ADDRESS equ 0x1000
|
||||
mov [BOOT_DRIVE], DL
|
||||
mov bp, 0x9000
|
||||
mov sp, bp
|
||||
|
||||
call kernel_load
|
||||
mov BX, DISK_SUCCESS_MESSAGE
|
||||
call print_string
|
||||
jmp switch_to_32bit
|
||||
jmp done
|
||||
|
||||
%include "gdt.asm"
|
||||
|
||||
kernel_load:
|
||||
pusha
|
||||
mov AH, 0x02
|
||||
mov AL, [NUM_SECTORS]
|
||||
mov BX, KERNEL_ADDRESS
|
||||
mov CH, 0x00
|
||||
mov CL, 0x02
|
||||
mov DH, 0x00
|
||||
mov DL, [BOOT_DRIVE]
|
||||
int 13h
|
||||
jc disk_read_error
|
||||
cmp AL, [NUM_SECTORS]
|
||||
jne disk_sector_error
|
||||
popa
|
||||
ret
|
||||
disk_read_error:
|
||||
mov BX, DISK_READ_ERROR_MESSAGE
|
||||
call print_string
|
||||
jmp done
|
||||
disk_sector_error:
|
||||
mov BX, DISK_SECTOR_ERROR_MESSAGE
|
||||
call print_string
|
||||
jmp done
|
||||
|
||||
|
||||
print_string:
|
||||
pusha
|
||||
mov AH, 0x0e
|
||||
print_loop:
|
||||
mov AL, [BX]
|
||||
cmp AL, 0x00
|
||||
je done_print
|
||||
int 10h
|
||||
add BX, 1
|
||||
jmp print_loop
|
||||
done_print:
|
||||
popa
|
||||
ret
|
||||
|
||||
done:
|
||||
jmp $
|
||||
|
||||
|
||||
switch_to_32bit:
|
||||
cli
|
||||
lgdt [gdt]
|
||||
mov EAX, CR0
|
||||
or eax, 0x01
|
||||
mov CR0, EAX
|
||||
jmp 0x08:begin_32bit
|
||||
|
||||
[bits 32]
|
||||
begin_32bit:
|
||||
mov AX, 0x10
|
||||
mov SS, AX
|
||||
mov DS, AX
|
||||
mov ES, AX
|
||||
mov FS, AX
|
||||
mov GS, AX
|
||||
mov ebp, 0x90000
|
||||
mov esp, ebp
|
||||
jmp KERNEL_ADDRESS
|
||||
|
||||
|
||||
NUM_SECTORS db 0x09
|
||||
DISK_SUCCESS_MESSAGE db "Read succeeded, continuing", 0
|
||||
DISK_READ_ERROR_MESSAGE db "Problem with disk read", 0
|
||||
DISK_SECTOR_ERROR_MESSAGE db "Read and requested sectors differ", 0
|
||||
BOOT_DRIVE db 0
|
||||
times 510 - ($-$$) db 0
|
||||
dw 0xaa55
|
44
console/console.c
Normal file
44
console/console.c
Normal file
@ -0,0 +1,44 @@
|
||||
|
||||
const int VGA_WIDTH = 80;
|
||||
const int VGA_HEIGHT = 25;
|
||||
const int VGA_BYTES_PER_CHARACTER = 2;
|
||||
|
||||
char* const VGA_BUFFER = (char*) 0xb8000;
|
||||
|
||||
static int terminal_position = 0;
|
||||
|
||||
void clear_terminal() {
|
||||
|
||||
for (int i=0; i<(VGA_WIDTH * VGA_HEIGHT); i++) {
|
||||
// Text byte gets nulled
|
||||
VGA_BUFFER[i*2] = '\0';
|
||||
// Style byte gets 0x07 for white text on a black background?
|
||||
VGA_BUFFER[i*2 + 1] = 0x07;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void print_character(char c) {
|
||||
if (c == '\n') {
|
||||
terminal_position = (terminal_position + (VGA_BYTES_PER_CHARACTER * VGA_WIDTH)) - (terminal_position % (VGA_BYTES_PER_CHARACTER * VGA_WIDTH));
|
||||
} else {
|
||||
VGA_BUFFER[(terminal_position * VGA_BYTES_PER_CHARACTER)] = c;
|
||||
VGA_BUFFER[(terminal_position * VGA_BYTES_PER_CHARACTER) + 1] = 0x07;
|
||||
terminal_position++;
|
||||
}
|
||||
}
|
||||
|
||||
void print_string(char* string) {
|
||||
|
||||
for (int i=0; string[i] != '\0'; i++) {
|
||||
print_character(string[i]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void print_line(char* string) {
|
||||
|
||||
print_string(string);
|
||||
print_character('\n');
|
||||
|
||||
}
|
21
gdt.asm
Normal file
21
gdt.asm
Normal file
@ -0,0 +1,21 @@
|
||||
gdt_null_segment:
|
||||
dq 0x0
|
||||
gdt_code_segment:
|
||||
dw 0xffff
|
||||
dw 0x0
|
||||
db 0x0
|
||||
db 10011010b
|
||||
db 11001111b
|
||||
db 0x0
|
||||
gdt_data_segment:
|
||||
dw 0xffff
|
||||
dw 0x0
|
||||
db 0x0
|
||||
db 10010010b
|
||||
db 11001111b
|
||||
db 0x0
|
||||
gdt_end:
|
||||
|
||||
gdt:
|
||||
dw gdt_end - gdt_null_segment - 1
|
||||
dd gdt_null_segment
|
19
include/console.h
Normal file
19
include/console.h
Normal file
@ -0,0 +1,19 @@
|
||||
#ifndef MYOS_INCLUDE_CONSOLE_H
|
||||
|
||||
#define MYOS_INCLUDE_CONSOLE_H
|
||||
|
||||
extern const int VGA_WIDTH;
|
||||
|
||||
extern const int VGA_HEIGHT;
|
||||
|
||||
extern const int VGA_BYTES_PER_CHARACTER;
|
||||
|
||||
void clear_terminal();
|
||||
|
||||
void print_character(char c);
|
||||
|
||||
void print_string(char* str);
|
||||
|
||||
void print_line(char* str);
|
||||
|
||||
#endif
|
8
kernel-entry.elf
Normal file
8
kernel-entry.elf
Normal file
@ -0,0 +1,8 @@
|
||||
global _start
|
||||
|
||||
[bits 32]
|
||||
|
||||
_start:
|
||||
[extern main]
|
||||
call main
|
||||
jmp $
|
Loading…
Reference in New Issue
Block a user