⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 从网上下载的一个自己编写的简单的操作系统源代码,对底层了解很有好处的
💻 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 + -