🆕 切换为grub2引导,能进入Start_Kernel函数(未能完成初始化)

This commit is contained in:
fslongjin
2022-02-21 14:39:48 +08:00
parent a2aea12510
commit 0b0cce9326
21 changed files with 1128 additions and 1377 deletions

View File

@ -4,11 +4,247 @@
#include "common/asm.h"
// multiboot2
// How many bytes from the start of the file we search for the header.
#define MULTIBOOT_SEARCH 32768
#define MULTIBOOT_HEADER_ALIGN 8
// The magic field should contain this.
#define MULTIBOOT2_HEADER_MAGIC 0xe85250d6
// This should be in %eax.
#define MULTIBOOT2_BOOTLOADER_MAGIC 0x36d76289
// Alignment of multiboot modules.
#define MULTIBOOT_MOD_ALIGN 0x00001000
// Alignment of the multiboot info structure.
#define MULTIBOOT_INFO_ALIGN 0x00000008
// Flags set in the 'flags' member of the multiboot header.
#define MULTIBOOT_TAG_ALIGN 8
#define MULTIBOOT_TAG_TYPE_END 0
#define MULTIBOOT_TAG_TYPE_CMDLINE 1
#define MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME 2
#define MULTIBOOT_TAG_TYPE_MODULE 3
#define MULTIBOOT_TAG_TYPE_BASIC_MEMINFO 4
#define MULTIBOOT_TAG_TYPE_BOOTDEV 5
#define MULTIBOOT_TAG_TYPE_MMAP 6
#define MULTIBOOT_TAG_TYPE_VBE 7
#define MULTIBOOT_TAG_TYPE_FRAMEBUFFER 8
#define MULTIBOOT_TAG_TYPE_ELF_SECTIONS 9
#define MULTIBOOT_TAG_TYPE_APM 10
#define MULTIBOOT_TAG_TYPE_EFI32 11
#define MULTIBOOT_TAG_TYPE_EFI64 12
#define MULTIBOOT_TAG_TYPE_SMBIOS 13
#define MULTIBOOT_TAG_TYPE_ACPI_OLD 14
#define MULTIBOOT_TAG_TYPE_ACPI_NEW 15
#define MULTIBOOT_TAG_TYPE_NETWORK 16
#define MULTIBOOT_TAG_TYPE_EFI_MMAP 17
#define MULTIBOOT_TAG_TYPE_EFI_BS 18
#define MULTIBOOT_TAG_TYPE_EFI32_IH 19
#define MULTIBOOT_TAG_TYPE_EFI64_IH 20
#define MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR 21
#define MULTIBOOT_HEADER_TAG_END 0
#define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST 1
#define MULTIBOOT_HEADER_TAG_ADDRESS 2
#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS 3
#define MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS 4
#define MULTIBOOT_HEADER_TAG_FRAMEBUFFER 5
#define MULTIBOOT_HEADER_TAG_MODULE_ALIGN 6
#define MULTIBOOT_HEADER_TAG_EFI_BS 7
#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI32 8
#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI64 9
#define MULTIBOOT_HEADER_TAG_RELOCATABLE 10
#define MULTIBOOT_ARCHITECTURE_I386 0
#define MULTIBOOT_ARCHITECTURE_MIPS32 4
#define MULTIBOOT_HEADER_TAG_OPTIONAL 1
#define MULTIBOOT_LOAD_PREFERENCE_NONE 0
#define MULTIBOOT_LOAD_PREFERENCE_LOW 1
#define MULTIBOOT_LOAD_PREFERENCE_HIGH 2
#define MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED 1
#define MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2
// -m64 64
// 32 32 64
// 64 -m32 long -m64
// x86_64(IA32E)
// See https://wiki.osdev.org/Creating_a_64-bit_kernel:
// With a 32-bit bootstrap in your kernel
// long
// 32bit
// 32
.code32
// multiboot2
//
.SET HEADER_LENGTH, multiboot_header_end - multiboot_header
//
.SET CHECKSUM, -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + HEADER_LENGTH)
// 8
.align MULTIBOOT_HEADER_ALIGN
//
.section .multiboot_header
multiboot_header:
//
.long MULTIBOOT2_HEADER_MAGIC
//
.long MULTIBOOT_ARCHITECTURE_I386
//
.long HEADER_LENGTH
//
.long CHECKSUM
// Multiboot2 Specification version 2.0.pdf
.short MULTIBOOT_HEADER_TAG_END
//
.short 0
.long 8
multiboot_header_end:
// 4KB/
.section .data
.align 0x1000
pml4:
.skip 0x1000
pdpt:
.skip 0x1000
pd:
.skip 0x1000
pt:
.skip 0x1000
// GDT
.align 16
gdt64:
null_desc:
.short 0xFFFF
.short 0
.byte 0
.byte 0
.byte 0
.byte 0
code_desc:
.short 0
.short 0
.byte 0
.byte 0x9A
.byte 0x20
.byte 0
data_desc:
.short 0
.short 0
.byte 0
.byte 0x92
.byte 0
.byte 0
user_code_desc:
.short 0
.short 0
.byte 0
.byte 0xFA
.byte 0x20
.byte 0
user_data_desc:
.short 0
.short 0
.byte 0
.byte 0xF2
.byte 0
.byte 0
gdt64_pointer:
.short gdt64_pointer-gdt64-1
.quad gdt64
gdt64_pointer64:
.short gdt64_pointer-gdt64-1
.quad gdt64
.section .text
.global _start
.type _start, @function
# multiboot2.cpp
.extern boot_info_addr
.extern multiboot2_magic
_start:
//
cli
// multiboot2_info
//mov %ebx, boot_info_addr
//
//mov %eax, multiboot2_magic
/
// 1. PAE
mov %cr4, %eax
or $(1<<5), %eax
mov %eax, %cr4
// 2.
//
mov $pml4, %eax
mov $pdpt, %ebx
or $0x3, %ebx
mov %ebx, 0(%eax)
//
mov $pdpt, %eax
mov $pd, %ebx
or $0x3, %ebx
mov %ebx, 0(%eax)
//
mov $pd, %eax
mov $pt, %ebx
or $0x3, %ebx
mov %ebx, 0(%eax)
//
// 512
mov $512, %ecx
mov $pt, %eax
mov $0x3, %ebx
.fill_pt:
mov %ebx, 0(%eax)
add $0x1000, %ebx
add $8, %eax
loop .fill_pt
// CR3
mov $pml4, %eax
mov %eax, %cr3
// 3. long
mov $0xC0000080, %ecx
rdmsr
or $(1<<8), %eax
wrmsr
// 4.
mov %cr0, %eax
or $(1<<31), %eax
mov %eax, %cr0
// 5. GDT
mov $gdt64_pointer, %eax
lgdt 0(%eax)
// 6. 64
jmp $0x8, $_start64
hlt
ret
.section .text
.global _start
_start:
.code64
.global _start64
.type _start64, @function
.extern Start_Kernel
ENTRY(_start64)
//
mov $0x10, %ax
mov %ax, %ds
@ -28,14 +264,26 @@ _start:
mov %ax, %fs
mov %ax, %ss
mov %ax, %gs
movq $0x7e00, %rsp
// 2.
//
mov $__PML4E, %eax
mov $__PDPTE, %ebx
or $0x7, %ebx
mov %ebx, 0(%eax)
//
mov $__PDPTE, %eax
mov $__PDE, %ebx
or $0x7, %ebx
mov %ebx, 0(%eax)
// ==== CR3
movq $0x101000, %rax //
movq $__PML4E, %rax //
movq %rax, %cr3
movq switch_seg(%rip), %rax
movq switch_seg(%rip), %rax
// ljmplcallGASlretcs
// Amazing
pushq $0x08 //
@ -44,9 +292,11 @@ _start:
// 64
switch_seg:
.quad entry64
entry64:
movq $0x10, %rax
movq %rax, %ds
movq %rax, %es
@ -119,11 +369,8 @@ SetUp_TSS64:
// mov $0x50, %ax // 80
// ltr %ax
//
movq go_to_kernel(%rip), %rax
pushq $0x08
pushq %rax
lretq
call Start_Kernel
go_to_kernel:
.quad Start_Kernel
@ -148,13 +395,14 @@ ENTRY(_stack_start)
//
.align 8 //8byte
.align 0x1000 //8byte
.org 0x1000 //0x1000
__PML4E:
.quad 0x102007 // 访 31~12
.fill 255,8,0
.quad 0x102007
.quad 0x102007
.fill 255,8,0
.org 0x2000
@ -185,6 +433,7 @@ __PDE:
// GDT
.section .data
.align 16
.global GDT_Table // 使GDT访
GDT_Table: