diff options
Diffstat (limited to 'arch/i386/boot')
-rw-r--r-- | arch/i386/boot/boot.s | 55 | ||||
-rw-r--r-- | arch/i386/boot/tty.c | 2 |
2 files changed, 50 insertions, 7 deletions
diff --git a/arch/i386/boot/boot.s b/arch/i386/boot/boot.s index 56ac227..792a790 100644 --- a/arch/i386/boot/boot.s +++ b/arch/i386/boot/boot.s @@ -4,29 +4,72 @@ .set MAGIC, 0x1BADB002 .set CHECKSUM, -(MAGIC + FLAGS) -.section .multiboot +.section .multiboot.data, "aw" .align 4 .long MAGIC .long FLAGS .long CHECKSUM -.section .bss -.align 16 +.section .bootstrap_stack, "aw", @nobits stack_bottom: .skip 16384 stack_top: -.section .text +.section .bss, "aw", @nobits + .align 4096 +boot_page_directory: + .skip 4096 +boot_page_table0: + .skip 4096 + +.section .multiboot.text, "a" .global _start .type _start, @function _start: + movl $(boot_page_table0 - 0xC0000000), %edi + movl $0, %esi + movl $1023, %ecx + +1: cmpl $_kernel_start, %esi + jl 2f + cmpl $(_kernel_end - 0xC0000000), %esi + jge 3f + + movl %esi, %edx + orl $0x003, %edx + movl %edx, (%edi) + +2: addl $4096, %esi + addl $4, %edi + loop 1b + +3: movl $(0x000B8000 | 0x003), boot_page_table0 - 0xC0000000 + 1023 * 4 + + movl $(boot_page_table0 - 0xC0000000 + 0x003), boot_page_directory - 0xC0000000 + movl $(boot_page_table0 - 0xC0000000 + 0x003), boot_page_directory - 0xC0000000 + 768 * 4 + + movl $(boot_page_directory - 0xC0000000), %ecx + movl %ecx, %cr3 + + movl %cr0, %ecx + orl $0x80010000, %ecx + movl %ecx, %cr0 + + lea 4f, %ecx + jmp *%ecx + +.section .text + +4: movl $0, boot_page_directory + 0 + + movl %cr3, %ecx + movl %ecx, %cr3 + movl $stack_top, %esp - call _init call kernel_main cli 1: hlt jmp 1b -.size _start, . - _start diff --git a/arch/i386/boot/tty.c b/arch/i386/boot/tty.c index 9244415..2c75760 100644 --- a/arch/i386/boot/tty.c +++ b/arch/i386/boot/tty.c @@ -6,7 +6,7 @@ static const size_t VGA_WIDTH = 80; static const size_t VGA_HEIGHT = 25; -static uint16_t *const VGA_MEMORY = (uint16_t*)0xB8000; +static uint16_t *const VGA_MEMORY = (uint16_t*)0xC03FF000; static size_t terminal_row; static size_t terminal_column; |