void isr_handler(pt_regs *regs) { if (interrupt_handlers[regs->int_no]) { interrupt_handlers[regs->int_no](regs); } else { printk_color(rc_black, rc_blue, "Unhandled interrupt: %d\n", regs->int_no); } }
int kern_entry() { init_debug(); console_clear(); printk_color(rc_black, rc_green, "Hello, OS kernel!\n"); //panic("test"); printk("kernel in memory start: 0x%08X\n", kern_start); printk("kernel in memory end: 0x%08X\n", kern_end); printk("kernel in memory used: %d KB\n\n", (kern_end - kern_start) / 1024); show_memory_map(); init_pmm(); printk_color(rc_black, rc_red, "\nThe Count of Physical Memory Page is: %u\n\n", phy_page_count); uint32_t allc_addr = NULL; printk_color(rc_black, rc_light_brown, "Test Physical Memory Alloc :\n"); allc_addr = pmm_alloc_page(); printk_color(rc_black, rc_light_brown, "Alloc Physical Addr: 0x%08X\n", allc_addr); allc_addr = pmm_alloc_page(); printk_color(rc_black, rc_light_brown, "Alloc Physical Addr: 0x%08X\n", allc_addr); allc_addr = pmm_alloc_page(); printk_color(rc_black, rc_light_brown, "Alloc Physical Addr: 0x%08X\n", allc_addr); allc_addr = pmm_alloc_page(); printk_color(rc_black, rc_light_brown, "Alloc Physical Addr: 0x%08X\n", allc_addr); return 0; }
// 调用中断处理函数 void isr_handler(pt_regs_t *regs) { if (interrupt_handlers[regs->int_no]) { interrupt_handlers[regs->int_no](regs); } else { printk_color(rc_black, rc_blue, "Unhandled interrupt: %d %s\n", regs->int_no, intrname(regs->int_no)); cpu_hlt(); } }
// 调用中断处理函数 void idt_handler(registers_t *regs) { if (interrupt_handlers[regs->int_no]) { interrupt_handlers[regs->int_no](regs); } else { printk_color(rc_black, rc_blue, "Unhandled interrupt: %d\n", regs->int_no); } #if CHAPTER >= 6 panic("Unhandled interrupt"); #endif }
//调用中断处理函数 void idt_handler(registers_t *regs) { if (interrupt_handlers[regs->int_no]) { interrupt_handlers[regs->int_no](regs); } else { printk_color(rc_black, rc_blue, "Unhandler interrupt: %d\n", regs->int_no); } }
int kern_entry() { init_debug(); console_clear(); printk_color(rc_black, rc_green, "Hello, OS kernel!\n"); panic("test"); return 0; }
void int_handler(struct trap_frame *frame) { interrupt_handler_t handler = interrupt_handlers[frame->int_no]; if (frame->int_no >= 32) { irq_eoi(frame->int_no); } if(handler){ handler(frame); }else{ printk_color(COLOR_BLUE, COLOR_BLACK, "INT: %d NO HANDLER\n", frame->int_no); } }
int main(multiboot_t * mbp) { cpu_state_t *cpu; // first is to save critical info from bootloader // and get symbol tables so we can print back traces mbootp = mbp; init_debug(mbp); // reset text-mode c80_clear(); printk_color(rc_black, rc_red, "\t\t\t\tRed Magic\n"); // init processors init_bootstrap_processor(); cpu = get_boot_processor(); ASSERT(cpu != NULL); // initialize descriptors init_global_descriptor_table(cpu); init_interrupt_descriptor_table(); init_io_apic(); // interrupt on local_irq_enable(); // memory management show_kernel_pos(); show_ARDS_from_multiboot(mbp); init_paging(); init_kheap(); // initialize devices and rootfs init_dev(); //init_root_fs(); // start all APs if (mpinfo.ismp) start_smp(); // start system clock if (!mpinfo.ismp) init_pit_timer(CLOCK_INT_HZ); else init_apic_timer(CLOCK_INT_HZ); // initialize kernel task and scheduling setup_init_task(); init_sched(); // All our initialisation calls will go in here. return 0xDEADBABA; }
int kern_entry() { init_debug(); init_gdt(); init_idt(); console_clear(); printk_color(rc_black, rc_green, "Hello, OS kernel!\n"); init_timer(200); // 开启中断 asm volatile ("sti"); return 0; }
void test_heap() { printk_color(rc_black, rc_magenta, "Test kmalloc() && kfree() now ...\n\n"); void *addr1 = kmalloc(50); printk("kmalloc 50 byte in 0x%X\n", addr1); void *addr2 = kmalloc(500); printk("kmalloc 500 byte in 0x%X\n", addr2); void *addr3 = kmalloc(5000); printk("kmalloc 5000 byte in 0x%X\n", addr3); void *addr4 = kmalloc(50000); printk("kmalloc 50000 byte in 0x%X\n\n", addr4); printk("free mem in 0x%X\n", addr1); kfree(addr1); printk("free mem in 0x%X\n", addr2); kfree(addr2); printk("free mem in 0x%X\n", addr3); kfree(addr3); printk("free mem in 0x%X\n\n", addr4); kfree(addr4); }
void test_heap(){ printk_color(black, light_magenta, "Test kmalloc() && kfree()\n"); void *addr1 = kmalloc(100); printk_color(black, light_cyan, "kmalloc 100 bytes in 0x%x\n", addr1); void *addr2 = kmalloc(10); printk_color(black, light_cyan, "kmalloc 10 bytes in 0x%x\n", addr2); kfree(addr1); printk_color(black, light_cyan, "kfree 100 bytes in 0x%x\n", addr1); void *addr3 = kmalloc(30); printk_color(black, light_cyan, "kmalloc 30 bytes in 0x%x\n", addr3); printk("\n"); kfree(addr2); printk_color(black, light_cyan, "kfree 10 bytes in 0x%x\n", addr2); kfree(addr3); printk_color(black, light_cyan, "kfree 30 bytes in 0x%x\n", addr3); }