📄 main.c
字号:
/* * ExpOS * * * * * * Copyright 2002.9.15 * * */ #include <arch.h>#include <drv/vga.h>#include "../boot/boot.h"#ifdef __cplusplusextern "C" {#endif//arch.sextern void nop_handler();static void print_memory_map(){ int i; kprintf("Dump mem map \r\n"); struct boot *p = (struct boot *)(0xc0000000 + 0x90000); kprintf("Start End Size Type\r\n"); for (i = 0; i < p->e820nr; i++) { long long size= p->e820.map[i].size; kprintf("%016Lx--", p->e820.map[i].addr); /* Start*/ kprintf("%016Lx ", p->e820.map[i].addr+size);/* End */ /*kprintf("%08Lx ", size);*/ /* Size */ if(size>0x100000) /* size */ kprintf("%04dM ",size>>20); else kprintf("%04dk ",size>>10); switch (p->e820.map[i].type) { /*type*/ case E820_RAM: kprintf("RAM "); break; case E820_RESERVED: kprintf("Res "); break; case E820_ACPI: kprintf("ACPI Data"); break; case E820_NVS: kprintf("ACPI NVS "); break; default: kprintf("type %lu", p->e820.map[i].type); break; } kprintf("\r\n"); }}void dump_kernel_img(){ extern char _text, _etext,_edata,_bss_start,_end; kprintf("\r\nDump kernel img"); kprintf("\r\n begin end size"); kprintf("\r\n.text %08x--%08x %08xk", &_text, &_etext,(&_etext-&_text)>>10) ; kprintf("\r\n.data %08x--%08x %08xk", &_etext, &_edata,(&_edata-&_etext)>>10) ; kprintf("\r\n.bss %08x--%08x %08xk", &_bss_start, &_end,(&_end-&_bss_start)>>10) ; }/* PAGE_SHIFT determines the page size */#define PAGE_SHIFT 12#define PAGE_SIZE (1UL << PAGE_SHIFT)#define PAGE_MASK (~(PAGE_SIZE-1))int main(){ int i=0; _lidt(); console_init(); rawvga_init(); for(i=0; i<256; i++){ //都填充为默认中断/异常处理函数 _gate_fill(i, (unsigned int)nop_handler, IGA_K); } //设置中断门 0x20---0x2F , // int -->gate(0x20--0x2f) ---> arch.s(int handler) -->irq_table-->irq handler _fill_int_gate(); _init_8259(); //irq 0-7 --> Gate 20h-27h , irq 8-15 --->Gate 28h-2fh /* Intel 保留0-31 的中断门, 硬件irq从0x20开始*/ //_gate_fill(0x20, (unsigned int)_timer, IGA_K); //install timer //_gate_fill(0x20, (unsigned int)_hw_gate00, IGA_K); //install timer for(i =0; i<16; i++){ _irq_reg(i,(irq_act)nop_irq); } _irq_reg(0, (irq_act)timer); _enirq_8259(0); //enable timer irq 0 __asm__("sti"); /* dump mem map*/ print_memory_map(); dump_kernel_img(); kprintf("\r\nCopyright "__DATE__"."); kprintf("\r\nImage Build Time:"__TIME__"."); /* 轮询模式的键盘驱动演示 */ kprintf("\r\nDemo poll mode keyboard driver."); kbd_main(); /* VGA graph */ extern void vga_init(void); vga_init(); video_logo(); /* Setup kbd irq Handler */ __asm__("cli"); //_gate_fill(0x21, (unsigned int)_kbd, IGA_K); //install kbd _irq_reg(1, (irq_act)kbd); _enirq_8259(1); //enable kbd irq 1 __asm__("sti"); kprintf("\r\n系统空闲 \r\n"); while(1){ //live(); //re enter, bug? } }/* * Test Gcc feature */ __asm__( "_interrupt:\n\t" "pushl -256\n\t" "jmp 1f \n\t 1:");#ifdef __cplusplus } /*end extern "c"*/#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -