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

📄 main.c

📁 一个用于学习的操作系统
💻 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 + -