IGNORANT

操作系统实验——创建系统调用

实验内容:

一脸懵逼地按照PPT搬完所有代码,不知道原理所在,后悔课上没认真听。下面就做做总结,其中错误希望后面能纠正。

EPOS文件下载
涉及到的文件:

epos:.
|   Makefile
|
+---include
|       syscall-nr.h
|
+---kernel
|       kernel.h
|       machdep.c
|
\---userapp
    |   main.c
    |
    +---include
    |       syscall.h
    |
    \---lib
            syscall-wrapper.S

系统调用的过程大致如下:

系统调用的用户接口

main.c中调用:

void main(void *pv)
{
    ……
    // System call test
    time_t now;
    printf("When arg is NULL, return value is:\t%d\n",time(NULL));
    printf("When arg is time_t type pointer,\nPointer value is:\t%d\nReturn value is:\t%d\n",now,time(&now));
    ……
}

C语言的接口声明

如果实现time,usrappincludesyscall.h中声明:

time_t time(time_t *loc);

汇编中例程封装

userapplibsyscall-wrapper.S中完成了接口的的汇编语言实现,先将系统调用号放进eax,然后触发软中断0x82,(epos通过中断进入内核态):

#define WRAPPER(name) \
  .globl _ ## name; \
_ ## name: \
    movl $SYSCALL_ ## name, %eax; \
    int $0x82; \
    ret

如果是实现time,那么实现如下:

.globl _time;
_time:
    movl $SYSCALL_time, %eax
    int $0x82
    ret

在includesyscall-nr.h中,定义系统调用号:

#define SYSCALL_time        1636

中断发生

触发0x82中断后,CPU从用户模式切换到内核模式,并完成栈的切换。

保护中断现场,即压入到内核栈中:

中断处理

CPU在内核模式下,根据中断号,将控制传给hwintXX(XX为中断号)。
在kernelentry.S中实现,

注:pushal, popal - push/pop EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI

本应是这样,但在epos中,0x82的中断处理被单独实现——_int0x82_syscall(eposkernelentry.S中):

系统调用

_int0x82_syscall中,先将内核模式现场压入内核栈,然后调用C语言函数syscall()(系统调用处理程序),并从传入的参数ctx读取系统调用编号ctx->eax,通过系统调用编号找到相应的服务例程:

下面以sys_putchar服务例程为例:

如果实现sys_time的调用,则如下:

case SYSCALL_time:
    {
        time_t *loc=*(time_t**)(ctx->esp+4); 
        ctx->eax=sys_time(); 
        if(loc!=NULL)
            *loc=ctx->eax;
        else
            printk("Parameter is null!\n\n");
    }
    break;

并在kernelkernel.h中声明time_t sys_time();,然后在kernelmachdep.c中实现:

time_t sys_time(){
    printk("System Call was caused! Well done!\n");
    return g_startup_time+g_timer_ticks/HZ;
}

注:服务例程代表用户进程,并不属于中断上下文,而是进程上下文。因此,系统调用运行过程中,能够访问用户进程的很多信息,能够被其它进程抢占,能够休眠。所以进入syscall()前允许中断,出来后又屏蔽中断。

中断返回

当系统调用完毕后,把控制权交回到发起调用的用户进程前,内核会有一次调度,即恢复现场:

最终运行结果:

参考:
http://www.docin.com/p-1423493788.html
https://www.cnblogs.com/yfceshi/p/6885322.html
https://wenku.baidu.com/view/dd6fbf9c360cba1aa811da6d.html

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »