📄 main.c
字号:
/*文件名: main.c 说明: 内核高级初始化 作者: marsinfan 日期: 2005/12/20*/#include <asm/io.h>#include <asm/system.h>#include <stdarg.h>#include <fairysky/types.h>#include <asm/memory.h>#include <fairysky/defs.h>#include <fairysky/string.h>#include <fairysky/kernel.h>#include <fairysky/unistd.h>#include <asm/segment.h>static inline _syscall0(int, fork)static inline _syscall3(int, write, int, fd, const char *, buf, off_t, count)//static inline _syscall1(int, dup, int,fd)static inline _syscall3(int, open, const char *, file, int, flag, int, mode)static inline _syscall1(int, close, int, fd)extern int vsprintf(char *buf, const char *fmt, va_list args);extern void init_irq(void);extern void init_sched();extern void init();extern int init_hd();//在内核中取消低4M地址映射static inline void cancel_mem_map(){ u32 *page_dir = (u32 *)PAGE_DIR; page_dir[0] = 0; __flush_tlb();}//设置进程0的堆栈static inline void mov_task0_stack(){ //获取一个空页面,映射到虚拟地址0xC0000000 - PAGE_SIZE处 if (0 == put_page(0xC0000000 - PAGE_SIZE)) { printk("-1\n"); } //复制进程0的堆栈到新的堆栈,复制堆栈可以优化 memcpy((void *)(0xC0000000 - PAGE_SIZE), (void *)(0xC00A0000 - PAGE_SIZE), PAGE_SIZE);}void start_kernel(){ cancel_mem_map(); //及早的取消低端的地址映射 init_tty(); pparams = (PARAMS_INFO *)paddr_to_vaddr(PARAMS); /*printk("cusor_x:%d\n", pparams->cusor_x); printk("cusor_y:%d\n", pparams->cusor_y); printk("mem_size:%d\n", pparams->mem_size);// printk("cusor_x:%d\n", pparams->nouse1); printk("display_page:%d\n", pparams->display_page);// printk("cusor_x:%d\n", pparams->nouse2); printk("video_mode:%d\n", pparams->video_mode); printk("window_width:%d\n", pparams->window_width);// printk("cusor_x:%d\n", pparams->nouse3); printk("vidio_mem_size:%d\n", pparams->vidio_mem_size); printk("display_stat:%d\n", pparams->display_stat); printk("vidio_param:%d\n", pparams->vidio_param); printk("hd_cyl:%d\n", *(u16 *)(pparams->BIOS)); printk("hd_head:%d\n", *(u8 *)(pparams->BIOS + 2)); printk("hd_wpcom:%d\n", *(u16 *)(pparams->BIOS + 5)); printk("hd_ctl:%d\n", *(u8 *)(pparams->BIOS + 8)); printk("hd_lzone:%d\n", *(u16 *)(pparams->BIOS + 12)); printk("hd_sect:%d\n", *(u8 *)(pparams->BIOS + 14)); */ //panic(""); init_mem(); init_sched(); init_irq(); //init_hd(); /*trap_init(); chr_dev_init(); blk_dev_init(); mem_init(); buffer_init(); time_init(); hd_init(); floppy_init(); sock_init(); */ mov_task0_stack(); //设置进程0的堆栈 //outb_p(0xF8, PORT_8259M + 1); //outb_p(0xBF, PORT_8259S + 1); // outb_p(inb_p(0x21) & 0xFC, PORT_8259M + 1); outb_p(inb_p(0x21) & 0xFC, PORT_8259M + 1); //outb_p(inb_p(0x21) & 0xFB, PORT_8259M + 1); //outb_p(inb_p(0xA1) & 0xBF, PORT_8259S + 1); sti(); //把进程0返回到特权3下运行,并切换了堆栈的地址 move_to_user_mode(0xC0000000 - (0xC00A0000 - get_esp())); //move_to_user_mode(get_esp() - 0x000A0000); if (fork() == 0) { init(); } else { // } for (;;) ;//进程0什么都不做}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -