X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/20097445f742afff2c263431efcb1c8b596076a8..728194869c3dc89b0e1c625480d486ada309ae40:/lunaix-os/kernel/proc0.c diff --git a/lunaix-os/kernel/proc0.c b/lunaix-os/kernel/proc0.c index a2102ae..2b21ac7 100644 --- a/lunaix-os/kernel/proc0.c +++ b/lunaix-os/kernel/proc0.c @@ -1,8 +1,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -23,6 +25,8 @@ init_platform(); void lock_reserved_memory(); +// #define ENABLE_USER_MODE + /** * @brief LunaixOS的零号进程,该进程永远为可执行。 * @@ -35,11 +39,29 @@ void __proc0() { init_platform(); +#ifdef ENABLE_USER_MODE + asm volatile("movw %0, %%ax\n" + "movw %%ax, %%es\n" + "movw %%ax, %%ds\n" + "movw %%ax, %%fs\n" + "movw %%ax, %%gs\n" + "pushl %0\n" + "pushl %1\n" + "pushl %2\n" + "pushl %3\n" + "retf" ::"i"(UDATA_SEG), + "i"(USTACK_TOP & ~0xf), + "i"(UCODE_SEG), + "r"(&&usr)); +#endif +usr: if (!fork()) { asm("jmp _lxinit_main"); } - asm("1: jmp 1b"); + while (1) { + yield(); + } } extern uint8_t __kernel_start; /* link/linker.ld */ @@ -58,7 +80,7 @@ init_platform() // Fuck it, I will no longer bother this little 1MiB // I just release 4 pages for my APIC & IOAPIC remappings for (size_t i = 0; i < 3; i++) { - vmm_unmap_page(KERNEL_PID, (void*)(i << PG_SIZE_BITS)); + vmm_del_mapping(PD_REFERENCED, (void*)(i << PG_SIZE_BITS)); } // 锁定所有系统预留页(内存映射IO,ACPI之类的),并且进行1:1映射 @@ -70,8 +92,10 @@ init_platform() KERNEL_PID, FLOOR(__APIC_BASE_PADDR, PG_SIZE_BITS), 0); pmm_mark_page_occupied(KERNEL_PID, FLOOR(ioapic_addr, PG_SIZE_BITS), 0); - vmm_set_mapping(KERNEL_PID, APIC_BASE_VADDR, __APIC_BASE_PADDR, PG_PREM_RW); - vmm_set_mapping(KERNEL_PID, IOAPIC_BASE_VADDR, ioapic_addr, PG_PREM_RW); + vmm_set_mapping( + PD_REFERENCED, MMIO_APIC, __APIC_BASE_PADDR, PG_PREM_RW, VMAP_NULL); + vmm_set_mapping( + PD_REFERENCED, MMIO_IOAPIC, ioapic_addr, PG_PREM_RW, VMAP_NULL); apic_init(); ioapic_init(); @@ -82,7 +106,7 @@ init_platform() syscall_install(); for (size_t i = 256; i < hhk_init_pg_count; i++) { - vmm_unmap_page(KERNEL_PID, (void*)(i << PG_SIZE_BITS)); + vmm_del_mapping(PD_REFERENCED, (void*)(i << PG_SIZE_BITS)); } } @@ -92,6 +116,7 @@ lock_reserved_memory() multiboot_memory_map_t* mmaps = _k_init_mb_info->mmap_addr; size_t map_size = _k_init_mb_info->mmap_length / sizeof(multiboot_memory_map_t); + // v_mapping mapping; for (unsigned int i = 0; i < map_size; i++) { multiboot_memory_map_t mmap = mmaps[i]; if (mmap.type == MULTIBOOT_MEMORY_AVAILABLE) { @@ -100,10 +125,12 @@ lock_reserved_memory() uint8_t* pa = PG_ALIGN(mmap.addr_low); size_t pg_num = CEIL(mmap.len_low, PG_SIZE_BITS); for (size_t j = 0; j < pg_num; j++) { - vmm_set_mapping(KERNEL_PID, - (pa + (j << PG_SIZE_BITS)), - (pa + (j << PG_SIZE_BITS)), - PG_PREM_R); + uintptr_t _pa = pa + (j << PG_SIZE_BITS); + // if (vmm_lookup(_pa, &mapping) && *mapping.pte) { + // continue; + // } + vmm_set_mapping(PD_REFERENCED, _pa, _pa, PG_PREM_R, VMAP_IGNORE); + pmm_mark_page_occupied(KERNEL_PID, _pa >> 12, 0); } } } \ No newline at end of file