配置multiboot2头

This commit is contained in:
pointer-to-bios 2023-12-05 19:36:10 +08:00
parent e49b569f65
commit 73080be3a6
9 changed files with 62 additions and 76 deletions

1
.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
qemu/metaverse.img filter=lfs diff=lfs merge=lfs -text

Binary file not shown.

View File

@ -1,6 +0,0 @@
#ifndef SYSCTL_H
#define SYSCTL_H 1
#define __asm_hlt__() __asm__("hlt");
#endif

View File

@ -1,48 +0,0 @@
#ifndef MM_H
#define MM_H 1
#include <types.h>
#define MM_PAGE_TABLE_FLAGS_AREA ((u64)0xfff)
/* 页对齐掩码 */
#define MM_4K_ALIGN_MASK ((u64)0xfff)
#define MM_2M_ALIGN_MASK ((u64)0x1fffff)
#define MM_1G_ALIGN_MASK ((u64)0x3fffffff)
/* 页表项属性FLAGS */
#define MM_PML4E_KERNEL_RW_FLAG ((u64)0x3)
#define MM_PML4E_KERNEL_RO_FLAG ((u64)0x1)
#define MM_PDPTE_KERNEL_GLB_BP_RW_FLAG ((u64)0x183)
#define MM_PDPTE_KERNEL_GLB_RW_FLAG ((u64)0x103)
#define MM_PDPTE_KERNEL_GLB_BP_RO_FLAG ((u64)0x181)
#define MM_PDPTE_KERNEL_GLB_RO_FLAG ((u64)0x101)
#define MM_PDPTE_KERNEL_BP_RW_FLAG ((u64)0x83)
#define MM_PDPTE_KERNEL_RW_FLAG ((u64)0x3)
#define MM_PDPTE_KERNEL_BP_RO_FLAG ((u64)0x81)
#define MM_PDPTE_KERNEL_RO_FLAG ((u64)0x1)
#define MM_PDTE_KERNEL_GLB_BP_RW_FLAG ((u64)0x183)
#define MM_PDTE_KERNEL_RW_FLAG ((u64)0x3)
#define MM_PDTE_KERNEL_GLB_BP_RO_FLAG ((u64)0x181)
#define MM_PDTE_KERNEL_RO_FLAG ((u64)0x1)
#define MM_PDTE_KERNEL_BP_RW_FLAG ((u64)0x83)
#define MM_PDTE_KERNEL_BP_RO_FLAG ((u64)0x81)
#define MM_PTE_KERNEL_RW_FLAG ((u64)0x103)
#define MM_PTE_KERNEL_RO_FLAG ((u64)0x101)
/* 页表大小枚举 */
enum mm_page_size
{
MM_PAGE_SIZE_4K = 1,
MM_PAGE_SIZE_2M = 512,
MM_PAGE_SIZE_1G = 262144,
};
#endif

View File

@ -4,12 +4,11 @@
init64: init64:
endbr64 endbr64
cli cli
jmp $
mov rax, 0x1000000 mov rax, 0x1000000
mov rbp, rax mov rbp, rax
mov rsp, rax mov rsp, rax
mov rdi, rbx mov rdi, rbx
jmp qword kmain jmp kmain
section .multiboot2 align=8 section .multiboot2 align=8
MULTIBOOT2_HEADER_MAGIC equ 0xe85250d6 MULTIBOOT2_HEADER_MAGIC equ 0xe85250d6
@ -24,22 +23,25 @@ multiboot2_header:
dd bootinfo_request_tag_end - bootinfo_request_tag dd bootinfo_request_tag_end - bootinfo_request_tag
dd 4 ; basic mamory info dd 4 ; basic mamory info
dd 1 ; boot command line dd 1 ; boot command line
dd 3 ; muldules
dd 6 ; memory map
dd 8 ; framebuffer info dd 8 ; framebuffer info
dd 12 ; efi64 system table pointer dd 12 ; efi64 system table pointer
bootinfo_request_tag_end: bootinfo_request_tag_end:
framebuffer_tag:
dd 5
dd 20
dd 1920 ; width
dd 1080 ; height
dd 32 ; depth
framebuffer_tag_end:
dd 0
end_tag: end_tag:
dd 0 dd 0
dd 8 dd 8
multiboot2_header_end: multiboot2_header_end:
section .bss section .kstack
kstack: kstack:
; TODO 奇怪的问题在这写0x1000000 - 0x400000.bss段会超出0x47f resb 0x1000000 - 0x400000
; 写0x1000000 - 0x400000 - 0x47f.bss段会超出0x1f
; 明明在链接脚本里.bss段的起始地址是0x400000
resb 0x1000000 - 0x400000 - 0x47f - 0x1f
section .kend section .kend
global kend global kend

View File

@ -8,17 +8,17 @@ init32:
cli cli
; 设置PML4的第0项 ; 设置PML4的第0项
mov eax, 0x102000 mov eax, 0x102000 ; PDPT0
add eax, 0x003 add eax, 0x003
mov edi, 0x101000 mov edi, 0x101000 ; PML4
mov dword [edi], eax mov dword [edi], eax
add edi, 4 add edi, 4
mov dword [edi], 0 mov dword [edi], 0
; 设置PDPT的第0项 ; 设置PDPT的第0项
mov eax, 0x103000 mov eax, 0x103000 ; PD0
add eax, 0x003 add eax, 0x003
mov edi, 0x102000 mov edi, 0x102000 ; PDPT0
mov dword [edi], eax mov dword [edi], eax
add edi, 4 add edi, 4
mov dword [edi], 0 mov dword [edi], 0
@ -26,23 +26,23 @@ init32:
; 设置PD0中的PDE ; 设置PD0中的PDE
mov ecx, 64 mov ecx, 64
mov eax, 0 mov eax, 0
mov edi, 0x103000 mov edi, 0x103000 ; PD0
init32_loop0: init32_loop0:
mov edx, eax mov edx, eax
add edx, 0x183 add edx, 0x183
mov dword [edi], edx mov dword [edi], edx
add eax, 0x400000 ; 2MB add eax, 0x200000 ; 2MB
add edi, 4 add edi, 4
mov dword [edi], 0 mov dword [edi], 0
add edi, 4 add edi, 4
loop init32_loop0 loop init32_loop0
; 设置gdt_ptr ; 设置gdt_ptr
mov eax, 0x10402a mov eax, 0x10402a ; gdt_ptr + 2
mov dword [eax], 0x104000 mov dword [eax], 0x104000 ; gdt
; 加载GDTR和段寄存器 ; 加载GDTR和段寄存器
db 0x66 db 0x66
lgdt [0x104028] lgdt [0x104028] ; gdt_ptr
mov ax, 0x10 mov ax, 0x10
mov ds, ax mov ds, ax
mov ss, ax mov ss, ax
@ -56,7 +56,7 @@ init32:
mov cr4, eax mov cr4, eax
; 加载cr3 ; 加载cr3
mov eax, 0x101000 mov eax, 0x101000 ; PML4
mov cr3, eax mov cr3, eax
; 切换ia32e模式 ; 切换ia32e模式
@ -65,7 +65,7 @@ init32:
bts eax, 8 bts eax, 8
wrmsr wrmsr
; 打开分页机制 ; 打开保护模式和分页机制
mov eax, cr0 mov eax, cr0
bts eax, 0 bts eax, 0
bts eax, 31 bts eax, 31

View File

@ -1,5 +1,6 @@
#include <kernel/kernel.h> #include <kernel/kernel.h>
#include <kernel/tty.h> #include <kernel/tty.h>
#include <kernel/memm.h>
#include <libk/multiboot2.h> #include <libk/multiboot2.h>
@ -8,9 +9,23 @@ void get_frame_buffer_with_bootinfo(framebuffer *fb, bootinfo_t *bootinfo);
void kmain(void *mb2_bootinfo) void kmain(void *mb2_bootinfo)
{ {
// 创建bootinfo对象
bootinfo_t bootinfo; bootinfo_t bootinfo;
bootinfo_new(&bootinfo, mb2_bootinfo); bootinfo_new(&bootinfo, mb2_bootinfo);
// 获取内存信息
void **tags;
usize tags_amount;
if ((tags_amount = bootinfo_get_tag(bootinfo, BOOTINFO_BASIC_MEMORY_INFO_TYPE, &tags)) == 0)
{
KERNEL_TODO();
}
bootinfo_basic_memory_info_t *meminfo = bootinfo_basic_memory_info(tags[0]);
usize mem_size = 1024 * 1024 + meminfo->mem_upper * 1024;
// 初始化内存管理模块
mem_manager_t *memm = memm_new(mem_size);
tty_controller_init(); tty_controller_init();
framebuffer fb; framebuffer fb;
@ -34,4 +49,16 @@ void get_frame_buffer_with_bootinfo(framebuffer *fb, bootinfo_t *bootinfo)
{ {
KERNEL_TODO(); KERNEL_TODO();
} }
bootinfo_framebuffer_info_t *fbinfo = bootinfo_framebuffer_info(tags[0]);
fb->pointer = (void *)fbinfo->framebuffer_addr;
fb->width = fbinfo->framebuffer_width;
fb->height = fbinfo->framebuffer_height;
fb->pixsize = fbinfo->framebuffer_bpp / 8;
// TODO 对应内存空间还没有分页
KERNEL_TODO();
for (usize i = 0; i < 10000; i++)
{
((u8 *)fb->pointer)[i] = 0xff;
}
KERNEL_TODO();
} }

View File

@ -7,6 +7,15 @@ typedef struct __bootinfo_next_result_t
void *addr; void *addr;
} bootinfo_next_result_t; } bootinfo_next_result_t;
u32 mbi_record[32];
u32 mbirc = 0;
/**
* @brief
*
* @param bootinfo
* @param result
*/
void bootinfo_next(bootinfo_t *bootinfo, bootinfo_next_result_t *result) void bootinfo_next(bootinfo_t *bootinfo, bootinfo_next_result_t *result)
{ {
if (bootinfo->iter_index >= bootinfo->size) if (bootinfo->iter_index >= bootinfo->size)
@ -34,6 +43,7 @@ void bootinfo_new(bootinfo_t *bootinfo, void *bootinfo_addr)
memset(bootinfo->map_counts, 0, sizeof(bootinfo->map_counts)); memset(bootinfo->map_counts, 0, sizeof(bootinfo->map_counts));
while ((bootinfo_next(bootinfo, &res), res.type)) while ((bootinfo_next(bootinfo, &res), res.type))
{ {
mbi_record[mbirc++] = res.type;
if (res.type == BOOTINFO_EFI_BOOTSERVICE_NOT_TERMINATED_TYPE) if (res.type == BOOTINFO_EFI_BOOTSERVICE_NOT_TERMINATED_TYPE)
{ {
bootinfo->map_counts[res.type] = true; bootinfo->map_counts[res.type] = true;

View File

@ -18,10 +18,10 @@ SECTIONS {
*(.cpumeta) *(.cpumeta)
} }
. = 4M; . = 4M;
.bss : ..kstack :
{ {
kstack = .; kstack = .;
*(.bss) *(.kstack)
} }
. = 16M; . = 16M;
.text : .text :