华南理工大学《高级操作系统》实验报告

合集下载

高级操作系统实验报告二

高级操作系统实验报告二

目录实验报告 (2)一、模块的编写 (2)1.1代码的编写 (2)1.2Makefile的编写 (2)二、编写测试代码 (3)2.1 代码的编写 (3)2.2 代码的分析 (6)三、测试结果分析 (6)3.1测试结果 (6)3.2创建的进程树 (7)3.3结果分析 (7)四、内核进程调度算法分析 (8)4.1内核进程调度流程 (8)4.2寻找最高优先级进程 (9)4.3进程切换 (10)4.4完成进程切换后 (10)五、内核编译 (11)5.1基本流程 (11)5.2遇到的问题 (11)实验报告一、模块的编写1.1代码的编写示例的代码不太可行,改为如下代码:#include <linux/module.h>#include <linux/init.h>#include <linux/moduleparam.h>int init_module(void)//模块初始化是调用此函数{printk("<0>Hello World!\n");//显示紧急信息,示例中使用<1>不会显示在shell上,会记录在/var/log/message中return 0;}void cleanup_module(void){printk("<0>Goodbye!\n");}1.2Makefile的编写将此代码保存为hellomod.c文件,此文件不可以直接用gcc编译,需要配置一个Makefile文件(Makefile第一个字母必须大写),Makefile文件如下:obj-m := hellomod.oPWD :=$(shell pwd)default:make -C /lib/modules/2.6.18-164.el5xen/build SUBDIRS=$(PWD) modulesclean:rm -rf *.o .* .cmd *.ko *.mod.c .tmp_versions然后将shell进入当前目录下:[root@localhost hellomod]#make[root@localhost hellomod]#insmod hellomod.koHello World![root@localhost hellomod]#rmmod hellomod.koGoodbye!模块编写成功!二、调度算法测试代码2.1 代码的编写这个测试代码是在老师的测试代码上改动的,老师的测试代码上有基础问题,不太适合我的机器,比如耗时程序时间比较短,无法测试出时间,每次测出的时间都为0,故将其循环和参数改大。

操作系统实验实验报告

操作系统实验实验报告

操作系统实验实验报告一、实验目的操作系统是计算机系统中最为关键的核心软件,它管理着计算机的硬件资源和软件资源,为用户提供了一个方便、高效、稳定的工作环境。

本次操作系统实验的目的在于通过实际操作和实践,深入理解操作系统的基本原理和核心概念,掌握操作系统的基本功能和操作方法,提高对操作系统的认识和应用能力。

二、实验环境本次实验使用的操作系统为 Windows 10 专业版,开发工具为Visual Studio 2019,编程语言为 C 和 C++。

实验硬件环境为一台配备Intel Core i7 处理器、16GB 内存、512GB SSD 硬盘的个人计算机。

三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新的进程,并在完成任务后终止进程。

在实验中,我们使用了 Windows API 函数 CreateProcess 和 TerminateProcess 来完成进程的创建和终止操作。

通过观察进程的创建和终止过程,深入理解了进程的生命周期和状态转换。

2、进程同步与互斥为了实现进程之间的同步与互斥,我们使用了信号量、互斥量等同步对象。

通过编写多线程程序,模拟了多个进程对共享资源的访问,实现了对共享资源的互斥访问和同步操作。

在实验中,我们深刻体会到了进程同步与互斥的重要性,以及不正确的同步操作可能导致的死锁等问题。

(二)内存管理实验1、内存分配与释放使用 Windows API 函数 VirtualAlloc 和 VirtualFree 进行内存的分配和释放操作。

通过实验,了解了内存分配的不同方式(如堆分配、栈分配等)以及内存释放的时机和方法,掌握了内存管理的基本原理和操作技巧。

2、内存分页与分段通过编程模拟内存的分页和分段管理机制,了解了内存分页和分段的基本原理和实现方法。

在实验中,我们实现了简单的内存分页和分段算法,对内存的地址转换和页面置换等过程有了更深入的理解。

(三)文件系统实验1、文件操作使用 Windows API 函数 CreateFile、ReadFile、WriteFile 等进行文件的创建、读取和写入操作。

《高级操作系统》实验指导书

《高级操作系统》实验指导书

《高级操作系统》实验指导书实验环境:VMware, Red Hat Enterprise Linux 5(内核版本2.6.18) 硬件环境:内存2G以上,硬盘空间20G以上一、Linux基本命令shell编程(学时4)实验目的:本实验的目的是熟练掌握Linux系统的使用,熟悉Linux常用命令,掌握Linux shell脚本的编写方法,掌握VI的基本使用技巧,熟练配置samba服务、NFS服务。

实验要求:在进行本实验之前,应熟练课程内容,在上机之前做好实验计划,编写好相应的代码.实验内容:(1)Linux常用命令(2)Linux shell脚本的编写方法,使用Shell脚本计算1-100和;(3)熟悉VI的基本用法(4)配置samba服务、NFS服务三、Linux的进程管理(学时2)实验目的:(1)要求编写多进程程序,熟练掌握fork、exec、wait、等函数的用法,进一步了解Linux多进程编写的步骤。

(2)编写完整的守护进程并掌握调试方法。

实验要求:进程的编写步骤实验内容:(1)有3个进程,其中一个为父进’程,其余2个为该父进程的子进程,其中一个子进程运行”ls -l”指令,另一个子进程在暂停5秒后异常退出,并等待子进程退出信息,待收集到该信息,父进程就返回。

(2)首先建立守护进程,在该守护进程中创建一个子进程,子进程暂停10秒,然后自动退出,并由守护进程收集子进程的退出信息,这些信息都在/var/log/messages中输出,子进程退出后,守护进程循环暂停,间隔为10秒。

四、Linux字符设备驱动程序的编制(学时2)实验目的:通过本实验能够深入理解Linux基本内容,掌握其驱动方法.实验要求:在进行本实验之前,应熟练课程内容,在上机之前做好实验计划,编写好相应的代码,这样才能在2个学时完成实验内容。

实验内容:编写Scull字符启动,完成字符设备驱动!。

操作系统实验报告6

操作系统实验报告6

操作系统实验报告6一、实验目的本次操作系统实验的主要目的是深入了解和掌握操作系统中进程管理、内存管理、文件系统等核心概念和相关技术,通过实际操作和观察,增强对操作系统工作原理的理解,并提高解决实际问题的能力。

二、实验环境本次实验使用的操作系统为 Windows 10,实验工具包括 Visual Studio 2019 等。

三、实验内容(一)进程管理实验1、创建多个进程,并观察它们的运行状态和资源占用情况。

通过编写简单的C++程序,使用Windows API 函数创建多个进程。

在程序中,设置不同的进程优先级和执行时间,观察操作系统如何调度这些进程,以及它们对 CPU 使用率和内存的影响。

2、进程间通信实现了进程间的管道通信和消息传递。

通过创建管道,让两个进程能够相互交换数据。

同时,还使用了 Windows 的消息机制,使进程之间能够发送和接收特定的消息。

(二)内存管理实验1、内存分配与释放使用 C++的动态内存分配函数(如`malloc` 和`free`),在程序运行时动态申请和释放内存。

观察内存使用情况,了解内存碎片的产生和处理。

2、虚拟内存管理研究了 Windows 操作系统的虚拟内存机制,通过查看系统的性能监视器,观察虚拟内存的使用情况,包括页面文件的大小和读写次数。

(三)文件系统实验1、文件操作进行了文件的创建、读取、写入、删除等基本操作。

通过编写程序,对不同类型的文件(如文本文件、二进制文件)进行处理,了解文件系统的工作原理。

2、目录操作实现了目录的创建、删除、遍历等功能。

了解了目录结构在文件系统中的组织方式和管理方法。

四、实验步骤(一)进程管理实验步骤1、打开 Visual Studio 2019,创建一个新的 C++控制台项目。

2、在项目中编写代码,使用`CreateProcess` 函数创建多个进程,并设置它们的优先级和执行时间。

3、编译并运行程序,通过任务管理器观察进程的运行状态和资源占用情况。

华工操作系统实验

华工操作系统实验
int ju = 0; while (1) {
sem_wait(&full); sem_wait(&mutex); int ju = 0; for ( int i = 0; i < N; i++) {
if ((buffer[i] >= 'A' && buffer[i] <= 'Z' ) || (buffer[i] >= 'a' && buffer[i] <= 'z'))
理发师问题的描述 :一个理发店接待室有 n 张椅子 , 工作室有 1 张 椅子 ;没有顾客时 , 理发师睡觉 ; 第一个顾客来到时 ,必须将理发师唤 醒; 顾客来时如果还有空座的话 , 他就坐在一个座位上等待 ;如果顾客 来时没有空座位了 , 他就离开 ,不理发了 ;当理发师处理完所有顾客 , 而又没有新顾客来时 ,他又开始睡觉 。 3. 读者写者问题 教材中对读者写者问题算法均有描述 ,但这个算法在不断地有读者流的情况下 , 写者会被阻塞 。 编写一个写者优先解决读者写者问题的程序 ,其中读者和写者 均是多个进程 , 用信号量作为同步互斥机制 。
.
专业 . 专注
.
..
..
..
1. 生产者消费者问题 ( pro_con.c )
#include <pthread.h> #include <unistd.h> #include <semaphore.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <malloc.h>

高级操作系统实验报告

高级操作系统实验报告

一、实验背景与目的随着计算机技术的飞速发展,操作系统作为计算机系统的核心,其重要性日益凸显。

为了更好地理解操作系统的工作原理和设计思想,我们选择了高级操作系统课程,并完成了以下实验:1. 实验背景本次实验基于Linux操作系统,通过对Linux系统内部结构和操作过程的研究,掌握Linux系统的基本操作、文件系统管理、进程管理、内存管理、设备管理等方面的知识。

2. 实验目的(1)熟悉Linux操作系统的基本操作,包括登录、退出、文件与目录操作等。

(2)掌握Linux系统下的进程管理,包括进程的创建、调度、同步、通信等。

(3)了解Linux系统下的内存管理,包括虚拟内存、页面置换算法等。

(4)学习Linux系统下的设备管理,包括设备驱动程序、I/O调度等。

二、实验内容与步骤1. 实验一:Linux基本操作(1)实验目的:熟悉Linux系统的基本操作。

(2)实验步骤:① 登录Linux系统。

② 使用命令行查看系统信息,如CPU型号、内存大小等。

③ 创建和删除文件与目录。

④ 查看文件内容。

2. 实验二:文件系统管理(1)实验目的:掌握Linux系统下的文件系统管理。

(2)实验步骤:① 使用命令行查看文件系统类型。

② 查看文件系统分区。

③ 使用命令行创建和删除文件系统。

④ 使用命令行挂载和卸载文件系统。

3. 实验三:进程管理(1)实验目的:掌握Linux系统下的进程管理。

(2)实验步骤:① 使用命令行查看系统进程。

② 创建和终止进程。

③ 调整进程优先级。

④ 实现进程同步与互斥。

4. 实验四:内存管理(1)实验目的:了解Linux系统下的内存管理。

(2)实验步骤:① 使用命令行查看内存信息。

② 查看内存分配情况。

③ 实现页面置换算法。

5. 实验五:设备管理(1)实验目的:学习Linux系统下的设备管理。

(2)实验步骤:① 使用命令行查看设备信息。

② 编写简单的设备驱动程序。

③ 实现I/O调度。

三、实验结果与分析1. 实验结果通过本次实验,我们成功完成了以下任务:(1)熟悉了Linux操作系统的基本操作。

高级操作系统实验说明

高级操作系统实验说明

高级操作系统实验说明0FTP本次实验所需全部软件以及实验说明可以从该Ftp获得:ftp://219.219.218.203用户名:globus密码:globus助教联系方式:Email:zzxiong@mhx@1Globus简介请参考丁老师的课件:DOS-CH7-Globus Tutorial.ppt2实验内容概述本次实验的内容是安装Globus并在其上进行简单的应用。

我们在Windows环境下使用虚拟机VMWare进行实验。

VMWare支持多台虚拟机同时工作。

我们要求同学们用VMWare创建两台虚拟机,用这两台虚拟机搭建一个含有两个节点的cluster和Grid系统。

3参考资料✧GT4 Admin Guide Globus Toolkits的管理员手册✧/dvnews/show.aspx?id=1566&cid=50一个简明的安装步骤✧The GT4 Programmer‟s Tutorial 程序员手册++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++以下段落为第一次实验的内容++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++4Globus的安装4.0 起步4.0.1使用VMWare创建虚拟机并安装Linux我们的目标是要获得两台运行Linux系统的虚拟机。

请从ftp上下载debian.rar,解压缩后用VMWare打开。

该压缩包内为安装好Linux的虚拟机。

安装好的linux中有两个账户:root 和globus,它们的密码都是globus。

请自行创建常用的账户。

也可以用VMWare创建新的虚拟机然后从光盘安装Linux。

如果要安装Debian发行版请从ftp上下载debian-40r3-i386-CD-1_080217.iso进行安装。

华科操作系统实验报告

华科操作系统实验报告

华科操作系统实验报告一、实验目的操作系统是计算机系统的核心组成部分,对于理解计算机的工作原理和提高计算机应用能力具有重要意义。

本次华科操作系统实验的主要目的是通过实际操作和实践,深入理解操作系统的基本概念、原理和功能,掌握操作系统的核心技术和应用方法,提高我们的实践能力和问题解决能力。

二、实验环境本次实验使用的操作系统为Windows 10 和Linux(Ubuntu 2004),开发工具包括 Visual Studio Code、GCC 编译器等。

实验硬件环境为个人计算机,配置为英特尔酷睿 i7 处理器、16GB 内存、512GB 固态硬盘。

三、实验内容1、进程管理进程创建与销毁进程调度算法模拟进程同步与互斥2、内存管理内存分配与回收算法实现虚拟内存管理3、文件系统文件操作与管理文件系统的实现与优化4、设备管理设备驱动程序编写设备分配与回收四、实验步骤及结果1、进程管理实验进程创建与销毁首先,使用 C 语言编写程序,通过系统调用创建新的进程。

在程序中,使用 fork()函数创建子进程,并在子进程和父进程中分别输出不同的信息,以验证进程的创建和执行。

实验结果表明,子进程和父进程能够独立运行,并输出相应的信息。

进程调度算法模拟实现了先来先服务(FCFS)、短作业优先(SJF)和时间片轮转(RR)三种进程调度算法。

通过模拟多个进程的到达时间、服务时间和优先级等参数,计算不同调度算法下的平均周转时间和平均等待时间。

实验结果显示,SJF 算法在平均周转时间和平均等待时间方面表现较好,而 RR 算法能够提供较好的响应时间和公平性。

进程同步与互斥使用信号量和互斥锁实现了进程的同步与互斥。

编写了生产者消费者问题的程序,通过信号量控制生产者和消费者对缓冲区的访问,避免了数据竞争和不一致的情况。

实验结果表明,信号量和互斥锁能够有效地实现进程间的同步与互斥,保证程序的正确性。

2、内存管理实验内存分配与回收算法实现实现了首次适应(First Fit)、最佳适应(Best Fit)和最坏适应(Worst Fit)三种内存分配算法。

高级操作系统实验报告课程设计(doc 30页)

高级操作系统实验报告课程设计(doc 30页)
在设计过程中,查询了不少相关资料,不断的发现问题、提出问题、解决问题。在对自己所编写的源程序段的纠错的过程中,使我更好的理解了操作系统中文件系统的理论知识,同时在编程时用到了模块化的设计思想,这种编程方法可以使我们的编程变的更简单,可以使我们的查错与纠错变的更方便。总的来说通过这次的设计的学习使我学到了很多在平时的学习中学不到的很多东西,通过这次课程设计,使我对操作系统和编程产生兴趣,我想我会在这条路上继续前进下去。我相信,只要不断的严格要求自己,注意培养自己的思维能力,就一定会有更大更辉煌的发展和提高。
高级操作系统实验报告课程设计(doc 30页)
高级操作系统实验报告
姓 名:
学 号:
专 业:
任 课 教 师:
2014年01月18
一、课程设计题目和目的1
二、课程设计要求1
三、程序设计思想1
四、文件系统的实现2
1.数据结构设计2
2.程序功能图3
3.实体关系图3
4.数据流图4
5.程序流程图5
(1).建立文件:create(文件名,记录长度)6
int length; //文件长度
intaddr; //物理块号
int state; //0-建立,1-建立
int readptr;
};
通过结构体,将文件名字、文件在磁盘的开始位置、文件长度、文件最大长度、文件类型、创建时间结合在一起。文件类型,本模拟程序使用txt类型。设置一个线性表来存储文件。
文件夹和文件的删除,文件夹下没有打开的文件或文件没有打开才能删除,否则删除失败,删除文件夹时利用了中序历遍来删除子树。
四、文计出如下数据结构:
1typedefstructuof//文件属性
{
char filename[14]; //文件名字

操作系统课程实验报告-实验六文件系统

操作系统课程实验报告-实验六文件系统
if __name__ == '__main__': if len(sys.argv) != 3: Usage() exit(1)
hierarchy, filesCompareOutput = diffDir(sys.argv[1], sys.argv[2])
print('{0}\n 比较文件结构:\n{0}'.format(' '*10)) PrintHierarchy(hierarchy) print() if len(filesCompareOutput) != 0:
subname[1])
# 合并结果
filesCompareOutput += subCompareOutput
sameFileHierarchy.append(('{0}'.format(name),
subFileHierarchy))
elif ( os.path.isfile(subname[0])
华南理工大学 操作系统课程实验报告
实验概述
【实验目的及要求】
加深对 linux 文件系统的理解。 实现一个“difftree”命令,其功能是比较两个目录下的文件结构和文件信 息。当在命令行方式下执行“difftree <dir1> <dir2>”命令时,能够比较目录 dir1 和 目录 dir2 是否具有相同的结构,对相同的部分,进一步比较相同文件名的 文件内容。列出比较的文件系统结构图。 本实验是对单个文件比较的扩展,设计中需要考虑目录操作。
for item in hierarchy: if isinstance(item, tuple): print(' '*level*3 + ' ' + item[0] + '/') PrintHierarchy(item[1], level+1) else: print(' '*level*3 + ' ' + item)

华南理工大学《高级操作系统》实验报告

华南理工大学《高级操作系统》实验报告
在用户空间无法直接调用系统调用来执行内核代码,所以需要通过软中断的方式来实现系统调用。通 过int $0x80指令产生系统软中断,触发异常使得系统切换到内核态执行128号异常处理程序,调用 system_call()函数。但是仅仅陷入内核空间是不够的,还需要通过eax寄存器把相应的系统调用号传递给 内核。在陷人内核之前,用户空间就把相应系统调用所对应的号放入eax中了。这样系统调用处理程序一旦 运行,就可以从eax中得到数据。system_call()函数通过将给定的系统调用号与NR_syscalls做比较来检查 其有效性。如果它大于或者等于NR syscalls,该函数就返回一ENOSYS。否则,就执行相应的系统调用。由 于系统调用表中的表项是以32位(4字节)类型存放的,所以内核需要将给定的系统调用号乘以4,然后用所 得的结果在该表中查询其位置。
asmlinkage int sys_spcSysCall(int callNum){ if(callNum < NR_syscalls && callNum >= 0){ printk("System call --%d has been call %ld time(s). \n",callNum,mycount[callNum]); return callCount[callNum]; } else{ printk("Inviliad system call number.\n"); return -1; } }
课程大作业报告书
题目:高级操作系统与分布式系统大作业
学院
计算机科学与工程
专 业 计算机科学与技术(全英创新班)
学生姓名
黄炜杰
学生学号
201230590051

操作系统实验

操作系统实验

操作系统实验报告(一)Linux基本操作与编程(验证性 2学时)1、实验目(de):1)熟悉Linux操作系统(de)环境和使用.2)了解LINUX系统(de)安装过程.(注:表示可选择)3)掌握Linux环境下(de)命令操作.2、实验内容:(1)完成LINUX系统(de)登录,启动终端.进行下列操作并记录结果(要求:结果以屏幕截图表示).1)运行pwd命令,确定你当前(de)工作目录.2)利用以下命令显示当前工作目录(de)内容: ls –l3)运行以下命令: ls –al4)使用mkdir命令建立一个子目录subdir.5)使用cd命令,将工作目录改到根目录(/)上.6)使用ls-l命令列出/dev(de)内容.7)使用不带参数(de)命令cd改变目录,然后用pwd命令确定你当前(de)工作目录是哪里8)使用命令cd ../..,你将工作目录移到什么地方(2)在LINUX下查看你(de)文件.1)利用cd命令,将工作目录改到你(de)主目录上.2)将工作目录改到你(de)子目录subdir,然后运行命令: date > file1 将当前日期和时间存放到新建文件file1中.3)使用cat命令查看file1文件(de)内容.4)利用man命令显示date命令(de)用法: man date5)将date命令(de)用法附加到文件file1(de)后面:man date >> file16)利用cat命令显示文件file1(de)内容.7)利用ls -l file1命令列出文件file1(de)较详细(de)信息.运行ls -l/bin 命令显示目录(de)内容.8)利用ls -l/bin|more命令行分屏显示/bin目录(de)内容.9)利用cp file1 fa命令生成文件file1(de)副本.然后利用ls -l命令查看工作目录(de)内容.10)用cd命令返回你(de)主目录,输入命令ls –l后,解释屏幕显示(de)第一列内容(de)含义.(3)编写能输出“Hello world”问候语(de)C程序,并在终端中编译、执行.要求记录所使用(de)命令及结果.操作步骤:1)在文本编辑器中,编写C程序如下:include ""main(){ printf("hello"); }2) 在终端中,用gcc命令进行编译,生成可执行文件a.gcc –o a3) 在终端中执行a (de)命令如下:./a(4)编写一个程序:显示信息“Time for Play”,并能在后台运行一段时间(自定义)后,弹出信息提醒用户.要求记录所使用(de)命令及结果.(提示:使用sleep(s)函数)3、实验结果分析:(对上述实验内容中(de)各题结果,进行分析讨论.并回答下列问题)(1)进程包括哪些特征间断性, 失去封闭性, 不可再现性, 动态性, 并发性, 独立性(2)在Linux中,如何设置前、后台命令和程序(de)执行命令后直接加 & ,这个命令就在后台执行;正在运行(de)命令,使用Ctrl+z ,就挂起; jobs命令,可以现实后台,包括挂起(de)命令;使用 bg %作业号就可以把挂起(de)命令在后台执行;使用 fg %作业号就可以把后台命令调到前台(3)你所使用(de)Linux系统(de)内核版本是多少用什么命令查看内核版本目前你所了解(de)各发行版本(de)情况如何Linux version (gcc version (Red Hat (GCC) ) 1 SMP Tue Jan 2911:48:01 EST 2013(4)你对Linux系统有什么认识linux是一款开放性(de)操作系统,也可以说成是开放(de)源代码系统,这些代码可以完全自由(de)修改可以再任何(de)计算机上去运行它,也就是“可移植性”,其次大家都知道,linux是由UNIX(de)概念所开发出来(de),所以它也继承了UNIX(de)稳定和效率(de)特点4、总结:你对本次实验有什么体会或看法.操作系统实验报告(二)文件访问权限设置与输入输出重定向(2学时)一、实验目(de)1、掌握linux(de)文件访问权限设置.2、熟悉输入输出重定向和管道操作.二、实验内容1、启动进入红帽linux系统2、设置文件权限:在用户主目录下创建目录test,进入test目录,用vi 创建文件file1,并输入任意(de)文字内容.用ls -l显示文件信息,注意文件(de)权限和所属用户和组.对文件file1设置权限,使其他用户可以对此文件进行写操作:chmod o+w file1.用ls -l查看设置结果.取消同组用户对此文件(de)读取权限:chmod g-r file1.查看设置结果.用数字形式来为文件file1设置权限,所有者可读、可写、可执行;其他用户和所属组用户只有读和执行(de)权限:chmod 755 file1.设置完成后查看设置结果.3、输入、输出重定向和管道(1) 输出重定向用ls命令显示当前目录中(de)文件列表:ls –l.使用输出重定向,把ls命令在终端上显示(de)当前目录中(de)文件列表重定向到文件list中:ls –l > list.查看文件list中(de)内容,注意在列表中会多出一个文件list,其长度为0. 这说明shell是首先创建了一个空文件,然后再运行ls命令:cat list.再次使用输出重定向,把ls命令在终端上显示(de)当前目录中(de)文件列表重定向到文件list中.这次使用追加符号>>进行重定向:ls –l >> list.查看文件list(de)内容,可以看到用>>进行重定向是把新(de)输出内容附加在文件(de)末尾,注意其中两行list文件(de)信息中文件大小(de)区别:cat list.重复命令ls –l > list.再次查看文件list中(de)内容,和前两次(de)结果相比较,注意list文件大小和创建时间(de)区别.(2) 管道who |grep root命令(de)结果是命令ls –l |wc –l结果是4、退出linux系统操作步骤:在主菜单上选择“注销” ->关闭计算机.三、实验结果与讨论(根据实验结果回答下列问题)1. 文件(de)权限如下:-rw-r—r-- 1 root root 19274 Jul 14 11:00回答:-rw-r—r-- (de)含义是什么答:是LINUX/FTP(de)简易权限表示法:对应于本用户-所在组-其他人(de)权限,每一个用执行(x)-读取(r)-写入(w)如本题若是说自己可以读取写入不可以执行,所在组和其他人只能读取.2、文件(de)所有者添加执行权限(de)命令是答:chmod u+x 、赋予所有用户读和写文件权限(de)命令是四、答:chmod a+w,a+r 个人体会(你对本次实验有什么体会或看法)操作系统实验报告(三)文件和目录管理一、实验目(de)1) 掌握在Linux系统下(de)文件和文件系统(de)概念及命令;2) 掌握Linux系统下(de)目录操作.二、实验内容1. 进入linux终端后,用命令(de)操作结果回答下列问题:1)vi(de)三种工作模式是其中不能进行直接转换(de)是什么模式到什么模式命令模式、文本输入模式、末行模式命令模式不能直接到末行模式2)在vi中退出时,保存并退出(de)操作步骤是Ese:wq3)用vi 创建myfile1文件,并在其中输入任意文字一行,创建myfile2文件,任意输入文字3行.请问执行命令:cat <myfile1 >myfile2 后,myfile2中还有几行内容该命令(de)作用是用命令操作验证你(de)回答.myfile2中还有1行内容该命令(de)作用是替换myfile(de)内容4)请用至少两种不同(de)命令创建一个文本文件(),在其中写入“我是2014级学生,我正在使用Linux系统.”,记录命令及执行结果.1、Vi创建2、5)用___pwd________命令可查看所创建文件(de)绝对路径,写出它(de)绝对路径__/root_________;用___ls -l________命令查看该文件(de)类型及访问权限,其访问权限(数字和字母)分别是多少__-rw- r- - r- - 6 4 4______________.6)若将该文件(de)访问权限修改为:所有者有读写权限;其他用户只读;同组用户可读写,请写出命令,并记录结果.7)查找my开头(de)所有文件,可___find my_________命令,写出命令并记录结果8)在/home下创建子目录user,并在其中创建2个文件,名为file1和file2,file1(de)内容是/root目录(de)详细信息;file2(de)内容任意,最后将这两个文件合并为file3文件,请先写出命令序列,并在终端中验证,记录结果.2. 文件及目录操作,写出操作所使用(de)命令,并记录结果.在终端中完成下列命令操作,并记录结果在root用户主目录下创建一个mydir子目录和一个myfile文件,再在mydir下建立d1和d2两个子目录.查看mydir和myfile(de)默认权限查看当前myfile和mydir(de)权限值是多少将myfile文件分别复制到root 和dd1(de)主目录中将root主目录中(de)myfile改为yourfile通过从键盘产生一个新文件并输入I am a student查找文件是否包含student字符串三、实验结果与分析,回答下列问题:1、能够创建文件(de)命令有哪些vi 和cat>name2、能够查看当前目录(de)绝对路径(de)命令是pwd3、Linux中按用户属性将用户分成哪些类型根据文件(de)访问权限,用户又被分成哪些类型能够查看文件访问权限(de)命令是用户同组其他可读可写可执行 cat f1四、小结(本次实验(de)体会或小结)操作系统实验报告(四)作业调度算法模拟(验证性2学时)1、实验目(de):1)掌握作业调度(de)主要功能及算法.2)通过模拟作业调度算法(de)设计加深对作业管理基本原理(de)理解.3)熟悉Linux环境下应用程序(de)编程方法.2、实验内容:(1)作业调度算法(FCFS)编程模拟:编制一段程序,对所输入(de)若干作业,输入、输出数据样例如下表所示.按FCFS算法模拟调度,观察、记录并分析调度(de)输出结果情况.输入输出样例1:FCFS算法include <>include <>define SIZE 5struct Job_type{char no[2]; o,&job[i].tb,&job[i].tr);printf("输入作业顺序:\n");for(i=0;i<SIZE;i++)printf("\t%s\t%d\t%d\n",job[i].no,job[i].tb,job[i].tr);}void fcfs(){ int i,j,t=0,tw=0,tt=0;for(i=0;i<SIZE-1;i++)for(j=i+1;j<SIZE;j++)if(job[i].tb>job[j].tb){x=job[i];job[i]=job[j];job[j]=x;}printf("FCFS调度结果:\n");printf("开始时间作业号到达时间运行时间完成时间等待时间周转时间\n");for(i=0;i<SIZE;i++){printf(" %d",t);t=t+job[i].tr;tw=t-job[i].tb-job[i].tr; b; o,job[i].tb,job[i].tr,t,tw,tt);}}void main(){load();fcfs();}(2)作业调度算法(SJF)编程模拟:编程实现由短作业优先算法,分别用下面两组输入、输出数据样例进行模拟,观察分析运行结果.输入输出样例2:SJF算法输入输出A 0 4B 0 3C 0 5D 0 2E 0 1A 0 6 10 10B 0 3 6 6C 0 10 15 15D 0 1 3 3E 0 0 1 1include <>include <>define SIZE 5struct Job_type{char no[2]; o,&job[i].tb,&job[i].tr);printf("输入作业顺序:\n");for(i=0;i<SIZE;i++)printf("\t%s\t%d\t%d\n",job[i].no,job[i].tb,job[i].tr);}void sjf()n=i; pl[i].pfn=ERR;}for(i=1;i<total;i++){ pfc[i-1].next=&pfc[i];pfc[i-1].pfn=i-1;}pfc[total-1].next=NULL;pfc[total-1].pfn=total-1;freepf_head=&pfc[0];}void FIFO(int total){ int i,j;pfc_type p,t;initialize(total);busypf_head=busypf_tail=NULL;for(i=0;i<page_len;i++){if(pl[page[i]].pfn==ERR){ diseffect+=1;if(freepf_head==NULL){p=busypf_head->next;pl[busypf_head->pn].pfn=ERR; freepf_head=busypf_head;freepf_head->next=NULL;busypf_head=p;}p=freepf_head->next;freepf_head->next=NULL;freepf_head->pn=page[i];pl[page[i]].pfn=freepf_head->pfn;if(busypf_tail==NULL)busypf_head=busypf_tail=freepf_head; else{ busypf_tail->next=freepf_head;busypf_tail=freepf_head;}freepf_head=p;}}printf("FIFO:%d",diseffect);}main(){ int i; int k;printf(“请输入页(de)引用序列:\n”); for(k=0;k<page_len;k++)scanf("%d",&page[k]);for(i=4;i<=7;i++){printf("%2d page frames ",i);FIFO(i);}参考程序LRU算法,略三、实验结果分析:(对上述实验各题所使用(de)原始数据、调试数据与状态(包括出错)及最终结果进行记录并分析.)随着块数(de)增加,缺页数目也减少,4个实验中3个实验(de)块数增加到了5以后,即使块数再增加,缺页数目也是保持不变.只有实验4,块数增加到7以后,缺页数目又再次减少了四、总结:你对本次实验有什么体会或看法.。

高级操作系统实验报告课程设计

高级操作系统实验报告课程设计

高级操作系统实验报告课程设计介绍本文档是关于高级操作系统实验报告课程设计的详细介绍,包括设计目的、实验内容、实验结果和结论等。

本文档将逐步介绍高级操作系统实验报告课程设计的相关内容,为读者提供全面的了解。

设计目的本实验报告的设计旨在帮助学生更深入地理解高级操作系统的概念和原理,加强对操作系统相关知识的掌握;通过实际操作和编程练习,提高学生的问题解决能力和实践能力;培养学生的团队合作精神和沟通能力。

实验内容本次实验涉及到以下几个方面的内容:1.多线程编程:通过编写多线程程序实现并发控制和资源共享。

2.文件系统设计:设计一个简单的文件系统结构,包括文件目录、文件分配等功能。

3.内存管理:实现内存管理算法,包括分页式内存管理、虚拟内存等。

4.进程调度:设计一个进程调度算法,实现进程的创建、执行、等待和结束等操作。

5.系统性能评估:通过性能测试和评估分析系统实际运行情况。

实验结果在本次实验中,我们根据设计的目的和内容进行了详细的实验操作,取得了如下几个主要的实验结果:1.多线程编程:我们成功地编写了多线程程序,实现了并发控制和资源共享。

2.文件系统设计:我们设计了一个简单的文件系统结构,实现了文件目录和文件分配功能。

3.内存管理:我们实现了分页式内存管理和虚拟内存算法,有效地管理了系统内存资源。

4.进程调度:我们设计了一个高效的进程调度算法,实现了进程的正常运行。

5.系统性能评估:通过性能测试和评估,我们对系统的性能进行了全面的评估和分析,发现了系统存在的问题并提出了改进建议。

结论通过本次高级操作系统实验报告课程设计,我们深入理解了操作系统的相关概念和原理,掌握了多线程编程、文件系统设计、内存管理、进程调度等技术;提高了我们的问题解决能力和实践能力,加强了团队合作精神和沟通能力。

希望通过这次实验报告的设计,能够为更深入地理解和应用高级操作系统知识打下坚实的基础。

以上是关于高级操作系统实验报告课程设计的文档内容,希望对您有所帮助!。

《操作系统》实验报告(2)

《操作系统》实验报告(2)
b.将f02.txt的读权限去掉(修改权限的命令是chmod),___chmod -r f02.txt____;看看还能否用cat打开该文件;不能查看,权限不够
c.将subdir目录的读权限去掉,看看是否能用ls命令看到其中内容?
权限不够
(三)Shell程序设计
1.上机编辑、执行实验内容中的例1~例6过程,写出每个脚本(例1~例5)的功能和执行结果;
然后把t01.txt复制一个新文件t03.txt,catt01.txt>t02.txt;
用cat命令将f01.txt的内容追加到t01.txt的末尾,catf01.txt>> t01.txt;
再用diff命令比较t01.txt,t02.txt和t03.txt,比较t01.txt,t02.txt:diff t01.txt t02.txt,结果是否相同:__相同___;比较t01.txt,t03.txt:diff t01.txt t03.txt,结果是否相同:不相同;比较t02.txt,t03.txt:diff t02.txt t03.txt,结果是否相同:不相同。出现上述结果的原因是:______________________________________________________________________________。
2.修改例5,使脚本中不出现break循环控制语句;
3.编写一个Shell过程完成如下功能:
a.合并两个$1、$2文件为$3,并显示内容。
b.如果缺少$3,那么先报告缺少$3,将合并后的内容输出到totaltext.txt,并显示内容。
c.如果缺少$2、$3那么先报告缺少$2、$3,只显示$1的内容。
b.用ln命令给t03.txt建立一个符号链接t04.txt,ln–st03.txt t04.txt;用cat命令看看t04.txt,___cat t04.txt_____;然后删去t03.txt,___rm t03.txt____;再用cat命令看看t04.txt,___cat t04.txt___;结果是:___t04.txt为空____

操作系统实验报告4

操作系统实验报告4

操作系统实验报告4一、实验目的本次操作系统实验的目的在于深入了解和掌握操作系统中进程管理、内存管理、文件系统等核心概念和相关操作,通过实际的实验操作,增强对操作系统原理的理解和应用能力,提高解决实际问题的能力。

二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C++,开发工具为 Visual Studio 2019。

三、实验内容与步骤(一)进程管理实验1、进程创建与终止使用 C++语言编写程序,创建多个进程,并在进程中执行不同的任务。

通过进程的标识符(PID)来监控进程的创建和终止过程。

2、进程同步与互斥设计一个生产者消费者问题的程序,使用信号量来实现进程之间的同步与互斥。

观察生产者和消费者进程在不同情况下的执行顺序和结果。

(二)内存管理实验1、内存分配与释放编写程序,使用动态内存分配函数(如`malloc` 和`free`)来分配和释放内存。

观察内存的使用情况和内存泄漏的检测。

2、内存页面置换算法实现几种常见的内存页面置换算法,如先进先出(FIFO)算法、最近最少使用(LRU)算法和最佳置换(OPT)算法。

通过模拟不同的页面访问序列,比较不同算法的性能。

(三)文件系统实验1、文件创建与读写使用 C++语言的文件操作函数,创建一个新文件,并向文件中写入数据。

从文件中读取数据,并进行数据的处理和显示。

2、文件目录操作实现对文件目录的创建、删除、遍历等操作。

观察文件目录结构的变化和文件的组织方式。

四、实验结果与分析(一)进程管理实验结果与分析1、进程创建与终止在实验中,成功创建了多个进程,并通过控制台输出观察到了每个进程的 PID 和执行状态。

可以看到,进程的创建和终止是按照程序的逻辑顺序进行的,操作系统能够有效地管理进程的生命周期。

2、进程同步与互斥在生产者消费者问题的实验中,通过信号量的控制,生产者和消费者进程能够正确地实现同步与互斥。

当缓冲区为空时,消费者进程等待;当缓冲区已满时,生产者进程等待。

(完整word版)广工操作系统实验报告

(完整word版)广工操作系统实验报告

操作系统实验报告学生学院____ 计算机学院______ 专业班级_ 计科(8)班学号学生姓名____ _______ 指导教师_____ ____2013年12月29 日目录1 实验一进程调度 (5)2 实验二作业调度 (9)3 实验三可变式分区分配 (18)4 实验四简单文件系统 (26)实验一进程调度一、实验目的编写并调试一个模拟的进程调度程序,采用“短进程优先”调度算法对五个进程进行调度。

以加深对进程的概念及进程调度算法的理解.二、实验内容及要求编写并调试一个模拟的进程调度程序,采用“短进程优先”调度算法对五个进程进行调度。

三、实验设计方案及原理在多道程序系统中,一个作业被提交后必须经过处理机调度后,方能获得处理机执行。

对调度的处理又都可采用不同的调度方式和调度算法。

调度算法是指:根据系统的资源分配策略所规定的资源分配算法。

短进程优先调度算法是指对短进程优先调度的算法,它是从后备队列中选择一个或者若干个进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。

四、重要数据结构或源程序中疑难部分的说明,需附详细注释#include "stdio.h"#include <stdlib.h>#include <conio.h>#define getpch(type) (type*)malloc(sizeof(type))#define NULL0struct pcb{ /* 定义进程控制块PCB */char name[10]; //进程名char state; //状态int super; //优先数int ntime; //需要运行时间int rtime; //运行时间struct pcb* link;}*ready=NULL,*p;typedef struct pcb PCB;int num;sort() /* 建立对进程进行短进程优先排列函数*/{PCB *first, *second;int insert=0;if((ready==NULL)||((p->ntime)<(ready->ntime))) /*需要运行时间最小者,插入队首*/{p->link=ready;ready=p;}else /* 进程比较需要运行时间,插入适当的位置中*/{first=ready;second=first->link;while(second!=NULL){if((p->ntime)<(second->ntime)) /*若插入进程比当前进程需要运行时间小,*/{ /*插入到当前进程前面*/p->link=second;first->link=p;second=NULL;insert=1;}else /* 插入进程需要运行时间最大,则插入到队尾*/{first=first->link;second=second->link;}}if(insert==0) first->link=p;}}void input() /* 建立进程控制块函数*/{int i;//clrscr(); /*清屏*/printf("\n 请输入进程数:");scanf("%d",&num);for(i=0;i<num;i++){printf("\n 进程号No.%d:\n",i);p=getpch(PCB);printf("\n 输入进程名:");scanf("%s",p->name);printf("\n 输入进程需要运行时间:");scanf("%d",&p->ntime);printf("\n");p->rtime=0;p->state='w';p->link=NULL;sort(); /* 调用sort函数*/}}void main() /*主函数*/{int i,len,h=0;char ch;input();ch=getchar();printf("\n调度序列为:");p=ready;for(i=num;i>0;i--){ printf(" %s",p->name);p=p->link;}printf("\n\n 进程已经完成.\n"); ch=getchar();}五、程序运行结果七、结果分析与实验小结结果正确。

操作系统实验报告

操作系统实验报告

操作系统实验报告操作系统是计算机科学中十分重要的一门课程,本次实验是关于操作系统的,通过实验,我们可以更深入地了解操作系统的相关知识和操作。

本篇文章将着重介绍本次操作系统实验的内容和实验过程中的收获。

一、实验内容本次实验内容主要涉及操作系统的进程、线程和进程同步三部分。

具体内容包括:1. 进程的创建和管理2. 线程的创建和管理3. 进程同步的实现在实验过程中,我们将分别使用C语言和Linux操作系统实现上述功能。

二、实验过程1. 进程的创建和管理在这一部分实验中,我们要创建多个进程,实现进程的调度和管理功能。

我们采用了Linux系统下的fork()函数,用于创建子进程。

在程序运行时,首先创建一个父进程,然后使用fork()函数创建四个子进程,每个子进程都有自己的进程号(pid),并在屏幕上输出该进程号以示区分。

为了实现进程的调度功能,我们在代码中加入了sleep()函数,用于将进程挂起一段时间,然后再轮流执行其他进程。

2. 线程的创建和管理在这一部分实验中,我们使用了C语言的POSIX线程库pthread.h,实现多线程的功能。

同样地,我们采用了Linux系统下的fork()函数来创建线程。

在代码运行时,我们创建了两个线程,并在屏幕上输出线程号(tid)以示区分。

为了实现线程的调度和管理功能,我们在代码中加入了pthread_join()函数,用于等待线程的执行完成。

3. 进程同步的实现在这一部分实验中,我们使用了Linux系统下的进程同步工具——信号量(semaphore)。

在代码中,我们使用sem_init()函数创建信号量,使用sem_wait()函数阻塞进程或线程,使用sem_post()函数释放进程或线程。

为了更好地理解信号量的工作原理,我们将代码分为生产者和消费者两部分,其中生产者用于向缓冲区添加数据,消费者则用于删除数据。

在这个过程中,我们需要使用信号量控制生产者和消费者的数量,避免出现生产过多或消费过多的情况。

高级操作系统实验报告

高级操作系统实验报告
return -EFAULT;
if (flag)
printk(KERN_EMERG"flag is true!\_sec: %ld\_usec: %ld\n", _sec, _usec);
}
printk(KERN_EMERG"This is my_syscall!\n");
参数表说明:无
返回值:整型,状态
函数功能描述:初始化内核模块。获取系统调用表地址,并修改插入自己编写的系统调用函数
********************************************************/
static int __init init_addsyscall(void)
系统调用函数功能的实现:
3.
3.1
附上程序源码
要求每个函数都有文件头
/*******************************************************
函数名:
参数表说明:
返回值:
函数功能描述:
********************************************************/
#include<linux/unistd.h>
#include<linux/sched.h>
#include<linux/uaccess.h>
#include<linux/syscalls.h>
#define my_syscall_num 134//占用的原表中的系统调用号
//模块信息说明
MODULE_LICENSE("GPL");

高级操作系统大作业-报告

高级操作系统大作业-报告

实验报告——高考学生管理系统实验内容:利用“c/s”模式实现一个简易的高考学生管理系统,实现客户端和服务器端的通信。

功能目标:1、服务器端和客户端均可以对学生信息的查询、增加、删除。

2、客户端和服务器端可以简单的通信。

客户端可以向服务器端传送查询请求,并将服务器端发送的请求显示给用户。

3、客户端和服务器端均要求用mysql数据库管理数据。

4、客户端和服务器端都要有便于操作的图形界面。

设计原理与方案:1、系统功能2本系统的关键技术主要包括三个部分:用户界面设计、mysql数据库操作、Socked网络编程。

用户界面的设计主要利用Gtk/Gnome来实现(interface.c)。

mysql的主要操作包括:建立相应的数据表,数据库连接、执行查询操作等(app_mysql.c)socked编程实现客户与服务器的通信。

下面的表格展示了两者通信过程。

3、具体实现及代码说明1、总体说明:本系统代码分为客户端和服务端两个包。

用户界面和数据库操作的部分,服务器端与客户端实现基本相同。

下表具体说明了各个源文件的功能。

2、数据库部分数据表设计(create_student.sql)本系统的数据表只有student这一个表,下面是创建该表的部分源代码,这些代码说明了student表的具体信息。

3、用户界面部分用户端与服务端的界面设计基本相同,此处仅列出客户端的若干界面。

登录界面:主界面:添加学生界面远程连接界面:4、Socked编程本系统要实现客户端与服务器端的通信,通过socked即可实现这一功能。

下面是客户端与服务器端的部分代码。

这些代码具体实现了框架设计中客户端与服务器端通信的模式。

A.客户端代码:B、服务器端部分代码:服务端基本设计原理:体会在编程的过程中,主要克服的技术难点是GTK图形界面设计、Socked编程实践、进程控制。

遇到的主要问题以及解决的方法有:1、如何实现服务端可以同时处理本地的相关操作,同时可以响应客户端的服务请求?因为服务端的工作较为复杂,一方面有图形界面的相关进程运行,另一方面要响应客户端的请求。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
时返回-1。
(3) clrSysCall:接受 0 个参数,用于把系统调用次数数组清零。
6. 为三个系统调用增加具体实现
在/usr/src/linux-2.6.18/kernel/sys.c 中实现这三个函数:
asmlinkage int sys_allSysCall(void){ int i=0; printk("Times of system calls\n"); for(;i<NR_syscalls;i++) printk("System call [%d] was called %ld times. \n",i,callCount[i]); return 0; }
在用户空间无法直接调用系统调用来执行内核代码,所以需要通过软中断的方式来实现系统调用。通 过int $0x80指令产生系统软中断,触发异常使得系统切换到内核态执行128号异常处理程序,调用 system_call()函数。但是仅仅陷入内核空间是不够的,还需要通过eax寄存器把相应的系统调用号传递给 内核。在陷人内核之前,用户空间就把相应系统调用所对应的号放入eax中了。这样系统调用处理程序一旦 运行,就可以从eax中得到数据。system_call()函数通过将给定的系统调用号与NR_syscalls做比较来检查 其有效性。如果它大于或者等于NR syscalls,该函数就返回一ENOSYS。否则,就执行相应的系统调用。由 于系统调用表中的表项是以32位(4字节)类型存放的,所以内核需要将给定的系统调用号乘以4,然后用所 得的结果在该表中查询其位置。
实验过程:
内核安装
1. 安装 vmware workstation,并在其上安装 CentOS 5.8。 2. 安装 vmware-tools,设置共享文件夹。并把内核文件 linux-2.6.18.tar.xz 下载至共享文
件夹当中(/mnt/hgfs/sharedFiles)。 3. 登录 root,把内核文件压缩包解压至/usr/src 目录下:
incl callCount(,%eax,4)这条会变代码的含义是:incl 是对后面的地址的内容进行自增 操作,也就是对 callCount(,%eax,4)这个元素的内容+1。其中 eax 是用户空间传递到 eax 寄存器中的系统调用号。,%eax,4 的含义是 eax 寄存器里面的值乘以 4,由于系 统调用表中的表项是以 32 位(4 字节)类型存放的,所以内核需要将给定的系统调用 号乘以 4,所以是对 callCount 第%eax*4 个元素进行增量操作。
4. 为三个新增的系统调用添加系统调用号的宏
在/usr/src/linux-2.6.18/include/asm/unistd.h 中添加三个系统调用的调用号: #define __NR_allSysCall 318 #define __NR_spcSysCall 319 #define __NR_clrSysCall 320 把__NR_syscalls 这个记录系统调用总数的宏增加 3 #define __NR_syscalls 321
syscall(test_allSysCall); return 0; }
测试结果:
所有系统调用的次数都已被列出(这里只显示前几个),函数正常工作。 (2) 测试 spcSysCall(): test_spcSysCall.c
#include<linux/unistd.h> #include<stdlib.h> #include<stdio.h> #include<errno.h> #define test_spcSysCall 319 int main() {
课程大作业报告书
题目:高级操作系统与分布式系统大作业
学院
计算机科学与工程
专 业 计算机科学与技术(全英创新班)
学生姓名
黄炜杰
学生学号
201230590051
联系方式 _15626243309(Tel)/651476895(QQ)_
指导教师
吴一民
课程编号
S0812011
课程学分
2分
起始日期
2016 年 1 月 11 日
【实验环境】 操作系统: Centos-5.8-i386(内核版本 2.6.18-308) 编译的内核: 2.6.18 虚拟机: VMware Workstation 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是一张由指向实 现各种系统调用的内核函数的函数指针组成的表。
5. 在头文件中声明三个系统调用
在/usr/src/linux-2.6.18/include/linux/syscalls.h 的尾部添加: asmlinkage int sys_allSysCall(void); asmlinkage int sys_spcSysCall(int sys_callNum); asmlinkage int sys_clrSysCall(void);
Linux系统本身并未有记录系统调用次数的数据结构,因此我们需要在内核中定义一个全局数组来记录 每个系统调用被执行的次数。从调用的原理上看,要记录每个系统调用被执行的次数,我们可以在 system_call()参数检查成功后,对相应的系统调用次数做一次增量操作,这样就完成了执行次数记录的工 作。为了能得到该数组信息和对该数组进行操作,我们还需要定义自己的系统调用。我们定义的系统调用 可以相应地在entry.S中的sys_call_table添加,并重新编译内核,使用该函数。
实验概述
【实验目的及要求】 内核版本要求:
Linux-2.6.18 实验任务:
1.修改 system_call(),使内核能够记录每一个系统调用被使用的次数。同时,为了使应用 程序能够查询到这些数据,本实验要求实现两个系统调用,一个供应用程序来查询某个特 定系统调用被使用的次数,另一个系统调用将系统调用计数清零。编制一个用户态程序调 用你所增加的这两个系统调用,统计在一段时间内各系统调用被调用的次数。 2.修改系统的缺页异常处理程序使之能够记录系统缺页次数和当前进程的缺页次数。同样, 本实验也要求实现两个系统调用,一个供应用程序查询缺页次数,另一个系统调用将缺页 计数清零。编制一个用户态程序你所增加的这两个系统调用,统计在一段时间内你的进程 缺页的次数。
2. 修改 system_call(),使其能对每个系统调用进行计数
在/usr/src/linux-2.6.18/arch/i386/kernel/entry.S 的 syscall_call:和 call *sys_call_table (,%eax,4)之间插入语句: vim /usr/src/linux-2.6.18/arch/i386/kernel/entry.S incl callCount(,%eax,4)
8. 编写测试函数
(1) 测试 allSysCall(): test_allSysCall.c
#include<linux/unistd.h> #include<stdlib.h> #include<stdio.h> #include<errno.h> #define test_allSysCall 318 int main() {
asmlinkage int sys_clrSysCall(void){ int i=0; for (;i < NR_syscalls;i++) callCount[i]=0; printk("Times of system call setted to 0.\n"); return 0; }
7. 重新编译内核
int sysNum; scanf("%d",&sysNum); syscall(test_spcSysCall,sysNum); return 0; }
7. 安装内核: make install
8. 内核版本验证: vim /boot/grub/grub.conf 查看内核版本列表,可以看到 2.6.18 内核已安装,修改 default=0, 默认启动新安装的内核。
9. 重启,查看内核版本: uname –a 内核从 2.6.18-308 变为 2.6.18,内核安装成功。
asmlinkage int sys_spcSysCall(int callNum){ if(callNum < NR_syscalls && callNum >= 0){ printk("System call --%d has been call %ld time(s). \n",callNum,mycount[callNum]); return callCount[callNum]; } else{ printk("Inviliad system call number.\n"); return -1; } }
记录系统调用次数
1. 创建一个全局数组记录系统调用次数
相关文档
最新文档