Mercurial > hg > Members > taiki > original_os
changeset 16:ae3984023229
separate directory.
author | Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 24 Sep 2012 16:14:04 +0900 |
parents | e7ab5a0911d4 |
children | 0e67c0057780 |
files | withGRUB2Kernel/boot/bootstrap.S withGRUB2Kernel/boot/head64.S withGRUB2Kernel/include/boot_header.h withGRUB2Kernel/include/multiboot2.h withGRUB2Kernel/kernel/kernel.cbc |
diffstat | 5 files changed, 233 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/withGRUB2Kernel/boot/bootstrap.S Mon Sep 24 16:14:04 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 "../include/multiboot2.h" +#include "../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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/withGRUB2Kernel/boot/head64.S Mon Sep 24 16:14:04 2012 +0900 @@ -0,0 +1,15 @@ +/* + * jump to kernel. + * push ebx and eax send argument to kernel. + */ + + +#include "bootstrap.S" + +.code64 +.text + +start_kernel: + pushq %rbx + pushq %rax + call kmain
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/withGRUB2Kernel/include/boot_header.h Mon Sep 24 16:14:04 2012 +0900 @@ -0,0 +1,7 @@ +#ifndef BOOT_HEADER +#define BOOT_HEADER + +#define MSR_EFER 0xc0000080 +#define EFER_LME 8 + +#endif /* BOOT_HEADER */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/withGRUB2Kernel/include/multiboot2.h Mon Sep 24 16:14:04 2012 +0900 @@ -0,0 +1,8 @@ +#ifndef MULTIBOOT2_HEADER +#define MULTIBOOT2_HEADER + +#define MULTIBOOT2_HEADER_MAGIC 0xe85250d6 +#define MULTIBOOT_ARCHITECTURE_I386 0 +#define MULTIBOOT_HEADER_TAG_END 0 + +#endif /* MULTIBOOT2_HEADER */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/withGRUB2Kernel/kernel/kernel.cbc Mon Sep 24 16:14:04 2012 +0900 @@ -0,0 +1,60 @@ +__code memory(int state); +__code kernel(int state); +void init(int state); + +__code put_to_vmem(unsigned char* str, unsigned short *video) +{ + char c; + if ((c=*(str++))!=0) { + *video++ = (0x0E << 8) | c; + goto put_to_vmem(str, video); + } else { + goto kernel(3); + } +} + + +__code putchar(int state) +{ + unsigned short *video = (unsigned short *)0xb8000; + unsigned char *str = (unsigned char *)"hello,world"; + + goto put_to_vmem(str, video); + + goto kernel(2); +} + +__code kernel(int state) +{ + switch(state) { + case 1: + goto putchar(3); + break; + case 2: + goto memory(state); + break; + } + goto kernel(state); +} + +__code memory(int state) +{ + if (state == 1) { + goto kernel(state); + } + init(state); +} + +void +init(int state) +{ + goto kernel(state); +} + +int +kmain(unsigned long magic, unsigned long addr) +{ + int state = 1; + init(state); + return 0; +}