main.c

来自「一个用于学习的操作系统」· C语言 代码 · 共 131 行

C
131
字号
/*文件名: 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 + =
减小字号Ctrl + -
显示快捷键?