开发者学堂课程【高校精品课-西安电子科技大学-操作系统课程设计:Alarm-Clock 实验过程】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/74/detail/15857
Alarm-Clock 实验过程
实操演示
操作系统课程设计实现 alarm-clock 实验。
在阿里云的平台的实验环境在 home 目录下,进入实验环境,打开 src 文件夹之后,可以看到 pintos 系统下包含了以下的文件夹和文件。本节课需要着重关注的是 threads 和 devices 这两个文件夹。所需要修改的内容都在这两个文件夹中。
root@izuf698je0a4rvsgpz2d2xZ:/home# pwd
/home
root@izuf698je0a4rvsgpz2d2xZ:/home# ls
Xd
root@izuf698je0a4rvsgpz2d2xZ:/home# cd xd
root@izuf698je0a4rvsgpz2d2xZ:/home/xd# ls
Os
root@izuf698je0a4rvsgpz2d2xZ:/hame/xd# cd os/
root@izuf698je0a4rvsgpz2d2xZ: /hone/xd/os# ls
bochs-2.6.7 bochs-2.6.7.tar.gz pintos pintos.tar.gz
root@izuf698je0a4rvsgpz2d2xZ:home/xd/os# cd pintos
root@izuf698je0a4rvsgpz2d2xZ:/home/xd/os/pintos ls
src
root@lzuf698je0a4rvsgpzzd2xZ:/home/xd/os/pintos cd sre/
root@lzuf698je0a4rvsgpzzd2xZ:/home/xd/os/pintos/src# ls
Devices lib makefile makefile.userprog threads vm
Examples license makefile.build misc userprog
Filesys make.config makefile.kernel tests untils
root@lzuf698je0a4rvsgpzzd2xZ: /home/xd/os/pintos/src# cd
首先进入 threads 可以看文件夹下的一些文件,包括上节提到的threads.c、threads.h。这里先打开 threads.h 查看
root@lzuf698je0a4rvsgpzzd2xZ:/home/xd/os/pintos/src/threads# geany thread.h
这里使用的编辑器为 journey,如果有其他的编辑器也是可以的。打开之后,可以通过左侧边栏,找到 thread 结构体。
然后在大约九十五行的位置,加入定义线程阻塞的时间,然后在后面写上注释(int block_ticks;/*block_time*/)。在结构体修改后,来修改 timer_sleep 文件,timer_sleep 函数位于 devices 目录下的timer.c中找到 timer_sleep 函数,对其原始的代码进行重新的定义。对 timer_sleep 函数重新定义之后,检查一遍代码,如果没有错误就退出界面。
{
If ticks > 0){
Enum intr lever old level
Struct thread *t;
T = threads current();
T ->block ticks = ticks
Old level = intr disable
Threads block();
Intr set level (old level)
}
接下来回到 thread.h 文件夹中来定义阻塞检测。
root@lzuf698je0a4rvsgpzzd2xZ:/home/xd/os/pintos/src/threads# geany thread.h
第一步需要编辑定义 block check 的函数,定义在线程的图文件当中,这里可以拉到最下方。
Void block check(struct thread *t,void *aux UNUSED);
定义完后进行检查,然后保存退出。
在图文件中声明了 block check 之后,然后还要去 thread.c 中对 block check 的函数进行新的定义。可以在文件的末尾来对其进行定义。
Void block check(struct thread *t ,void *aux UNUSED)
{
If(t->status == THREAD_BLOCKED && t->block ticks>0)
{
t->block ticks --;
If(t->block ticks ==0 )
{
Thread unblock(t);
}
检查过后保存退出,需要对定义的 block check 函数进行调用,需要在 timer.c 文件中修改,在大约一百八十五行的位置。
Ticks++;
Enum intr level old level;
这是定义的这行代码,其含义是记录原来的终段状态。
Old level =intr disable();
这段代码含义为 thread 函数要求关中段。
Thread foreacj(block check ,NULL)
Intr set level (old level);
检查目录后保存退出,在经过这几个步骤的修改后,来到 threads 目录下,对实验成果进行检测。
具体检测命令是 Make check,然后可以在终端看到一共有七项配置通过,本次实验结束。