Example #1
0
void pg_init() {
//Find end of kernel
    struct multiboot_information* mboot=get_multiboot_info();
    unsigned int i=0;
    unsigned int kernend=(unsigned int)&end;
    for(i=0;i<mboot->mods_count;i++){
        if(mboot->mods_addr[i].mod_end>kernend){
            kernend=mboot->mods_addr[i].mod_end;
        }
    }

//Paging variables
    pg_page_size=0x1000;
    pg_page_bitmap = (unsigned int*)(((kernend + pg_page_size-1)/pg_page_size)*pg_page_size);
    pg_page_bitmap_size = 0;

//Find free pages
    pg_find_pages();
    
//Allocate kernel directory
    pg_kernel_directory = pg_physical_page_alloc();
    pg_init_directory(pg_kernel_directory);

//Map kernel pages
    unsigned int page;
    unsigned range = (unsigned)pg_page_bitmap / pg_page_size + pg_page_bitmap_size;
    for(page = 0; page < range; page++) {
        void* address=(void*)(page*pg_page_size);
        pg_map_page(pg_kernel_directory, address, address, 2);
    }

//Set to the kernel directory
    pg_set_directory(pg_kernel_directory);

}
Example #2
0
int lib_get_sysinfo(void)
{
    int ret;

    /* Get the CPU speed (for delays). */
    lib_sysinfo.cpu_khz = get_cpu_speed();

#if IS_ENABLED(CONFIG_LP_MULTIBOOT)
    /* Get the information from the multiboot tables,
     * if they exist */
    get_multiboot_info(&lib_sysinfo);
#endif

    /* Get information from the coreboot tables,
     * if they exist */

    ret = get_coreboot_info(&lib_sysinfo);

    if (!lib_sysinfo.n_memranges) {
        /* If we can't get a good memory range, use the default. */
        lib_sysinfo.n_memranges = 2;

        lib_sysinfo.memrange[0].base = 0;
        lib_sysinfo.memrange[0].size = 640 * 1024;
        lib_sysinfo.memrange[0].type = CB_MEM_RAM;

        lib_sysinfo.memrange[1].base = 1024 * 1024;
        lib_sysinfo.memrange[1].size = 31 * 1024 * 1024;
        lib_sysinfo.memrange[1].type = CB_MEM_RAM;
    }

    return ret;
}
Example #3
0
void kmain(struct multiboot_info *mbt)
{
    vga_init();

    gdt_install();
    idt_install();
    isr_install();
    irq_install();
    syscalls_install();

    puts_c(__kernel_name " kernel v" __kernel_version_str "\n\n", COLOR_LIGHT_BLUE, COLOR_DEFAULT_BG);

    uint64_t mem;
    get_multiboot_info(mbt, &mem);

    extern uint32_t _kernel_memory_end[];
    kprintf("End of kernel's memory: 0x%x\n", (uint64_t) (uint32_t) _kernel_memory_end);
    kprintf("Memory:\n%l B\n%l KB\n%l MB\n%l GB\n", mem, mem / 1024, mem / 1024 / 1024, mem / 1024 / 1024 / 1024);
    
    init_paging();
    map_page(0xFD7FF000, 0x60000, 3);
    int *p = (int *) 0xFD7FF000;
    *p = 12;
    kprintf("*(0x%x) = %i\n", (uint64_t) (uint32_t) p, *p);

    map_page(0x10000000, 0x60000, 3);
    int *p2 = (int *) 0x10000000;
    kprintf("*(0x%x) = %i\n", (uint64_t) (uint32_t) p2, *p2);

    print_next_available_page();
    uint32_t ap = allocate_page(203);
    map_page(ap, 0x60000, 3);
    int *p3 = (int *) ap;
    kprintf("*(0x%x) = %i\n", (uint64_t) ap, *p3);

    print_next_available_page();
    ap = allocate_page(203);
    kprintf("ap = 0x%x\n", (uint32_t) ap);

    struct kthread thread;
    create_kthread(thread_test, &thread);
    start_kthread(&thread);
    kprintf("Returned from thread.\n");

    _asm_print_test();

    return;
}