🆕 完成了内核执行头程序(编译仍有问题)

This commit is contained in:
fslongjin 2022-01-21 11:43:13 +08:00
parent 86aac18b25
commit 24a0a78d15
6 changed files with 191 additions and 3 deletions

View File

@ -1,6 +1,23 @@
cmake_minimum_required(VERSION 3.20) cmake_minimum_required(VERSION 3.20)
project(dragonOS C) set(CMAKE_VERBOSE_MAKEFILE on)
set(DRAGONOS_ARCH "x86_64")
mark_as_advanced(CMAKE_INSTALL_PREFIX)
set(CROSS_COMPILE "${DRAGONOS_ARCH}-linux-gnu-")
set(CMAKE_C_COMPILER "${CROSS_COMPILE}gcc")
set(CMAKE_ASM_COMPILER "${CROSS_COMPILE}gcc")
enable_language(ASM ASM_NASM)
set(CMAKE_C_FLAGS
"-Wall -fPIC -nostdlib -nostartfiles -ffreestanding ")
project(dragonOS C ASM)
set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD 11)
add_subdirectory(bootloader) add_subdirectory(bootloader)
add_subdirectory(kernel)
include_directories(kernel)

View File

@ -619,7 +619,7 @@ GO_TO_TMP_Protect:
mov cr3, eax mov cr3, eax
; ==== 启用长模式 === ; ==== 启用长模式 ===
; 参见英特尔开发手册合集p4360 volume4, chapter2 2-60 Vol. 4 ; 参见英特尔开发手册合集p4360 volume4, chapter2 页码2-60 Vol. 4
; IA32_EFER寄存器的第8位是LME标志位能启用IA-32e模式 ; IA32_EFER寄存器的第8位是LME标志位能启用IA-32e模式
mov ecx, 0xC0000080 mov ecx, 0xC0000080
rdmsr rdmsr

18
kernel/CMakeLists.txt Normal file
View File

@ -0,0 +1,18 @@
#
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin/kernel)
#
add_compile_options(-I ${CMAKE_CURRENT_SOURCE_DIR}/ )
add_library(${PROJECT_NAME}-arch
head.S
main.c)
add_executable(kernel.bin
head.S main.c)
set_property(
TARGET kernel.bin
PROPERTY
DEPENDS
"link.lds"
)

142
kernel/head.S Normal file
View File

@ -0,0 +1,142 @@
//
// Created by longjin.
// 2022/01/20
.section .text
.global _start
_start:
//
mov $0x10, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
mov %ax, %ss
mov $0x7e00, %esp
// === GDTR ====
lgdt GDT_POINTER(%rip) //rip, PICposition independent code
// === IDTR ====
lidt IDT_POINTER(%rip)
mov $0x10, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
mov %ax, %ss
mov %ax, %gs
movq $0x7e00, %rsp
// ==== CR3
movq $0x101000, %rax //
movq %rax, %cr3
movq switch_seg(%rip), %rax
// ljmplcallGASlretcs
// Amazing
pushq $0x08 //
pushq %rax
lretq
// 64
switch_seg:
.quad entry64
entry64:
movq $0x10, %rax
movq %rax, %ds
movq %rax, %es
movq %rax, %gs
movq %rax, %ss
movq $0xffff800000007e00, %rsp //rsp
//
movq go_to_kernel(%rip), %rax
pushq $0x08
pushq %rax
lretq
go_to_kernel:
.quad Start_Kernel
//
.align 8 //8byte
.org 0x1000 //0x1000
__PML4E:
.quad 0x102007 // 访 31~12
.fill 255,8,0
.quad 0x102007
.fill 255,8,0
.org 0x2000
__PDPTE:
.quad 0x103003 // 访
.fill 511,8,0
.org 0x3000
__PDE:
.quad 0x000083 // 访
.quad 0x200083
.quad 0x400083
.quad 0x600083
.quad 0x800083
.quad 0xe0000083 /*0x a00000*/
.quad 0xe0200083
.quad 0xe0400083
.quad 0xe0600083 /*0x1000000*/
.quad 0xe0800083
.quad 0xe0a00083
.quad 0xe0c00083
.quad 0xe0e00083
.fill 499,8,0
// GDT
.section .data
.global GDT_Table // 使GDT访
GDT_Table:
.quad 0x0000000000000000 // 0 00
.quad 0x0020980000000000 // 1 64 08
.quad 0x0000920000000000 // 2 64 10
.quad 0x0020f80000000000 // 3 64 18
.quad 0x0000f20000000000 // 4 64 20
.quad 0x00cf9a000000ffff // 5 32 28
.quad 0x00cf92000000ffff // 6 32 30
.fill 10, 8, 0 // 8~9 TSS() 80
GDT_END:
GDT_POINTER:
GDT_LIMIT: .word GDT_END - GDT_Table - 1 // GDT
GDT_BASE: .quad GDT_Table
// IDT
.global IDT_Table
IDT_Table:
.fill 512, 8, 0 // 512*8IDT
IDT_END:
IDT_POINTER:
IDT_LIMIT: .word IDT_END - IDT_Table - 1
IDT_BASE: .quad IDT_Table
// 64TSS
.global TSS64_Table
TSS64_Table:
.fill 13, 8, 0
TSS64_END:
TSS64_POINTER:
TSS64_LIMIT: .word TSS64_END - TSS64_Table - 1
TSS64_BASE: .quad TSS64_Table

11
kernel/main.c Normal file
View File

@ -0,0 +1,11 @@
//
// Created by longjin on 2022/1/20.
//
void Start_Kernel(void)
{
while(1)
{
};
}

View File

@ -43,7 +43,7 @@ fi
# ========把loader.bin复制到boot.img========== # ========把loader.bin复制到boot.img==========
cp bin/bootloader/loader.bin tmp/boot cp bin/bootloader/loader.bin tmp/boot
# ========把内核程序复制到boot.img====== # ========把内核程序复制到boot.img======
cp bin/bootloader/kernel.bin tmp/boot cp bin/kernel/kernel.bin tmp/boot
sync sync
# 卸载磁盘 # 卸载磁盘
umount tmp/boot umount tmp/boot