CC := $(CROSS_PREFIX)gcc
LD := $(CROSS_PREFIX)ld
+OBJCOPY := $(CROSS_PREFIX)objcopy
ifeq (,$(shell which $(CC) 2>/dev/null))
$(error "编译器 $(CC) 未找到 请安装交叉编译工具链")
CFLAGS += -fno-omit-frame-pointer
# 禁用控制流保护: Control-Flow Enforcement Technology (CET)
CFLAGS += -fcf-protection=none
+CFLAGS += -nostdlib
CFLAGS += -DNR_TTYS=3
CFLAGS += -DFIXED_SYSENTER_ESP_MODE=1
CFLAGS += -DENABLE_BOOT_WAIT=0
extern void *kernel_end;
extern void *bootmem_bitmap_begin;
-
-#include <cpuid.h>
-
-__attribute__((section(".unpaged_text")))
-void test_unpaged_break() {
- // printk("test unpaged break\n");
-}
-
-
-void lapic_init() {
- cpuid_regs_t r;
- r = cpuid(1);
- if(r.edx & (1 << 9)) {
- printk("local apic supported\n");
- if(r.ecx & (1 << 21)) {
- printk("x2apic supported\n");
- } else {
- panic("x2apic not supported\n");
- }
- } else {
- panic("local apic not supported\n");
- }
-
- uint64_t apic_base = read_msr(MSR_IA32_APIC_BASE);
- printk("apic base: %016lx\n", apic_base);
-
- // 开启2xapic
- apic_base |= (1 << 10);
- write_msr(MSR_IA32_APIC_BASE, apic_base);
-
- apic_base = read_msr(MSR_IA32_APIC_BASE);
- printk("after 2xapic enable apic base: %016lx\n", apic_base);
-
- test_unpaged_break();
-}
-
void init_system_info() {
system.kernel_begin = &kernel_begin;
system.kernel_end = &kernel_end;
boot_delay(DEFAULT_BOOT_DELAY_TICKS);
- lapic_init();
}
.extern check_kernel
.extern init_system_info
.extern setup_kernel
-.extern init_pgd
-.extern init_pgt
-.extern kernel_virtual_addr_start
.extern root_task
.extern root_task_entry
movw %dx,%fs
movw %dx,%gs
-
- nop
- nop
- nop
- nop
movl $(stack + MULTIBOOT_STACK_SIZE), %esp
- #leal stack, %esp
- #addl MULTIBOOT_STACK_SIZE, %esp
# Reset EFLAGS
pushl $0
popf
- call test_unpaged_break
-
# Save Multiboot Infomation...
pushl %eax
addl $KRNLADDR,%ebx
pushl %ebx
- # Setup Paging
- # Clear Page Directory
- movl $init_pgd-KRNLADDR,%ebx
- movl %ebx,%edi
- movl $1024,%ecx
- xorl %eax,%eax
- cld
- rep
- stosl
-
-
- # Length = BOOT_INIT_PAGETBL_CNT*4M
- # [0x00000000, 0x00000000 + Length)
- # [0xC0000000, 0xC0000000 + Length)
- # 这两个线性地址空间都映射到同一片物理内存空间: [0x00000000, 0x00000000 + Length)
-
-
- # 初始化页目录
- # 设置低端线性地址空间的页表项
- movl %ebx,%edi
- movl $init_pgt-KRNLADDR,%eax
- addl $3,%eax
- movl $BOOT_INIT_PAGETBL_CNT,%ecx
-1:
- stosl
- addl $0x1000,%eax
- loop 1b
-
- # 设置内核线性地址空间的页表项
- movl $kernel_virtual_addr_start,%eax
- shrl $20,%eax
- addl %ebx,%eax
- movl %eax,%edi
-
- movl $init_pgt-KRNLADDR,%eax
- addl $3,%eax
- movl $BOOT_INIT_PAGETBL_CNT,%ecx
-2:
- stosl
- addl $0x1000,%eax
- loop 2b
-
- # 初始化页表
- # 直接线性映射BOOT_INIT_PAGETBL_CNT*4M物理内存
- movl $init_pgt-KRNLADDR,%ebx
- movl %ebx,%edi
- movl $(BOOT_INIT_PAGETBL_CNT*1024),%ecx
- movl $3,%eax
- cld
-3:
- stosl
- addl $0x1000,%eax
- loop 3b
-
- movl $init_pgd-KRNLADDR,%ebx
- movl %ebx,%cr3
+ call lapic_init
+
+ call boot_paging
+
+ #movl $init_pgd-KRNLADDR,%ebx
+ #movl %ebx,%cr3
# enable PG WP
movl %cr0,%eax
--- /dev/null
+/*
+ * ------------------------------------------------------------------------
+ * File Name: unpaged_boot.c
+ * Author: Zhao Yanbai
+ * 2025-12-27 21:21:24 Saturday CST
+ * Description: none
+ * ------------------------------------------------------------------------
+ */
+
+#include <types.h>
+#include <msr.h>
+#include <page.h>
+#include <linkage.h>
+#include <boot.h>
+
+
+
+extern unsigned long kernel_virtual_addr_start;
+extern pde_t __initdata init_pgd[PDECNT_PER_PAGE] __attribute__((__aligned__(PAGE_SIZE)));
+extern pte_t __initdata init_pgt[PTECNT_PER_PAGE * BOOT_INIT_PAGETBL_CNT] __attribute__((__aligned__(PAGE_SIZE)));
+
+// Length = BOOT_INIT_PAGETBL_CNT*4M
+// [0x00000000, 0x00000000 + Length - 1]
+// [0xC0000000, 0xC0000000 + Length - 1]
+// 这两个线性地址空间都映射到同一片物理内存空间: [0x00000000, 0x00000000 + Length -1]
+// 总共 BOOT_INIT_PAGETBL_CNT * 4M 物理内存
+void boot_paging() {
+ unsigned long init_pgd_paddr = va2pa(init_pgd);
+ unsigned long init_pgt_paddr = va2pa(init_pgt);
+
+ // 清空页目录
+ pde_t *dir =(pde_t *)init_pgd_paddr;
+ for(int i=0; i<PDECNT_PER_PAGE; i++) {
+ dir[i] = 0;
+ }
+
+ // 初始化页目录
+ unsigned long kpde_base = get_npde((unsigned long)(&kernel_virtual_addr_start));
+ pde_t pd_entry = init_pgt_paddr | PAGE_US | PAGE_WR | PAGE_P;
+ for(int i=0; i<BOOT_INIT_PAGETBL_CNT; i++) {
+ dir[i] = pd_entry; // 设置低端线性地址空间的页表项
+ dir[kpde_base+i] = pd_entry; // 设置内核线性地址空间的页表项
+ pd_entry += PAGE_SIZE;
+ }
+
+
+ pte_t *table = (pte_t *)init_pgt_paddr;
+ pte_t pt_entry = PAGE_US | PAGE_WR | PAGE_P;
+ for(int i=0; i<BOOT_INIT_PAGETBL_CNT*PTECNT_PER_PAGE; i++) {
+ table[i] = pt_entry;
+ pt_entry += PAGE_SIZE;
+ }
+
+
+ // 设置页目录
+ asm volatile("mov %0, %%cr3"::"r"(init_pgd_paddr));
+}
+
+
+void lapic_init() {
+ // cpuid_regs_t r;
+ // r = cpuid(1);
+ // if(r.edx & (1 << 9)) {
+ // printk("local apic supported\n");
+ // if(r.ecx & (1 << 21)) {
+ // printk("x2apic supported\n");
+ // } else {
+ // panic("x2apic not supported\n");
+ // }
+ // } else {
+ // panic("local apic not supported\n");
+ // }
+
+ uint64_t apic_base = read_msr(MSR_IA32_APIC_BASE);
+ // printk("apic base: %016lx\n", apic_base);
+
+ // 开启2xapic
+ apic_base |= (1 << 10);
+ write_msr(MSR_IA32_APIC_BASE, apic_base);
+
+ apic_base = read_msr(MSR_IA32_APIC_BASE);
+ // printk("after 2xapic enable apic base: %016lx\n", apic_base);
+}
set architecture i386
#b *0x100000
-b multiboot.S:60
-b multiboot.S:136
#b *0x7c00
#define PDE_PWT 0x008
#define PDE_PCD 0X010
#define PDE_A 0x020
-// #define PDE_D 0x040
#define PDE_PS 0x080
#define PDE_G 0x100
#define PDE_AVL 0xE00
void tty_switch_to_next();
+void tty_clear(tty_t *tty);
+
extern tty_t *current_tty;
unsigned long spde = (unsigned long)pde_src[i];
unsigned long dpde = 0;
- if (i >= 768) {
+ if (i >= get_npde(PAGE_OFFSET)) {
pde_dst[i] = pde_src[i];
continue;
}
*(.kernel_entry_text)
*(.multiboot2_header)
boot/multiboot.S.o(.text)
- *(.unpaged_text)
+ *unpaged_*.o(.text)
}
eunpagged_text = .;
+
. = ALIGN(0x1000);
.unpaged_data :
{
- boot/multiboot.S.o(COMMON)
- *(.unpaged_data)
+ *unpaged_*.o(.data .rodata*)
}
eunpagged_data = .;
+ . = ALIGN(0x1000);
+ .unpaged_bss : ALIGN(0x1000)
+ {
+ boot/multiboot.S.o(.bss COMMON)
+ *unpaged_*.o(.bss COMMON)
+ }
+ eunpaged_rodata = .;
/* . = kernel_begin; */
. += kernel_virtual_addr_start;