Merge into main the new state of the operating system/kernel #1
							
								
								
									
										9
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								Makefile
									
									
									
									
									
								
							| @ -3,7 +3,7 @@ EMULATOR = qemu-system-i386 | |||||||
| AS = ${HOME}/opt/cross/bin/i686-elf-as | AS = ${HOME}/opt/cross/bin/i686-elf-as | ||||||
| CC = ${HOME}/opt/cross/bin/i686-elf-gcc | CC = ${HOME}/opt/cross/bin/i686-elf-gcc | ||||||
| CPP = ${HOME}/opt/cross/bin/i686-elf-g++  | CPP = ${HOME}/opt/cross/bin/i686-elf-g++  | ||||||
| CFLAGS =  -ffreestanding -O2 -Wall -Wextra | CFLAGS =  -ffreestanding -Og -ggdb  -Wall -Wextra | ||||||
|  |  | ||||||
| OFILES =$(BUILD_DIR)/boot.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o $(BUILD_DIR)/memory.o  $(BUILD_DIR)/paging.o	$(BUILD_DIR)/pit.o 	$(BUILD_DIR)/time.o	$(BUILD_DIR)/keyboard.o	 $(BUILD_DIR)/io.o 	$(BUILD_DIR)/gdtc.o $(BUILD_DIR)/idt.o $(BUILD_DIR)/pic.o $(BUILD_DIR)/sv-terminal.o $(BUILD_DIR)/string.o   | OFILES =$(BUILD_DIR)/boot.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o $(BUILD_DIR)/memory.o  $(BUILD_DIR)/paging.o	$(BUILD_DIR)/pit.o 	$(BUILD_DIR)/time.o	$(BUILD_DIR)/keyboard.o	 $(BUILD_DIR)/io.o 	$(BUILD_DIR)/gdtc.o $(BUILD_DIR)/idt.o $(BUILD_DIR)/pic.o $(BUILD_DIR)/sv-terminal.o $(BUILD_DIR)/string.o   | ||||||
|  |  | ||||||
| @ -34,11 +34,14 @@ iso: clean_iso clean build | |||||||
| 	grub-mkrescue -o build/barinkOS.iso root | 	grub-mkrescue -o build/barinkOS.iso root | ||||||
| 	 | 	 | ||||||
| run: all | run: all | ||||||
| 	$(EMULATOR)  -kernel $(BUILD_DIR)/myos.bin -serial stdio -vga std -display gtk -m 2G -cpu core2duo  | 	$(EMULATOR) -cdrom build/barinkOS.iso -serial stdio -vga std -display gtk -m 2G -cpu core2duo | ||||||
|  |  | ||||||
|  | debug: all | ||||||
|  | 	$(EMULATOR) -cdrom build/barinkOS.iso -serial stdio -vga std -display gtk -m 2G -cpu core2duo -s -d int | ||||||
|  |  | ||||||
| build_kernel: $(OBJ_LINK_LIST) | build_kernel: $(OBJ_LINK_LIST) | ||||||
| 	$(CC) -T $(SRC_DIR)/kernel//linker.ld -o $(BUILD_DIR)/myos.bin \ | 	$(CC) -T $(SRC_DIR)/kernel//linker.ld -o $(BUILD_DIR)/myos.bin \ | ||||||
| 	 -ffreestanding -O2 -nostdlib $(OBJ_LINK_LIST) -lgcc | 	 -ffreestanding -ggdb -Og -nostdlib $(OBJ_LINK_LIST) -lgcc | ||||||
|  |  | ||||||
| build_x86_64:  | build_x86_64:  | ||||||
| 	$(AS) $(SRC_DIR)/cgc/x86_64/crti.s -o $(BUILD_DIR)/crti_64.o | 	$(AS) $(SRC_DIR)/cgc/x86_64/crti.s -o $(BUILD_DIR)/crti_64.o | ||||||
|  | |||||||
| @ -7,30 +7,104 @@ | |||||||
| .set MAGIC,    0x1BADB002       /* 'magic number' lets bootloader find the header */ | .set MAGIC,    0x1BADB002       /* 'magic number' lets bootloader find the header */ | ||||||
| .set CHECKSUM, -(MAGIC + FLAGS) /* checksum of above, to prove we are multiboot */ | .set CHECKSUM, -(MAGIC + FLAGS) /* checksum of above, to prove we are multiboot */ | ||||||
|  |  | ||||||
| .section .multiboot | .section .multiboot.data, "aw" | ||||||
| .align 4 | .align 4 | ||||||
| .long MAGIC | .long MAGIC | ||||||
| .long FLAGS | .long FLAGS | ||||||
| .long CHECKSUM | .long CHECKSUM | ||||||
|   |   | ||||||
|  | /* | ||||||
| .section .bss | *	Allocate initial stack | ||||||
| .align 16 | */ | ||||||
|  | .section .bootstrap_stack, "aw", @nobits | ||||||
| stack_bottom: | stack_bottom: | ||||||
| .skip 16384 # 16 KiB | .skip 16384 # 16 KiB | ||||||
| stack_top: | stack_top: | ||||||
|   |  | ||||||
| .section .text |  | ||||||
| .include "./src/kernel/Memory/GDT/gdt.s" |  | ||||||
| .include "./src/kernel/irs_table.s" |  | ||||||
| .include "./src/kernel/irq_table.s" |  | ||||||
| .include "./src/kernel/Interrupts/idt/idt.s" |  | ||||||
| .include "./src/kernel/Memory/paging.s" |  | ||||||
| .include "./src/kernel/cpu.s" |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | * Preallocate a couple pages to get us bootstrapped  | ||||||
|  | * Being carefull to not use any address the bootloader might  | ||||||
|  | * be using for its multiboot structures | ||||||
|  | */ | ||||||
|  | .section .bss, "aw", @nobits | ||||||
|  | 	.align 4096 | ||||||
|  | boot_page_directory: | ||||||
|  | 	.skip 4096 | ||||||
|  | boot_page_table: | ||||||
|  | 	.skip 4096 | ||||||
|  | # More page tables may be required | ||||||
|  |  | ||||||
|  | # Entry point | ||||||
|  | .section .multiboot.text, "a" | ||||||
| .global _start | .global _start | ||||||
| .type _start, @function | .type _start, @function  | ||||||
| _start: | _start: | ||||||
|  | 	# Get physical address of the boot_page_table | ||||||
|  | 	movl $(boot_page_table - 0xC0000000), %edi | ||||||
|  | 	# Map address 0 | ||||||
|  | 	movl $0, %esi | ||||||
|  | 	# Map 1023 pages the 1024th being the VGA text buffer | ||||||
|  | 	movl $1023, %ecx | ||||||
|  |  | ||||||
|  | 1:	# Map the kernel  | ||||||
|  | 	cmpl $_kernel_start, %esi | ||||||
|  | 	jl 2f | ||||||
|  | 	cmpl $(_kernel_end - 0xC0000000), %esi | ||||||
|  | 	jge 3f | ||||||
|  |  | ||||||
|  | 	# Map physical address as "present and writable" | ||||||
|  | 	movl %esi, %edx | ||||||
|  | 	orl $0x003, %edx | ||||||
|  | 	movl %edx, (%edi) | ||||||
|  |  | ||||||
|  | 2: # Size of page is 4096 bytes | ||||||
|  | 	addl $4096, %esi | ||||||
|  | 	# Size of entries in boot_page_table is 4 bytes | ||||||
|  | 	addl $4, %edi  | ||||||
|  | 	# Loop to the next entry if we haven't finished. | ||||||
|  | 	loop 1b | ||||||
|  |  | ||||||
|  | 3:	# Map VGA video memory to 0xC03FF00 as "present, writable" | ||||||
|  | 	movl $(0x000B8000 | 0x003), boot_page_table - 0xC0000000 + 1023 * 4 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	# IMPORTANT NOTE FROM WIKI.OSDEV.ORG/HIGHER_HALF_X86_BARE_BONES | ||||||
|  |  | ||||||
|  | 	# The page table is used at both page directory entry 0 (virtually from 0x0 | ||||||
|  | 	# to 0x3FFFFF) (thus identity mapping the kernel) and page directory entry | ||||||
|  | 	# 768 (virtually from 0xC0000000 to 0xC03FFFFF) (thus mapping it in the | ||||||
|  | 	# higher half). The kernel is identity mapped because enabling paging does | ||||||
|  | 	# not change the next instruction, which continues to be physical. The CPU | ||||||
|  | 	# would instead page fault if there was no identity mapping.\ | ||||||
|  | 	 | ||||||
|  | 	# Map the page table to both virtual addresss 0x00000000 and 0xC0000000 | ||||||
|  | 	movl $(boot_page_table - 0xC0000000 + 0x003), boot_page_directory - 0xC0000000 + 0 | ||||||
|  | 	movl $(boot_page_table - 0xC0000000 + 0x003), boot_page_directory - 0xC0000000 + 768 * 4 | ||||||
|  |  | ||||||
|  | 	# Set cr3 to the address of the boot_page_directory | ||||||
|  | 	movl $(boot_page_directory - 0xC0000000), %ecx | ||||||
|  | 	movl %ecx, %cr3 | ||||||
|  |  | ||||||
|  | 	# Enable paging and the write-protect bit | ||||||
|  | 	movl %cr0, %ecx | ||||||
|  | 	orl $0x80010000, %ecx | ||||||
|  | 	movl %ecx, %cr0 | ||||||
|  |  | ||||||
|  | 	# Jump to higher half with an absolute jump | ||||||
|  | 	lea 4f, %ecx | ||||||
|  | 	jmp *%ecx | ||||||
|  |  | ||||||
|  | .section .text | ||||||
|  | 4: | ||||||
|  | 	# At this point, paging is fully set up and enabled | ||||||
|  | isPaging: | ||||||
|  | 	# Unmap the identity mapping as it is now unnecessary  | ||||||
|  | 	movl $0, boot_page_directory + 0 | ||||||
|  |  | ||||||
|  | 	# Reload cr3 to force tlb flush  | ||||||
|  | 	movl %cr3, %ecx | ||||||
|  | 	movl %ecx, %cr3 | ||||||
|  |  | ||||||
| 	/*Setup the stack pointer to point to the beginning of our stack */ | 	/*Setup the stack pointer to point to the beginning of our stack */ | ||||||
| 	/* I believe its a high address growing down to lower adress for the stack on x86*/ | 	/* I believe its a high address growing down to lower adress for the stack on x86*/ | ||||||
| 	mov $stack_top, %esp | 	mov $stack_top, %esp | ||||||
| @ -44,16 +118,15 @@ _start: | |||||||
|  |  | ||||||
| 	/* push the magic value */ | 	/* push the magic value */ | ||||||
| 	pushl %eax | 	pushl %eax | ||||||
| 	 |  | ||||||
| 	call early_main |  | ||||||
|  |  | ||||||
|  | 	call early_main | ||||||
|  |  | ||||||
| 	mov %cr0, %eax  | 	mov %cr0, %eax  | ||||||
| 	or $1, %eax | 	or $1, %eax | ||||||
| 	mov %eax, %cr0 | 	mov %eax, %cr0  | ||||||
|  |  | ||||||
| 	 | 	 | ||||||
| 	call kernel_main | 	//call kernel_main | ||||||
|  |  | ||||||
|  |  | ||||||
| 	cli | 	cli | ||||||
| @ -61,6 +134,11 @@ _start: | |||||||
| 	jmp 1b | 	jmp 1b | ||||||
|  |  | ||||||
|  |  | ||||||
| .size _start, . - _start | .include "./src/kernel/Memory/GDT/gdt.s" | ||||||
|  | .include "./src/kernel/irs_table.s" | ||||||
|  | .include "./src/kernel/irq_table.s" | ||||||
|  | .include "./src/kernel/Interrupts/idt/idt.s" | ||||||
|  | .include "./src/kernel/Memory/paging.s" | ||||||
|  | .include "./src/kernel/cpu.s" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ void kterm_init () { | |||||||
|     kterm_row = 0; |     kterm_row = 0; | ||||||
|     kterm_column = 0; |     kterm_column = 0; | ||||||
|     kterm_color = vga_entry_color ( VGA_COLOR_LIGHT_GREY , VGA_COLOR_BLACK); |     kterm_color = vga_entry_color ( VGA_COLOR_LIGHT_GREY , VGA_COLOR_BLACK); | ||||||
|     kterm_buffer = (uint16_t*) 0xB8000; |     kterm_buffer = (uint16_t*) 0xC03FF000; | ||||||
|     for (size_t y = 0; y < VGA_HEIGHT; y++ ){ |     for (size_t y = 0; y < VGA_HEIGHT; y++ ){ | ||||||
|         for( size_t x = 0; x < VGA_WIDTH; x++){ |         for( size_t x = 0; x < VGA_WIDTH; x++){ | ||||||
|             const size_t index = y * VGA_WIDTH + x; |             const size_t index = y * VGA_WIDTH + x; | ||||||
|  | |||||||
| @ -1,11 +1,9 @@ | |||||||
| #include "kernel.h" | #include "kernel.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| extern "C" void kernel_main (BootInfo* bootinfo) { | extern "C" void kernel_main (BootInfo* bootinfo) { | ||||||
|     init_serial(); |     init_serial(); | ||||||
|     pit_initialise(); |     //pit_initialise(); | ||||||
|  |  | ||||||
|     //InitializePaging(); |  | ||||||
|     //Enable(); |  | ||||||
|  |  | ||||||
|     startSuperVisorTerminal(bootinfo); |     startSuperVisorTerminal(bootinfo); | ||||||
| }    | }    | ||||||
| @ -16,8 +14,12 @@ extern "C" void early_main(unsigned long magic, unsigned long addr){ | |||||||
|      * Initialize terminal interface  |      * Initialize terminal interface  | ||||||
|      * NOTE: This should be done later on , the magic value should be checked first. |      * NOTE: This should be done later on , the magic value should be checked first. | ||||||
|      */  |      */  | ||||||
|  |     initGDT(); | ||||||
|     kterm_init(); |     kterm_init(); | ||||||
|      |     init_serial(); | ||||||
|  |     print_serial("Hello Higher half kernel!"); | ||||||
|  |     printf("DDDDDDDDDDDDDDDD"); | ||||||
|  |     return; | ||||||
|     /** |     /** | ||||||
|      * Check Multiboot magic number |      * Check Multiboot magic number | ||||||
|      * NOTE: Printf call should not be a thing this early on ... |      * NOTE: Printf call should not be a thing this early on ... | ||||||
| @ -31,7 +33,7 @@ extern "C" void early_main(unsigned long magic, unsigned long addr){ | |||||||
|      * Show a little banner for cuteness |      * Show a little banner for cuteness | ||||||
|      */ |      */ | ||||||
|     printf("|===    BarinkOS       ===|\n"); |     printf("|===    BarinkOS       ===|\n"); | ||||||
|  |     printf("Kernel Begin AT(0x%x)", kernel_begin); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Use the address given as an argument as the pointer |      * Use the address given as an argument as the pointer | ||||||
| @ -107,17 +109,17 @@ extern "C" void early_main(unsigned long magic, unsigned long addr){ | |||||||
|  |  | ||||||
|         //memAlloc.free_block((void*) memory); |         //memAlloc.free_block((void*) memory); | ||||||
|         //InitializePaging(); |         //InitializePaging(); | ||||||
|         IdentityMap(); |         //IdentityMap(); | ||||||
|         Enable(); |         //Enable(); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     initGDT(); |     //initGDT(); | ||||||
|     init_idt(); |     //init_idt(); | ||||||
|     // Enable interrupts |     // Enable interrupts | ||||||
|     asm volatile("STI"); |     //asm volatile("STI"); | ||||||
|      |      | ||||||
|  |  | ||||||
|     CheckMBT(  (multiboot_info_t *) addr); |     //CheckMBT(  (multiboot_info_t *) addr); | ||||||
|  |  | ||||||
|  |  | ||||||
|     kernel_main(&bootinfo); |     kernel_main(&bootinfo); | ||||||
|  | |||||||
| @ -1,47 +1,45 @@ | |||||||
| /* The bootloader will look at this image and start execution at the symbol |  | ||||||
|    designated as the entry point. */ |  | ||||||
| ENTRY(_start) | ENTRY(_start) | ||||||
|   |   | ||||||
| /* Tell where the various sections of the object files will be put in the final | /* Tell where the various sections of the object files will be put in the final | ||||||
|    kernel image. */ |    kernel image. */ | ||||||
| SECTIONS | SECTIONS | ||||||
| { | { | ||||||
| 	 | 	. = 0x00100000;  /* place code at 1MB mark*/ | ||||||
| 	/* Begin putting sections at 1 MiB, a conventional place for kernels to be |   | ||||||
| 	   loaded at by the bootloader. */ | 	_kernel_start	= .; | ||||||
| 	. = 1M; | 	kernel_begin	= .; /*  For legacy reasons */ | ||||||
|  	kernel_begin = .; |  | ||||||
| 	/* First put the multiboot header, as it is required to be put very early |  | ||||||
| 	   early in the image or the bootloader won't recognize the file format. | 	.multiboot.data : { | ||||||
| 	   Next we'll put the .text section. */ | 		*(.multiboot.data) | ||||||
| 	.text BLOCK(4K) : ALIGN(4K) | 	} | ||||||
|  |  | ||||||
|  | 	.multiboot.text : { | ||||||
|  | 		*(multiboot.text) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	. += 0xC0000000; /* Addresses in the following code need to be above the 3Gb mark */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	.text ALIGN (4K) : AT (ADDR (.text) - 0xC0000000) | ||||||
| 	{ | 	{ | ||||||
| 		*(.multiboot) |  | ||||||
| 		*(.text) | 		*(.text) | ||||||
| 	} | 	} | ||||||
|   | 	.rodata ALIGN (4K) : AT (ADDR (.rodata) - 0xC0000000) | ||||||
| 	/* Read-only data. */ |  | ||||||
| 	.rodata BLOCK(4K) : ALIGN(4K) |  | ||||||
| 	{ | 	{ | ||||||
| 		*(.rodata) | 		*(.rodata) | ||||||
| 	} | 	} | ||||||
|   | 	.data ALIGN (4K) : AT (ADDR (.data) - 0xC0000000) | ||||||
| 	/* Read-write data (initialized) */ |  | ||||||
| 	.data BLOCK(4K) : ALIGN(4K) |  | ||||||
| 	{ | 	{ | ||||||
| 		*(.data) | 		*(.data) | ||||||
| 	} | 	} | ||||||
|   | 	.bss ALIGN (4K) : AT (ADDR (.bss) - 0xC0000000) | ||||||
| 	/* Read-write data (uninitialized) and stack */ |  | ||||||
| 	.bss BLOCK(4K) : ALIGN(4K) |  | ||||||
| 	{ | 	{ | ||||||
| 		*(COMMON) | 		*(COMMON) | ||||||
| 		*(.bss) | 		*(.bss) | ||||||
|  | 		*(.bootstrap_stack) | ||||||
| 	} | 	} | ||||||
|   | 	_kernel_end = .; | ||||||
| 	/* The compiler may produce other sections, by default it will put them in | 	kernel_end = .; /* For legacy reasons */ | ||||||
| 	   a segment with the same name. Simply add stuff here as needed. */ |  | ||||||
|  |  | ||||||
| 	kernel_end = .; |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user