Mercurial > hg > Members > taiki > original_os
diff withGRUB2Kernel/bootstrap.S @ 14:acdc2c21996a
chage directory structure
author | Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 05 Sep 2012 11:49:15 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/withGRUB2Kernel/bootstrap.S Wed Sep 05 11:49:15 2012 +0900 @@ -0,0 +1,143 @@ +/* + * This program is boot to kernel. + * Change mode to 64bit mode and go to CbC kernel. */ + +.file "bootstrap.S" + +#include "multiboot2.h" +#include "boot_header.h" + +.code32 +.text + + /* Align 64 bit boundly. */ + .align 8 +multiboot_header: + .long MULTIBOOT2_HEADER_MAGIC + .long MULTIBOOT_ARCHITECTURE_I386 + .long multiboot_header_end - multiboot_header + .long -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + (multiboot_header_end - multiboot_header)) + .short MULTIBOOT_HEADER_TAG_END + .short 0 + .long 8 +multiboot_header_end: + + +/* + * Prepare for entering 64bit-mode. + */ + +.globl _start + +_start: + jmp move_longmode + +move_longmode: + /* load new GDT */ + leal gdt(%ebp), %eax + movl %eax, gdt+2(%ebp) + lgdt gdt(%ebp) + + /* + * PAE mode ON. + * Physical Address Extension + * You can use capacity of memory more than 4GiB on 32 bit CPU. + */ + + movl $0x00000020, %eax + movl %eax, %cr4 + + /* + * create 64bit page table + */ + + /* + * Initialize page tables to 0 + * 6144 = 512*8*6/4 + */ + + movl $0x01fe9000, %ebx + leal pgtable(%ebx), %edi + xorl %eax, %eax + movl $6144, %ecx + rep stosl + + /* Build Level 4 */ + leal pgtable + 0(%ebx), %edi + leal 0x1007(%edi), %eax + movl %eax, 0(%edi) + + /* Build Level 3 */ + leal pgtable + 0x1000(%ebx), %edi + leal 0x1007(%edi), %eax + movl $4, %ecx +1: movl %eax, 0x00(%edi) + addl $0x00001000, %eax + addl $8, %edi + decl %ecx + jnz 1b + + /* Build level 2 */ + leal pgtable + 0x2000(%ebx), %edi + movl $0x00000183, %eax + movl $2048, %ecx +1: movl %eax, 0(%edi) + addl $0x00200000, %eax + addl $8, %edi + decl %ecx + jnz 1b + + /* Enable the boot page talbes */ + leal pgtable(%ebx), %eax + movl %eax, %cr3 + + /* Enable Long mode */ + movl $MSR_EFER, %ecx + rdmsr + btsl $EFER_LME, %eax + wrmsr + + pushl $(12*8) + leal start_kernel(%ebp), %eax + pushl %eax + + /* activating Long Mode */ + movl %eax, %cr0 + + jmp start_kernel + + +/* + * jump to kernel. + * push ebx and eax send argument to kernel. + */ +.code64 +.text + +start_kernel: + pushq %rbx + pushq %rax + call kmain + +.data +gdt: + .word gdt_end - gdt + .long gdt + .word 0 + .quad 0x0000000000000000 /* NULL descriptor */ + .quad 0x00af9a000000ffff /* __KERNEL_CS */ + .quad 0x00cf92000000ffff /* __KERNEL_DS */ + .quad 0x0080890000000000 /* TS descriptor */ + .quad 0x0000000000000000 /* TS continued */ +gdt_end: + + +/* + * Space for page tables. + * a : section is allocatable. + * @nobits : section does not contain data. + */ +.section ".pgtable", "a", @nobits +.balign 4096 +pgtable: + .fill 6*4096, 1, 0