1676_MIT 6.828 xv6中的CPU alarm_资料翻译整理

news/2024/12/2 18:43:29/

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

         我觉得看了几个MIT的课程之后让我觉得我的大学四年有点浪费时光,看起来MIT的课程的确是很有饱满度。

         这里,再整理一份课程中的作业要求。

家庭作业:xv6 CPU alarm

         在本练习中,您将向xv6添加一个功能,该功能在进程使用CPU时间时定期提醒进程。这对于那些想限制占用CPU时间的计算绑定进程,或者对于那些想计算但又想采取一些周期性行动的进程来说,可能很有用。更一般地说,您将实现用户级中断/故障处理程序的原始形式;例如,您可以使用类似的方法来处理应用程序中的页面错误。

         您应该添加一个新的alarm(interval, handler)系统调用。如果应用程序调用alarm(n, fn),那么在程序消耗的CPU时间的每n个“滴答”之后,内核将导致调用应用程序函数fn。当fn返回时,应用程序将从停止的位置恢复。在xv6中,tick是一个相当任意的时间单位,由硬件计时器生成中断的频率决定。

         您应该将以下示例程序放在alarmtest.c中:

         该程序调用alarm(10,periodic),要求内核每隔10次强制调用periodic(),然后挂起一段时间。在内核中实现alarm()系统调用后,alarmtest应该会产生如下输出:

         (如果您只看到一个“alarm!”,请尝试将alarmtest.c中的迭代次数增加10倍。)

         提示:您需要修改Makefile,以便将alarmtest.c编译为xv6用户程序。

         提示:要放入user.h的正确声明是:

         提示:您还必须更新syscall.h和usys.S,以允许alarmtest调用报警系统调用。

         提示:您的sys_alarm()应该将报警间隔和指向处理程序函数的指针存储在proc结构中的新字段中;见proc.h。

         提示:这里有一个可用的sys_alarm():

         将其添加到syscall.c中,并将SYS_ALARM的条目添加到该文件中的syscalls数组中。

         提示:您需要跟踪从上一次调用(或直到下一次调用)到进程的alarm处理程序已经传递了多少节拍;为此,您还需要在struct proc中添加一个新字段。您可以在proc.c中的allocproc()中初始化proc字段。

         提示:每一次滴答声,硬件时钟都会强制中断,在trap()中按T_IRQ0+IRQ_TIMER处理;你应该在这里添加一些代码。

         提示:只有当有进程在运行并且计时器中断来自用户空间时,才需要操作进程的alarm信号;你想要这样的东西

         提示:在您的IRQ_TIMER代码中,当进程的alarm间隔到期时,您希望让它执行其处理程序。你是怎么做到的?

         提示:你需要安排一些事情,这样当处理程序返回时,进程就会恢复执行它停止的地方。你怎么能做到这一点?

         提示:您可以在alarmtest.asm中看到alarmtest程序的汇编代码。

         提示:如果你告诉qemu只使用一个CPU,你可以通过运行

         如果您的解决方案在调用处理程序时不保存调用方保存的用户寄存器,那就没问题了。

         可选的挑战:1)保存和恢复调用方保存的用户注册到处理程序的调用。2) 防止对处理程序的重入调用——如果处理程序尚未返回,请不要再调用它。3) 假设你的代码没有检查tf->esp是否有效,那么就对内核进行安全攻击,利用你的alarm处理程序调用代码。

         小结:这就是这一次的作业要求,这里面新引入了一个叫做alarm的概念。而这个概念其实在我现在使用的RTOS中也是有的,至于这个Alarm在底层的实现机制是什么样子的,之前的确是没有研究过。借着这个机会,需要对此进行一个更加透彻的学习分析。


http://www.ppmy.cn/news/45100.html

相关文章

js中遍历对象数组并获取对象相应的属性值

JavaScript中遍历对象数组的方法有很多种。以下是常见的四种常见的方法:for​循环,for...of​循环,forEach​方法和map​方法,在遍历的同时,通过访问对象的属性来获取相应的值。 ​for​循环: const objArr…

my ttl clock

文章目录 my ttl clock概述实现补充补充END my ttl clock 概述 最近想检测一下自己的睡眠质量. 想做个闹钟, 从22:00~03:00, 每隔5分钟报时. 将小时:分钟念出来就行. 这样, 我入静之后, 听到的最后时间, 就是我入睡的时间. 看到网上同学写好一个ttl类, 改了一下. 加了检测声…

windows无盘启动技术开发之UEFI(新一代BIOS)引导程序开发之二

by fanxiushu 2023-04-14/18 转载或引用请注明原始作者。 接上文。 上文提到了至少有两种办法制作UEFI的虚拟磁盘驱动。 本文只接收利用BlockIO的方式来构造一个临时用的虚拟磁盘。 之所以说是临时使用,是因为在作为引导程序中,一旦进入到 \EFI\boot\boo…

双榜加冕!加速科技荣登2023准独角兽中国未来独角兽双榜单

4月10日至11日,由杭州市人民政府、民建浙江省委会、中国投资发展促进会主办的第7届万物生长大会在杭州国际博览中心隆重举行。会上,中国投资发展促进会创投专委会、杭州市创业投资协会联合微链共同发布2023杭州市独角兽(准独角兽)…

【架构设计】如何设计一个几十万在线用户弹幕系统

文章目录 一、前言二、项目介绍客户端轮询WebSocket主动推送 三、弹幕初始架构四、弹幕架构演进五、弹幕存储六、弹幕查询七、总结 一、前言 现在无论是直播还是电视剧,我们都可以看到上面慢慢的弹幕,满足十几万用户在线的弹幕系统,我们该如…

装饰模式的C++实现——设计模式学习(1)

编程目的:理解装饰模式及其用法。 装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。[DP] 装饰模式是一种结构型设计模式,它允许在运行时动态地给对…

【实用】解决.gitignore文件不生效

文章目录 背景原因解决方法 背景 针对:.gitignore文件不生效,哪怕是将某个目录、文件加入到忽略规则里 原因 .gitignore只能忽略那些原来没有被追踪的文件如果某些文件已经被纳入了版本管理中,那么修改.gitignore是无效的。 解决方法 先把本…

python实现将给定列表划分为元素和大致相等的两个子列表

假设现有列表[300,150,75,38,19,9,5,2],我想把它划分为两个子列表,并要求两个列表的元素和大致相等,应该如何做? 这是一个很有意思的问题,我们期待的答案应该是: list1: [300] list2: [150,75,38,19,9,5,…