Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1885250
  • 博文数量: 333
  • 博客积分: 10791
  • 博客等级: 上将
  • 技术积分: 4314
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 07:39
文章分类

全部博文(333)

文章存档

2015年(1)

2011年(116)

2010年(187)

2009年(25)

2008年(3)

2007年(1)

分类:

2009-04-17 23:34:11

一、处理缺页中断,其向量为14(T_PGFLT)trap_dispatch()函数将缺页中断分派给page_fault_handler()函数,让page_fault_handler()函数处理缺页中断。其代码如下:

    //dispatch page fault exceptions

    if(tf->tf_trapno == T_PGFLT){

        page_fault_handler(tf);

        return;

        }

二、断点,其向量为3 (T_BRKPT)JOS将这个异常分派给内核的monitor()函数,monitor()函数被用作基本的调试函数。其代码如下:

    //breakpoint exceptions invoke the kernel monitor

    if(tf->tf_trapno == T_BRKPT){

        monitor(tf);

        return;

        }

三、系统调用,

1、关于系统调用有以下几点说明:

                 1)、系统调用通过软件中断实现

             int 0x30

        2)、设置idt

             需要在idt中进行相应的设置

3)、参数传递:

             传递系统调用号:EAX 5个参数:EDX, ECX, EBX, EDI, ESI

             返回值:EAX

2、系统调用流程:内核中通过trapdispatch根据trapno进行分发 kern/syscall.c/syscall()是实现系统调用指定功能的函数。

3、实现syscall()函数:根据系统调用号完成分发到正确的内核函数。系统调用号在inc/syscall.h中定义。代码如下:

switch(syscallno){

        case SYS_cputs:

            ……

        default:

                panic("shouldn't go here\n");

                return -E_INVAL;

        }

    }

四、启动用户态,在lib/entry.S的开始运行一个用户程序,然后进行一些设置,调用lib/libmain.clibmain()函数。

libmain()完成以下工作:1)、使env指向给定的环境;2)、保存程序名,以便panic()函数能够使用;3)、调用用户的main()函数;4)、执行完毕返回。

    由于目前还没有文件系统,所以用户的程序只能通过ENV_CREATE()函数进行调用。在JOS中编写了hello.cbuggyhello.c等文件并编译成二进制文件以便init.c调用。

阅读(3780) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~