重 庆 大 学
学 生 实 验 报 告
实验课程名称操作系统原理
开课实验室 重庆大学DS1501
学 院 软件工程 年级2013 专业班
学 生 姓 名 学 号
开 课 时 间 2015 至 2016 学年第 一 学期
总 成 绩 教师签名
重庆大学软件 学院制
洪明坚
《操作系统原理》实验报告
开课实验室:DS1501 2016 年1月 5 日 学院 软件学院 课程 名称 教师评语 一、 实验目的(软件需求文档) 编写系统调用“time_t time(time_t *loc)” a) 功能描述 i. 返回从格林尼治时间1970年1月1日午夜起所经过的秒数。如果指针loc非NULL,则返回值也被填到loc所指向的内存位置 b) 数据类型time_t其实就是long i. 二、实验原理(软件设计文档) 1、在machdep.c中,编写系统调用的实现函数“time_t sys_time()”,计算用户需要的秒数。需要用到 变量g_startup_time,它记录了EPOS启动时,距离格林尼治时间1970年1月1日午夜的秒数 变量g_timer_ticks记录了EPOS启动以来定时器中断的总次数 宏定义HZ是定时器每秒钟中断的次数,即定时器中断的频率 2、在kernel.h的后面,加入声明time_t sys_time(); 3、在syscall-nr.h中,定义系统调用的号码 #define SYSCALL_time 2014 4、在machdep.c的函数syscall中,增加“case SYSCALL_time”分支 读取参数的值time_t*loc = *(time_t **)(ctx->esp+4); 调用系统调用的实现函数sys_time ctx->eax=sys_time(); if(loc != NULL) *loc = ctx->eax typedef long time_t; 年 月 日 年级、专业、班 实验项目 名 称 姓名 系统调用 成绩 指导教师 教师签名: 操作系统原理
三、使用仪器、材料(软硬件开发环境) Notepad++ expenv
四、实验步骤(实现的过程) 在下列四个文件内添加系统调用
U1、在epos/app/syscall-wrapper.S末尾,加入汇编语言接口“WRAPPER(time)” U2、在epos/app/syscall.h中,加入C语言接口 “time_t time(time_t *loc);” U3、在epos/app/main.c中调用该系统调用,并打印出结果
? 要测试loc分别为NULL和非NULL两种情况
machdep.c中添加函数
//计算需要的秒数
/*变量g_startup_time,它记录了EPOS启动时,距离格林尼治时间1970年1月1日午夜的秒数 变量g_timer_ticks,记录了EPOS启动以来定时器中断的总次数 宏定义HZ,是定时器每秒钟中断的次数,即定时器中断的频率*/ typedeflongtime_t; time_tsys_time(){ } 以及
//实验一系统调用
//ctx->eax为系统调用的返回值 //ctx->esp为用户栈的栈顶指针
caseSYSCALL_time: { }
time_t*loc=*(time_t**)(ctx->esp+4);//一个参数 ctx->eax=sys_time(); if(loc!=NULL)
*loc=ctx->eax;//统计的秒数存到loc所指内存中 break;
returng_startup_time+g_timer_ticks/HZ;
主函数调用: time_t*ptime=NULL; printf(\); printf(\,time(ptime)); time_tm_time=0; printf(\); printf(\,m_time); printf(\,time(&m_time)); printf(\,m_time); 五、实验结果及分析(实现的效果,包括屏幕截图、系统总体运行情况和测试情况等)