示例#1
0
文件: pmm.c 项目: Oscer2016/ParalleX
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);
}
示例#2
0
文件: pmm.c 项目: Oscer2016/ParalleX
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");*/
}
示例#3
0
文件: idt.c 项目: shui8023/shui_os
//初始化中断描述符表
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);
}