type
status
date
slug
summary
tags
category
icon
password
comment_flag
SLUGS
实验内容:
notion image
一脸懵逼地按照PPT搬完所有代码,不知道原理所在,后悔课上没认真听。下面就做做总结,其中错误希望后面能纠正。
EPOS文件下载涉及到的文件:
系统调用的过程大致如下:
notion image

系统调用的用户接口

main.c中调用:

C语言的接口声明

如果实现time,\usrapp\include\syscall.h中声明:

汇编中例程封装

\userapp\lib\syscall-wrapper.S中完成了接口的的汇编语言实现,先将系统调用号放进eax,然后触发软中断0x82,(epos通过中断进入内核态):
如果是实现time,那么实现如下:
在\include\syscall-nr.h中,定义系统调用号:

中断发生

触发0x82中断后,CPU从用户模式切换到内核模式,并完成栈的切换。
notion image
保护中断现场,即压入到内核栈中:
notion image

中断处理

CPU在内核模式下,根据中断号,将控制传给hwintXX(XX为中断号)。 在\kernel\entry.S中实现,
notion image
注:pushal, popal - push/pop EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI
本应是这样,但在epos中,0x82的中断处理被单独实现——
(\epos\kernel\entry.S中):
notion image

系统调用

_int0x82_syscall中,先将内核模式现场压入内核栈,然后调用C语言函数syscall()(系统调用处理程序),并从传入的参数ctx读取系统调用编号ctx->eax,通过系统调用编号找到相应的服务例程:
下面以sys_putchar服务例程为例:
notion image
如果实现sys_time的调用,则如下:
并在\kernel\kernel.h中声明time_t sys_time();,然后在\kernel\machdep.c中实现:
注:服务例程代表用户进程,并不属于中断上下文,而是进程上下文。因此,系统调用运行过程中,能够访问用户进程的很多信息,能够被其它进程抢占,能够休眠。所以进入syscall()前允许中断,出来后又屏蔽中断。

中断返回

当系统调用完毕后,把控制权交回到发起调用的用户进程前,内核会有一次调度,即恢复现场:
notion image
最终运行结果:
notion image
操作系统实验——线程创建与调度ArchLinux配置samba共享文件夹到Windows虚拟机
Loading...