1670_MIT 6.828 xv6中增加系统调用的实现与分析

文章详细阐述了xv6操作系统中如何通过中断处理机制进行任务调度,特别是系统调用的过程。调用接口的参数来源于x86堆栈模型,在汇编代码中实现。以date命令为例,解释了参数传递、系统调用接口的实现,以及cmostime函数在其中的角色。此外,讨论了Makefile在构建过程中的作用,连接date.c到最终的_date可执行文件,并在文件系统中定位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)

         操作系统的任务调度切换,在xv6中其实是基于中断的方式来进行触发的。

         在ttap处理的部分,调用了一个trap处理的C语言接口。

         也就是上面的接口。那么,这个接口运行所需要的参数是从什么地方来的呢?这个其实是一个之前已经熟悉过的一个小技巧了,那就是x86中在C语言调用的时候堆栈的处理模型。这个在之前的学习笔记中是已经整理过了的。

         而这部分具体的操作其实是在汇编代码中实现的。

         而关于系统调用的处理,其实是只是上面的一个分支。而下面的分支,则是处理中断以及其他的trap信息的。这个大概的模型,其实在我最近几年接触到的嵌入式单片机设计中也是类似的。

         上面的系统调用部分中,syscall()接口的调用是触发我们系统中C语言实现的调用接口的地方。

         而这个接口的实现,其实更加简单了,只是一个查表。

         而这个查表处理的表格则是我们系统设计中提供给系统的可以执行的系统调用的具体实现。

         以这一次HW中要求实现的date命令交互为例,上面是一个具体的实现接口。实现其实有一个比较简单的框架模板,在里面实现我们需要做的功能。

         系统调用可能会有一些参数的传递,这些传递其实是在进程的堆栈空间中存储着。上面的argptr()接口其实就是为了实现这样的功能。

         上面的接口的实现,主要是做了一个数据过滤,真正的获取动作来自于argint()接口。

         而argint()的实现中其实可以看到,这个应该跟进程的堆栈空间产生了关联。Esp其实是堆栈的栈底,这里通过这个信息找到参数的存放位置。具体的机理之前已经整理过,这里不去做更深的分析了。

         有了这个地址信息之后,获取对应的参数数值其实是很简单的一个操作了。这里经过了层层传递,层层抽象,从最接近用户的层级追踪到最底层就是这样的一个效果。

         分析了上面的过程,再回到这里的系统调用实现。其实很容易知道这里获取参数的一个用途了。有了这样的参数信息的获取之后,我们的OS内核就可以跟用户级的软件信息产生交互了。而这里,cmostime()接口的功能其实是为用户级的参数接口进行信息的“装填”。

         这里附加一下cmostime()的接口实现,只是看看这个功能的具体的工作。

         由此,用户软件命令中的操作,其实就成了传递r的信息参数,之后由上面的系统实现进行数据更新的过程。获取了更新之后,这里打印了获取到的数据。这个文件的名字是date.c,而这个被编译成了一个名字叫做_date的文件加入到了文件系统中。这也是提示中让我们修改到Makefile中这部分信息的一个原因。

         从这里可以知道,这个date.c的实现是如何进入到xv6中产生对应的作用的。而这个_date的生成以及依赖处理,是make的特殊用法。

         这样,生成的镜像启动后会看到date可执行文件存在于文件系统中。

         而date如何跟SYS_date产生关联呢?其实就在于上面的这个汇编文件了。其实,相当于实现了一个翻译跳转。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值