华南理工 计算机大作业论文,华南理工大学《操作系统》大作业报告.pdf

华南理工大学《操作系统》

大作业报告

题目:高级操作系统与分布式系统大作业

学 院 计算机科学与工程

专 业 计算机科学与技术 (全英创新班)

学生姓名 xxxxxx

学生学号 2012********

联系方式 Tel)/651476895(QQ)_

指导教师 吴一民

课程编号 S0812011

课程学分 2 分

起始日期 2016年1月11 日

实验概述

【实验目的及要求】

内核版本要求:

Linux-2.6.18

实验任务:

1.修改system_call (),使内核能够记录每一个系统调用被使用的次数。同时,为了使应用

程序能够查询到这些数据,本实验要求实现两个系统调用,一个供应用程序来查询某个特

定系统调用被使用的次数,另一个系统调用将系统调用计数清零。编制一个用户态程序调

用你所增加的这两个系统调用,统计在一段时间内各系统调用被调用的次数。

2.修改系统的缺页异常处理程序使之能够记录系统缺页次数和当前进程的缺页次数。同样,

本实验也要求实现两个系统调用,一个供应用程序查询缺页次数,另一个系统调用将缺页

计数清零。编制一个用户态程序你所增加的这两个系统调用,统计在一段时间内你的进程

缺页的次数。

【实验环境】

操作系统:Centos-5.8-i386(内核版本2.6.18-308)

编译的内核: 2.6.18

虚拟机:VMwareWorkstation 12.1.0.2487

【虚拟机账号密码】★★★★

账号:root

密码:aaasss

实验一

实验内容

【实验原理】

linux系统调用是linux在其内核里都有一些内建的函数,这些函数可以用来完成一些系统级别的功能。

这些函数代表了从用户空间到内核空间的一种转换,例如在用户空间调用open函数,则会在内核空间调用

sys_open。Linux中每个系统调用都有相应的系统调用号,这样,通过这个独一无二的号就可以关联系统调

用。当用户空间的进程执行一个系统调用的时候,这个系统调用号就被用来指明到底是要执行哪个系统调

用。进程不会提及系统调用的名称。在这次试验采用的linux-2.6.18内核中共有317个系统调用,他们储存在

sys_call_table的数据结构当中,这个数据结构在此内核中的entry.S中定义。sys_call_table是一张由指向实

现各种系统调用的内核函数的函数指针组成的表。

在用户空间无法直接调用系统调用来执行内核代码,所以需要通过软中断的方式来实现系统调用。通

过int $0x80指令产生系统软中断,触发异常使得系统切换到内核态执行128号异常处理程序,调用

system_call()函数。但是仅仅陷入内核空间是不够的,还需要通过eax寄存器把相应的系统调用号传递给

内核。在陷人内核之前,用户空间就把相应系统调用所对应的号放入eax中了。这样系统调用处理程序一旦

运行,就可以从eax中得到数据。system_call()函数通过将给定的系统调用号与NR_syscalls做比较来检查

其有效性。如果它大于或者等于NR syscalls,该函数就返回一ENOSYS。否则,就执行相应的系统调用。由

于系统调用表中的表项是以32位(4字节)类型存放的,所以内核需要将给定的系统调用号乘以4,然后用所

得的结果在该表中查询其位置。

Linux系统本身并未有记录系统调用次数的数据结构,因此我们需要在内核中定义一个全局数组来记录

每个系统调用被执行的次数。从调用的原理上看,要记录每个系统调用被执行的次数,我们可以在

system_call()参数检查成功后,对相应的系统调用次数做一次增量操作,这样就完成了执行次数记录的工

作。为了能得到该数组信息和对该数组进行操作,我们还需要定义自己的系统调用。我们定义的系统调用

可以相应地在entry.S中的sys_call_table添加,并重新编译内核,使用该函数。

实验过程:

1. 安装vmwareworkstat


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部