diff --git a/.vscode/browse.vc.db b/.vscode/browse.vc.db index 5e5b21f..0dd233d 100644 Binary files a/.vscode/browse.vc.db and b/.vscode/browse.vc.db differ diff --git a/.vscode/browse.vc.db-shm b/.vscode/browse.vc.db-shm index 8ba8ae9..393371e 100644 Binary files a/.vscode/browse.vc.db-shm and b/.vscode/browse.vc.db-shm differ diff --git a/.vscode/browse.vc.db-wal b/.vscode/browse.vc.db-wal index e69de29..a58895a 100644 Binary files a/.vscode/browse.vc.db-wal and b/.vscode/browse.vc.db-wal differ diff --git a/.vscode/launch.json b/.vscode/launch.json index deac87e..474aeea 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,6 +4,7 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { "name": "gcc-8 - Build and debug active file Level 1", "type": "cppdbg", @@ -27,6 +28,16 @@ "logging": { "engineLogging": true } + }, + { + "name": "Debug with QEMU", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/boot.bin", + "miDebuggerPath": "/usr/bin/qemu-system-i386", + "miDebuggerArgs": "-kernel", + "cwd": "${workspaceFolder}", + "preLaunchTask": "build" } ] } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 62261e3..1737686 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,113 +1,66 @@ { - "files.associations": { - "*.c": "c", - "*.h": "c", - "*.cpp": "cpp", - "*.hpp": "hpp", - "*.asm": "asm", - "*.bin": "bin" - }, - "files.fileAssociations": { - ".c": "c", - ".h": "c", - ".cpp": "cpp", - ".hpp": "cpp", - ".asm": "asm", - ".bin": "bin" - }, - "emmet.includeLanguages": { - "c": "c", - "cpp": "cpp", - "assembly": "asm" - }, - "C_Cpp_Runner.cCompilerPath": "/usr/bin", - "C_Cpp_Runner.cppCompilerPath": "/usr/bin", - "C_Cpp_Runner.debuggerPath": "/usr/bin", - "C_Cpp_Runner.cStandard": "c17", - "C_Cpp_Runner.cppStandard": "c++20", - "C_Cpp_Runner.msvcBatchPath": "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/Build/vcvarsall.bat", - "C_Cpp_Runner.useMsvc": false, - "C_Cpp_Runner.warnings": [ - "-Wall", - "-Wextra", - "-Wextra", - "-Wpedantic" - ], - "C_Cpp_Runner.enableWarnings": true, - "C_Cpp_Runner.warningsAsError": false, - "C_Cpp_Runner.compilerArgs": [], - "C_Cpp_Runner.linkerArgs": [ - "-dynamic-linker {/lib64/ld-linux-x86-64.so.2}" - ], - "C_Cpp_Runner.includePaths": [], - "C_Cpp_Runner.includeSearch": [ - "*", - "**/*" - ], - "C_Cpp_Runner.excludeSearch": [ - "**/build", - "**/build/**", - "**/.*", - "**/.*/**", - "**/.vscode", - "**/.vscode/**" - ], - "C_Cpp_Runner.useAddressSanitizer": false, - "C_Cpp_Runner.showCompilationTime": false, - "c-cpp-flylint.enable": true, - "c-cpp-flylint.debug": true, - "c-cpp-flylint.flexelint.enable": false, - "c-cpp-flylint.cppcheck.enable": true, - "c-cpp-flylint.clang.enable": false, - "C_Cpp_Config.cCompilerPath": "gcc", - "C_Cpp_Config.cppCompilerPath": "g++", - "C_Cpp_Config.debuggerPath": "gdb", - "C_Cpp_Config.makePath": "make", + // General C/C++ settings + "C_Cpp.autoAddFileAssociations": true, + "C_Cpp.autocompleteAddParentheses": true, "C_Cpp.clang_format_sortIncludes": true, - "C_Cpp.vcFormat.indent.preserveComments": true, - "C_Cpp.vcFormat.indent.namespaceContents": false, - "C_Cpp.vcFormat.indent.caseContentsWhenBlock": true, - "C_Cpp.vcFormat.space.pointerReferenceAlignment": "right", - "C_Cpp.default.browse.limitSymbolsToIncludedHeaders": false, - "C_Cpp.default.cppStandard": "c++20", - "C_Cpp.default.cStandard": "c17", - "C_Cpp.formatting": "clangFormat", - "[c]": { - "editor.formatOnSave": true, - "editor.defaultFormatter": "ms-vscode.cpptools" - }, - "[cpp]": { - "editor.formatOnSave": true, - "editor.defaultFormatter": "ms-vscode.cpptools" - }, "C_Cpp.codeAnalysis.clangTidy.enabled": true, - "C_Cpp.configurationWarnings": "disabled", - "cmake.configureOnOpen": false, + "C_Cpp.configurationWarnings": "enabled", + "C_Cpp.default.browse.limitSymbolsToIncludedHeaders": false, + "C_Cpp.default.cStandard": "c11", + "C_Cpp.default.compilerPath": "", + "C_Cpp.default.cppStandard": "c++11", + "C_Cpp.default.enableConfigurationSquiggles": true, + "C_Cpp.errorSquiggles": "enabledIfIncludesResolve", + "C_Cpp.formatting": "default", + "C_Cpp.loggingLevel": "Debug", + "C_Cpp.vcFormat.indent.caseContentsWhenBlock": true, + "C_Cpp.vcFormat.indent.namespaceContents": false, + "C_Cpp.vcFormat.indent.preserveComments": true, + "C_Cpp.vcFormat.space.pointerReferenceAlignment": "right", + // CMake integration settings "cmake.autoSelectActiveFolder": false, "cmake.configureOnEdit": false, - "c-cpp-flylint.flexelint.configFile": "", - "c-cpp-flylint.flexelint.executable": "", - "c-cpp-flylint.language": "c", - "C_Cpp.autocompleteAddParentheses": true, - "C_Cpp.errorSquiggles": "enabled", - "C_Cpp_Runner.makePath": "", - "cmake.sourceDirectory": "${workspaceFolder}", - "C_Cpp.default.compilerPath": "/usr/bin", - "C_Cpp.loggingLevel": "Error", - "C_Cpp.default.enableConfigurationSquiggles": true, - "C_Cpp.default.includePath": [ - "${workspaceFolder}/**", // Include all files in the workspace folder - "/usr/include", // Standard system include path - "/usr/local/include", // Additional system include path - "/path/to/custom/includes" // Custom include path - ], - "workbench.editorAssociations": { - "*.bin": "default", - "*.h": "default", - "*.c": "default", - "*.json": "default", - "*.asm": "default" + "cmake.configureOnOpen": false, + "cmake.cmakePath": "/usr/bin/cmake", + "cmake.sourceDirectory": "${workspaceFolder}/", + // Language-specific settings + "[c]": { + "editor.defaultFormatter": "ms-vscode.cpptools", + "editor.formatOnSave": true }, - "C_Cpp.default.intelliSenseMode": "linux-gcc-x86", - "cmake.cmakePath": "/usr/bin/cmake" + "[cpp]": { + "editor.defaultFormatter": "ms-vscode.cpptools", + "editor.formatOnSave": true + }, + // File associations + "files.associations": { + "*.c": "c", + "*.cpp": "cpp", + "*.h": "c", + "*.hpp": "c" + }, + "workbench.editorAssociations": { + "*.c": "default", + "*.cpp": "default", + "*.h": "default", + "*.hpp": "default" + }, + // IntelliSense configuration + "C_Cpp.default.includePath": [ + "/usr/include", + "${workspaceFolder}/**", + "${workspaceFolder}/src/include", + "${workspaceFolder}/include" + ], + "C_Cpp.default.defines": [], + "C_Cpp.default.compileCommands": "build/compile_commands.json", + "C_Cpp.default.browse.path": [ + "/usr/include", + "${workspaceFolder}/**", + "${workspaceFolder}/src/include", + "${workspaceFolder}/include" + ], + "C_Cpp.default.browse.databaseFilename": "${workspaceFolder}/.vscode/browse.vc.db", + "C_Cpp.default.configurationProvider": "ms-vscode.cpptools", + "C_Cpp.default.intelliSenseMode": "linux-gcc-x64", } \ No newline at end of file diff --git a/src/boot/boot.asm b/src/boot/boot.asm index 8baf464..9ed4f16 100644 --- a/src/boot/boot.asm +++ b/src/boot/boot.asm @@ -16,10 +16,10 @@ identify_drive: cmp cl, 0x80 ; Check for hard disk interrupt vector (example) je is_harddrive ; Handle invalid drive type (error handling) - ... + ; ... is_floppy: - Perform floppy disk access (assuming AH=0x02 for read sectors) + ; Perform floppy disk access (assuming AH=0x02 for read sectors) mov ah, 0x02 ; Read sectors mov al, 1 ; Number of sectors to read (1) @@ -68,8 +68,8 @@ memory_error: ; ... (error handling or continue with limited memory) ; Second stage loading (simplified example) -Here's an improved version of the load_second_stage section with the placeholder jump replaced by actual loading logic: -Code snippet +; Here's an improved version of the load_second_stage section with the placeholder jump replaced by actual loading logic: +; Code snippet load_second_stage: ; Calculate address of second stage bootloader (assuming offset from boot sector) diff --git a/src/boot/boot2.asm b/src/boot/boot2.asm index 098226c..fffde1f 100644 --- a/src/boot/boot2.asm +++ b/src/boot/boot2.asm @@ -8,89 +8,82 @@ start: MOV SP, 0xFFFF ; Stack grows downwards from the top of the segment ; Copy boot sector data to a safe location - mCopyBootSector - + call mCopyBootSector ; Load the kernel CALL load_kernel - switch_to_protected_mode: - CLI ; Disable interrupts - lgdt [gdt_descriptor] ; Load the global descriptor table - MOV EAX, CR0 - OR EAX, 0x1 ; Set the PE (Protection Enable) bit - MOV CR0, EAX - ; Far jump to flush CPU queue after changing to protected mode - JMP CODE_SEG:init_pm ; CODE_SEG is the segment selector for code segment in GDT - init_pm: - ; Update segment registers here - ; Set code segment register (CS) to point to code segment descriptor (selector 1) - mov ax, 0x0001 - mov ds, ax ; Set data segment register (DS) to point to data segment descriptor (selector 2) - mov es, ax ; Set other segment registers (ES, SS, etc.) as needed - RET +switch_to_protected_mode: + CLI ; Disable interrupts + lgdt [gdt_descriptor] ; Load the global descriptor table + MOV EAX, CR0 + OR EAX, 0x1 ; Set the PE (Protection Enable) bit + MOV CR0, EAX + ; Far jump to flush CPU queue after changing to protected mode + JMP CODE_SEG:init_pm ; CODE_SEG is the segment selector for code segment in GDT +init_pm: + ; Update segment registers here + ; Set code segment register (CS) to point to code segment descriptor (selector 1) + mov ax, 0x0001 + mov ds, ax ; Set data segment register (DS) to point to data segment descriptor (selector 2) + mov es, ax ; Set other segment registers (ES, SS, etc.) as needed + RET +enable_a20: + cli ; Disable interrupts to prevent interference + call a20wait ; Wait for the keyboard controller to be ready + mov al, 0xAD ; Command to disable keyboard + out 0x64, al ; Send command to keyboard controller command port + call a20wait ; Wait for the keyboard controller to be ready + mov al, 0xD0 ; Command to read output port + out 0x64, al ; Send command to keyboard controller command port + call a20wait ; Wait for the keyboard controller to be ready + in al, 0x60 ; Read current state of output port + or al, 0x02 ; Set A20 bit + out 0x64, al ; Send command to keyboard controller command port + call a20wait ; Wait for the keyboard controller to be ready + mov al, 0xD1 ; Command to write output port + out 0x64, al ; Send command to keyboard controller command port + call a20wait ; Wait for the keyboard controller to be ready + mov al, 0xAE ; Command to re-enable keyboard + out 0x64, al ; Send command to keyboard controller command port + sti ; Re-enable interrupts + ret - enable_a20: - ; Enable A20 gate - cli ; Disable interrupts to prevent interference - call a20wait ; Wait for the keyboard controller to be ready - mov al, 0xAD ; Command to disable keyboard - out 0x64, al ; Send command to keyboard controller command port - call a20wait ; Wait for the keyboard controller to be ready - mov al, 0xD0 ; Command to read output port - out 0x64, al ; Send command to keyboard controller command port - call a20wait ; Wait for the keyboard controller to be ready - in al, 0x60 ; Read current state of output port - or al, 0x02 ; Set A20 bit - call a20wait ; Wait for the keyboard controller to be ready - mov al, 0xD1 ; Command to write output port - out 0x64, al ; Send command to keyboard controller command port - call a20wait ; Wait for the keyboard controller to be ready - mov al, 0x02 ; New output port data with A20 enabled - out 0x60, al ; Write new output port data - call a20wait ; Wait for the keyboard controller to be ready - sti ; Re-enable interrupts - ret +; Wait for keyboard controller to be ready +a20wait: + in al, 0x64 ; Read keyboard controller status port + test al, 0x02 ; Check if input buffer is full + jnz a20wait ; Wait until it's not full + ret - ; Wait for keyboard controller to be ready - a20wait: - in al, 0x64 ; Read keyboard controller status port - test al, 0x02 ; Check if input buffer is full - jnz a20wait ; Wait until it's not full - ret +; Enter kernel space and jump to the kernel entry point +JMP 0x1000:0x0000 - ; Enter kernel space and jump to the kernel entry point - JMP 0x1000:0x0000 +; Code to set up flat memory model for protected mode +; This involves setting up the segment registers with selectors +; that point to descriptors in the GDT that define a flat memory model - ; Code to set up flat memory model for protected mode - ; This involves setting up the segment registers with selectors - ; that point to descriptors in the GDT that define a flat memory model +limit = 0x00CFFFFFh ; Define limit as a separate variable within gdt_struct - ; Define GDT structure - gdt_struct: - ; Null descriptor (ignored) - dq 0x0000000000000000h - dq 0x0000000000000000h +; Placeholder instruction to satisfy NASM +dummy_instruction DB 0x90 ; NOP instruction as a placeholder - ; Code segment descriptor (flat memory model) - ; Base address 0, limit 0xffffffff (full 4GB) - ; Present, Readable, Accessed, Code segment, 4KB granularity - ; Flags: 0x9A (Bits explained below) - dq 0x0000000000000000h - dq 0x00CFFFFFFFh - db 0x9A - db 0xCF +gdt_struct: - ; Data segment descriptor (flat memory model) - ; Similar structure to code segment descriptor with Data segment flag set - dq 0x0000000000000000h - dq 0x00CFFFFFFFh - db 0x92 - db 0xCF + base_addr equ 0x0000000 - ; Jump to the kernel entry point - JMP 0x1000:0x0000 ; Assuming the kernel is loaded at 0x1000:0x0000 + ; Null descriptor (ignored) + dd base_addr, 0 ; Both values are zero for a null descriptor + ; Code segment descriptor (flat memory model) + dd base_addr, limit + db 0x9A + db 0xCF + + ; Data segment descriptor (flat memory model) + dd base_addr, limit + db 0x92 + db 0xCF ; Macro to copy boot sector data to a safe location mCopyBootSector: diff --git a/src/boot/linker.ld b/src/boot/linker.ld index fda2a64..b93be98 100644 --- a/src/boot/linker.ld +++ b/src/boot/linker.ld @@ -28,7 +28,4 @@ SECTIONS { bootloader_padding : { *(.bootloader_padding) } - - /* Set the bootloader size to 512 bytes */ - = 512; } \ No newline at end of file