void pmm_init(void){ //show_kernel_memory_map(); /*展示内核所处物理地址*/ //show_memory_map(); e820map_t e820map; bzer(&e820map,sizeof(e820map_t)); get_ram_info(&e820map); phy_pages_init(&e820map); //printk("phy_pages_count = %d\n",phy_pages_count); page_init(phy_pages,phy_pages_count); }
static void phy_pages_init(e820map_t *e820map) { uint32 phy_mem_length = 0; for (uint32 i = 0; i < e820map->count; ++i){ if (e820map->map[i].addr_low > ZONE_HIGHMEM_ADDR) { break; } if (e820map->map[i].addr_low + e820map->map[i].length_low > ZONE_HIGHMEM_ADDR) { phy_mem_length = ZONE_HIGHMEM_ADDR; break; } phy_mem_length = e820map->map[i].length_low; } uint32 pages_mem_length = sizeof(page_t) * (phy_mem_length / PMM_PAGE_SIZE); bzer(phy_pages, pages_mem_length); // 物理内存页管理起始地址 pmm_addr_start = ((uint32)phy_pages - KERNBASE + pages_mem_length + PMM_PAGE_SIZE) & PMM_PAGE_MASK; printk("the mm_count is %d\n",e820map->count); for (uint32 i = 0; i < e820map->count; ++i){ uint32 start_addr = e820map->map[i].addr_low; uint32 end_addr = e820map->map[i].addr_low + e820map->map[i].length_low; if (start_addr < pmm_addr_start) { start_addr = pmm_addr_start; } if (end_addr > ZONE_HIGHMEM_ADDR) { end_addr = ZONE_HIGHMEM_ADDR; } printk("uint32 start-addr %x end_start %x\n",start_addr,end_addr); for (uint32 addr = start_addr; addr < end_addr; addr += PMM_PAGE_SIZE) { phy_pages_count++; } pmm_addr_end = end_addr; } /*assert(pmm_addr_start == page_to_addr(&phy_pages[0]), "phy_pages_init error pmm_start != &page[0]"); assert(pmm_addr_end - PMM_PAGE_SIZE == page_to_addr(&phy_pages[phy_pages_count-1]), "phy_pages_init error pmm_end != &page[n-1]"); assert(&phy_pages[0] == addr_to_page(page_to_addr(&phy_pages[0])), "phy_pages_init error addr_to_page error"); assert(&phy_pages[1] == addr_to_page(page_to_addr(&phy_pages[1])), "phy_pages_init error addr_to_page error");*/ }
//初始化中断描述符表 void init_idt() { //初始化主片,从片 outb(0x20, 0x11); outb(0xA0, 0x11); outb(0x21, 0x20); outb(0xA1, 0x28); outb(0x21, 0x04); outb(0xA1, 0x02); outb(0x21, 0x01); outb(0xA1, 0x01); outb(0x21, 0x0); outb(0xA1, 0x0); idt_set_gate(32, (uint32)irq0, 0x08, 0x8E); idt_set_gate(33, (uint32)irq1, 0x08, 0x8E); idt_set_gate(34, (uint32)irq2, 0x08, 0x8E); idt_set_gate(35, (uint32)irq3, 0x08, 0x8E); idt_set_gate(36, (uint32)irq4, 0x08, 0x8E); idt_set_gate(37, (uint32)irq5, 0x08, 0x8E); idt_set_gate(38, (uint32)irq6, 0x08, 0x8E); idt_set_gate(39, (uint32)irq7, 0x08, 0x8E); idt_set_gate(40, (uint32)irq8, 0x08, 0x8E); idt_set_gate(41, (uint32)irq9, 0x08, 0x8E); idt_set_gate(42, (uint32)irq10, 0x08, 0x8E); idt_set_gate(43, (uint32)irq11, 0x08, 0x8E); idt_set_gate(44, (uint32)irq12, 0x08, 0x8E); idt_set_gate(45, (uint32)irq13, 0x08, 0x8E); idt_set_gate(46, (uint32)irq14, 0x08, 0x8E); idt_set_gate(47, (uint32)irq15, 0x08, 0x8E); bzer((uint8*)&interrupt_handlers, sizeof(interrupt_handler_t) * 256); idt_ptr.limit = sizeof(idt_entry_t) * 256 - 1; idt_ptr.base = (uint32)&idt_entries; bzer((uint8 *)&idt_entries, sizeof(idt_entry_t) * 256); idt_set_gate( 0, (uint32)isr0, 0x08, 0x8E); idt_set_gate( 1, (uint32)isr1, 0x08, 0x8E); idt_set_gate( 2, (uint32)isr2, 0x08, 0x8E); idt_set_gate( 3, (uint32)isr3, 0x08, 0x8E); idt_set_gate( 4, (uint32)isr4, 0x08, 0x8E); idt_set_gate( 5, (uint32)isr5, 0x08, 0x8E); idt_set_gate( 6, (uint32)isr6, 0x08, 0x8E); idt_set_gate( 7, (uint32)isr7, 0x08, 0x8E); idt_set_gate( 8, (uint32)isr8, 0x08, 0x8E); idt_set_gate( 9, (uint32)isr9, 0x08, 0x8E); idt_set_gate(10, (uint32)isr10, 0x08, 0x8E); idt_set_gate(11, (uint32)isr11, 0x08, 0x8E); idt_set_gate(12, (uint32)isr12, 0x08, 0x8E); idt_set_gate(13, (uint32)isr13, 0x08, 0x8E); idt_set_gate(14, (uint32)isr14, 0x08, 0x8E); idt_set_gate(15, (uint32)isr15, 0x08, 0x8E); idt_set_gate(16, (uint32)isr16, 0x08, 0x8E); idt_set_gate(17, (uint32)isr17, 0x08, 0x8E); idt_set_gate(18, (uint32)isr18, 0x08, 0x8E); idt_set_gate(19, (uint32)isr19, 0x08, 0x8E); idt_set_gate(20, (uint32)isr20, 0x08, 0x8E); idt_set_gate(21, (uint32)isr21, 0x08, 0x8E); idt_set_gate(22, (uint32)isr22, 0x08, 0x8E); idt_set_gate(23, (uint32)isr23, 0x08, 0x8E); idt_set_gate(24, (uint32)isr24, 0x08, 0x8E); idt_set_gate(25, (uint32)isr25, 0x08, 0x8E); idt_set_gate(26, (uint32)isr26, 0x08, 0x8E); idt_set_gate(27, (uint32)isr27, 0x08, 0x8E); idt_set_gate(28, (uint32)isr28, 0x08, 0x8E); idt_set_gate(29, (uint32)isr29, 0x08, 0x8E); idt_set_gate(30, (uint32)isr30, 0x08, 0x8E); idt_set_gate(31, (uint32)isr31, 0x08, 0x8E); //实现系统调用的 idt_set_gate(255, (uint32)isr255, 0x08, 0x8E); //更新设置中断描述符表 idt_flush((uint32)&idt_ptr); }