2016西安交通大学操作系统实验报告
操作系统实验实验报告
操作系统实验实验报告一、实验目的操作系统是计算机系统中最为关键的核心软件,它管理着计算机的硬件资源和软件资源,为用户提供了一个方便、高效、稳定的工作环境。
本次操作系统实验的目的在于通过实际操作和实践,深入理解操作系统的基本原理和核心概念,掌握操作系统的基本功能和操作方法,提高对操作系统的认识和应用能力。
二、实验环境本次实验使用的操作系统为 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 等进行文件的创建、读取和写入操作。
操作系统安全实验1实验报告
操作系统安全实验1实验报告一、实验目的本次操作系统安全实验的主要目的是让我们深入了解操作系统的安全机制,通过实际操作和观察,掌握一些常见的操作系统安全配置和防护方法,提高对操作系统安全的认识和应对能力。
二、实验环境本次实验使用的操作系统为Windows 10 和Linux(Ubuntu 2004),实验设备为个人计算机。
三、实验内容与步骤(一)Windows 10 操作系统安全配置1、账户管理创建新用户账户,并设置不同的权限级别,如管理员、标准用户等。
更改账户密码策略,包括密码长度、复杂性要求、密码有效期等。
启用账户锁定策略,设置锁定阈值和锁定时间,以防止暴力破解密码。
2、防火墙配置打开 Windows 防火墙,并设置入站和出站规则。
允许或阻止特定的应用程序通过防火墙进行网络通信。
3、系统更新与补丁管理检查系统更新,安装最新的 Windows 安全补丁和功能更新。
配置自动更新选项,确保系统能够及时获取并安装更新。
4、恶意软件防护安装并启用 Windows Defender 防病毒软件。
进行全盘扫描,检测和清除可能存在的恶意软件。
(二)Linux(Ubuntu 2004)操作系统安全配置1、用户和组管理创建新用户和组,并设置相应的权限和归属。
修改用户密码策略,如密码强度要求等。
2、文件系统权限管理了解文件和目录的权限设置,如读、写、执行权限。
设置特定文件和目录的权限,限制普通用户的访问。
3、 SSH 服务安全配置安装和配置 SSH 服务。
更改 SSH 服务的默认端口号,增强安全性。
禁止 root 用户通过 SSH 登录。
4、防火墙配置(UFW)启用 UFW 防火墙。
添加允许或拒绝的规则,控制网络访问。
四、实验结果与分析(一)Windows 10 操作系统1、账户管理成功创建了具有不同权限的用户账户,并能够根据需求灵活调整权限设置。
严格的密码策略有效地增加了密码的安全性,减少了被破解的风险。
账户锁定策略在一定程度上能够阻止暴力破解攻击。
《操作系统》课内实验报告
《操作系统》课内实验报告一、实验目的本次《操作系统》课内实验的主要目的是通过实际操作和观察,深入理解操作系统的基本原理和功能,掌握常见操作系统命令的使用,提高对操作系统的实际应用能力和问题解决能力。
二、实验环境本次实验在计算机实验室进行,使用的操作系统为 Windows 10 和Linux(Ubuntu 发行版)。
实验所使用的计算机配置为:Intel Core i5 处理器,8GB 内存,500GB 硬盘。
三、实验内容1、进程管理在 Windows 系统中,通过任务管理器观察进程的状态、优先级、CPU 使用率等信息,并进行进程的结束和优先级调整操作。
在 Linux 系统中,使用命令行工具(如 ps、kill 等)实现相同的功能。
2、内存管理使用 Windows 系统的性能监视器和资源监视器,查看内存的使用情况,包括物理内存、虚拟内存的占用和分配情况。
在 Linux 系统中,通过命令(如 free、vmstat 等)获取类似的内存信息,并分析内存的使用效率。
3、文件系统管理在 Windows 系统中,对文件和文件夹进行创建、复制、移动、删除等操作,了解文件的属性设置和权限管理。
在 Linux 系统中,使用命令(如 mkdir、cp、mv、rm 等)完成相同的任务,并熟悉文件的所有者、所属组和权限设置。
4、设备管理在 Windows 系统中,查看设备管理器中的硬件设备信息,安装和卸载设备驱动程序。
在 Linux 系统中,使用命令(如 lspci、lsusb 等)查看硬件设备,并通过安装内核模块来支持特定设备。
四、实验步骤1、进程管理实验(1)打开 Windows 系统的任务管理器,切换到“进程”选项卡,可以看到当前系统中正在运行的进程列表。
(2)选择一个进程,右键点击可以查看其属性,包括进程 ID、CPU 使用率、内存使用情况等。
(3)通过“结束任务”按钮可以结束指定的进程,但要注意不要随意结束系统关键进程,以免导致系统不稳定。
操作系统实验报告(2)
计算机实验报告(2)操作系统部分一、基本要求和内容1.了解操作系统的基本功能.2.认识WINDOWS桌面的各部分组成,掌握基本的桌面操作.3.掌握各种基本操作对象的操作方法.4.学会使用WINDOWS帮助.5.了解基本的DOS命令和基本的命令行操作方法.6.熟练掌握文件操作方法.7.掌握对图标的操作方法(移动/拖曳/单击/双击/右击等等).8.熟悉资源管理器窗口和”我的电脑”(“计算机”)窗口.9.掌握启动控制面板的方法,了解控制面板的主要功能,掌握使用控制面板对软硬件进行设置的方法。
10.掌握“运行”对话框的使用方法。
11.了解“任务管理器”的简单使用方法。
12.熟悉“画图”“记事本”“计算器”“写字板”等常用应用程序。
13.开始POWERPOINT的基本使用.二、通过上机实验解决下列问题1. CTRL+ALT+DEL 组合键的功能是:打开【任务管理器】窗口2.全角和半角的区别是:半角是一个字符,全角是两个字符3. CTRL+A组合键的功能是:全部选中CTRL+C组合键的功能是:复制CTRL+V组合键的功能是:粘贴CTRL+X组合键的功能是:剪切CTRL+Z组合键的功能是: 撤销ALT+PRINTSCREEN组合键的功能是:复制当前窗口、对话框或其他对象到剪贴板中任务栏隐藏时通过什么组合键可以看到任务栏:Ctrl+Alt+Del进行窗口切换的组合键是:ALT+Tab4.“画图”应用程序默认保存文件类型是:*.png“记事本”应用程序默认保存文件类型是: *.txt.DOC是什么文件类型Word文档.EXE是什么文件类型可执行文件(程序文件)5.鼠标的基本操作方法包括:指向、单击、双击和拖动鼠标指针附近有漏沙钟表示当前的状态是: 沙漏是等待,因为程序先是从硬盘上读取,然后再到内存,芯片在其期间进行运算,再没真正的打开程序时,系统认为它没正真的启动6.资源管理器左下角窗格(即”文件夹”窗口)显示的是:系统中的所有资源以分层树型的结构显示出来7.一般情况下,对文件进行重命名时,不应该修改文件的扩展名,因为: 如果修改了后缀名则会导致文件属性更改,文件无法打开8.文件的属性主要包括哪些:“只读”、“存档”、“隐藏”9.选择多个连续的文件可以采用哪些方法:使用鼠标先选定第一个文件或文件夹,然后按住Shift键,用鼠标单击最后一个文件或文件夹,这样在第一个对象和最后一个对象之间的所有文件或文件夹将全部被选中,包括第一个和最后一个文件或文件夹。
操作系统课程设计试验报告2
四川大学操作系统课程设计报告学院:软件学院专业:软件工程年级:2014级组编号:组成员:张弛提交时间:2016年3月15日指导教师评阅意见:.. . . .指导教师评阅成绩:XXX1:XXX1:XXX1:XXX1:XXX1:实验项目一项目名称:Week02实验目的:熟悉Linux的使用实验时间:2016.3.15人员分工:实验环境:Ubuntu 15.10实验内容:∙Lab1---设置网络地址按以下步骤设置网络地址,并截图说明:○打开终端○输入ifconfig命令查看当前网络设置(截图表示)○使用ping命令确定要设置的IP地址未被占用○用ifconfig命令来设置虚拟机的IP地址命令格式:ifconfig eth0 IP○用ifconfig命令来查看网络状态,确认设置是否成功(截图表示)∙Lab2 --- 修改配置文件按以下步骤,通过修改网络配置文件来配置网络1.打开终端2.输入ifconfig命令查看当前网络状态(截图表示)3.使用ping命令确定要设置的IP地址未被占用4.在图形界面下进入目录/etc/sysconfig/network-scripts5.打开文件ifcfg-eth0,保留以下已有的选项,添加没有的选项,删除或注释文件中多余的选项:(截图表示)DEVICE=eth0IPADDR=192.168.0.110(该为新的IP地址)NETMASK=255.255.255.0GATEWAY=10.255.255.254(可选,该为本网络的网关地址)ONBOOT=yes1.保存配置文件并在终端输入命令 service network restart2.在终端输入命令ifconfig eth0来查看是否操作成功(截图表示)∙Lab3 --- SSH安装和使用按以下步骤来实现SSH在Windows系统上的安装和使用,并截图1.安装SSH2.从桌面启动SSH Secure File Transfer Client3.点击Quick Connect按钮4.在弹出的窗口中,在Hostname中输入虚拟机的IP地址,UserName中输入用户名(一般为root),其他的保持默认,然后点击Connect按钮5.在弹出的窗口中输入虚拟机密码(截图表示)6.连接成功后将主机上的以自己学号命名的word文件拷贝到虚拟机上的/usr/local/目录下(截图表示)7.从桌面启动SSH Secure Shell Client并连接8.连接成功后用cd命令进入目录/usr/local9.输入ls命令查看我们传输的文件是否存在(截图表示)∙Lab4 --- VMwareTools安装和使用按以下方式使用VmwareTools来Windows和虚拟机下的Linux之间的文件传输,并截图1.在虚拟机上点击菜单VM并选择Install Vmware Tools2.用cd命令进入目录/mnt/cdrom3.用ls查看是否有VMwareTools-XXX.tar.gz文件(截图表示)4.拷贝此文件:cp VMareTools-XXX.tar.gz /usr/local5.用cd命令进入目录/usr/local并用ls命令确认VMareTools-XXX.tar.gz已存在(截图表示)6.解压此文件 tar -zxvf VMareTools-XXX.tar.gz7.进入目录cd vmware-tools-distrib8.执行安装 ./vmware-install.pl安装过程中要求做一些配置,只需要敲回车即可,一直到安装完成。
操作系统实验报告1
《操作系统》实验报告实验序号:01 实验项目名称:操作系统环境学号1107xxx 姓名xxx 专业、班级软件工程1103 实验地点计—502 指导教师徐冬时间2013.9.23 实验目的1) 了解和学习Windows系统管理工具及其使用;2) 熟悉Windows系统工具的内容和应用;由此,进一步熟悉Windows操作系统的应用环境。
工具/准备工作在开始本实验之前,请回顾教科书的相关内容。
需要准备一台运行Windows 操作系统的计算机。
实验内容与步骤1. 计算机管理2. 事件查看器3. 性能监视4. 服务5. 数据库 (ODBC)为了帮助用户管理和监视系统,Windows提供了多种系统管理工具,其中最主要的有计算机管理、事件查看器和性能监视等。
如图2所示。
图2 基于虚拟机的操作系统计算环境管理步骤1:登录进入Windows。
步骤2:在“开始”菜单中单击“设置”-“控制面板”命令,双击“管理工具”图标。
在本地计算机“管理工具”组中,有哪些系统管理工具,基本功能是什么:1) Internet 信息服务;管理IIS,Internet 和Intranet站点的WEB服务器。
2) Server Extensions 管理器;Server Extensions管理器。
3)计算机管理;管理磁盘以及使用其他系统工具来管理本地或远程的计算机。
4)性能;显示系统性能图表以及配置数据日志和警报。
5)本地安全策略;查看和修改本地安全策略,如用户权限和审核策略。
6)事件查看器;显示来自于Windows和其他程序的监视与排错消息。
7)组件服务;配置和管理COM+应用程序。
1. 计算机管理使用“计算机管理”可通过一个合并的桌面工具来管理本地或远程计算机,它将几个Windows管理实用程序合并到一个控制台目录树中,使管理员可以轻松地访问特定计算机的管理属性和工具。
步骤3:在“管理工具”窗口中,双击“计算机管理”图标。
“计算机管理”使用的窗口与“Windows资源管理器”相似。
《操作系统》课程实验报告
《操作系统》课程实验报告一、实验目的本次《操作系统》课程实验的主要目的是通过实际操作和观察,深入理解操作系统的工作原理、进程管理、内存管理、文件系统等核心概念,并掌握相关的操作技能和分析方法。
二、实验环境1、操作系统:Windows 10 专业版2、开发工具:Visual Studio Code3、编程语言:C/C++三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新进程,并观察进程的创建过程和资源分配情况。
同时,实现进程的正常终止和异常终止,并分析其对系统的影响。
2、进程同步与互斥使用信号量、互斥锁等机制实现进程之间的同步与互斥。
通过模拟多个进程对共享资源的访问,观察并解决可能出现的竞争条件和死锁问题。
(二)内存管理实验1、内存分配与回收实现不同的内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。
观察在不同的内存请求序列下,内存的分配和回收情况,并分析算法的性能和优缺点。
2、虚拟内存管理研究虚拟内存的工作原理,通过设置页面大小、页表结构等参数,观察页面的换入换出过程,以及对系统性能的影响。
(三)文件系统实验1、文件操作实现文件的创建、打开、读取、写入、关闭等基本操作。
观察文件在磁盘上的存储方式和文件系统的目录结构。
2、文件系统性能优化研究文件系统的缓存机制、磁盘调度算法等,通过对大量文件的读写操作,评估不同优化策略对文件系统性能的提升效果。
四、实验步骤(一)进程管理实验步骤1、进程创建与终止(1)使用 C/C++语言编写程序,调用系统函数创建新进程。
(2)在子进程中执行特定的任务,父进程等待子进程结束,并获取子进程的返回值。
(3)通过设置异常情况,模拟子进程的异常终止,观察父进程的处理方式。
2、进程同步与互斥(1)定义共享资源和相关的信号量或互斥锁。
(2)创建多个进程,模拟对共享资源的并发访问。
(3)在访问共享资源的关键代码段使用同步机制,确保进程之间的正确协作。
(4)观察并分析在不同的并发情况下,系统的运行结果和资源竞争情况。
《操作系统》实验二
《操作系统》实验二一、实验目的本实验旨在加深对操作系统基本概念和原理的理解,通过实际操作,提高对操作系统设计和实现的认知。
通过实验二,我们将重点掌握进程管理、线程调度、内存管理和文件系统的基本原理和实现方法。
二、实验内容1、进程管理a.实现进程创建、撤销、阻塞、唤醒等基本操作。
b.设计一个简单的进程调度算法,如轮转法或优先级调度法。
c.实现进程间的通信机制,如共享内存或消息队列。
2、线程调度a.实现线程的创建、撤销和调度。
b.实现一个简单的线程调度算法,如协同多任务(cooperative multitasking)。
3、内存管理a.设计一个简单的分页内存管理系统。
b.实现内存的分配和回收。
c.实现一个简单的内存保护机制。
4、文件系统a.设计一个简单的文件系统,包括文件的创建、读取、写入和删除。
b.实现文件的存储和检索。
c.实现文件的备份和恢复。
三、实验步骤1、进程管理a.首先,设计一个进程类,包含进程的基本属性(如进程ID、状态、优先级等)和操作方法(如创建、撤销、阻塞、唤醒等)。
b.然后,实现一个进程调度器,根据不同的调度算法对进程进行调度。
可以使用模拟的方法,不需要真实的硬件环境。
c.最后,实现进程间的通信机制,可以通过模拟共享内存或消息队列来实现。
2、线程调度a.首先,设计一个线程类,包含线程的基本属性(如线程ID、状态等)和操作方法(如创建、撤销等)。
b.然后,实现一个线程调度器,根据不同的调度算法对线程进行调度。
同样可以使用模拟的方法。
3、内存管理a.首先,设计一个内存页框类,包含页框的基本属性(如页框号、状态等)和操作方法(如分配、回收等)。
b.然后,实现一个内存管理器,根据不同的内存保护机制对内存进行保护。
可以使用模拟的方法。
4、文件系统a.首先,设计一个文件类,包含文件的基本属性(如文件名、大小等)和操作方法(如创建、读取、写入、删除等)。
b.然后,实现一个文件系统管理器,包括文件的存储和检索功能。
操作系统实验报告
实 验 报 告
成绩
教 师:方敏
2016 年 12月 17日
班 级:
学 号:140607815
姓 名:黄杨
实验地点:E-Ⅲ区208
实验时间:2016.10.13—2016.12.17
实验一创建进程
【实验软硬件环境】
VC
【实验内容】
实验内容:父进程创建一个有名事件,由子进程发送事件信号,父进程获取事件信号后进行相应的处理
实验三信号通信
【实验软硬件环境】
VC++
【实验内容】
父进程创建一个有名事件,由子进程发送事件信号,父进程获取事件信号后进行相应的处理。
【实验程序及分析】
父进程程序:
// Processs.cpp : Defines the entry point for the console application.
return 0;
}
else{
fprintf(fp,"XiDian University");
fclose(fp);
printf("数据已经写入成功\n");
}
FILE *qp;
if((qp = fopen("D:\\Test1\\abc.txt","r"))== NULL){
printf("读文件打开失败!\n");
【实验原理】
父进程创建子进程,实现多个进程并发执行,提高计算机的运行效率。
【实验程序及分析】
试验程序源代码如下:
父进程部分代码:
// test1.cpp : Defines the entry point for the console application.
操作系统实验—动态分区分配算法
操作系统实验报告实验2 动态分区分配算法报告日期:2016-6-15姓名:学号:班级:任课教师:实验2 动态分区分配算法一、实验内容编写一个内存动态分区分配模拟程序,模拟内存的分配和回收的完整过程。
二、实验目的一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。
当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。
当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。
主存的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理解在可变分区管理方式下应怎样实现主存空间的分配和回收。
三、实验原理模拟在可变分区管理方式下采用最先适应算法实现主存分配和回收。
(1)可变分区方式是按作业需要的主存空间大小来分割分区的。
当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。
随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。
例如:为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:第一栏 第二栏 M其中,起址——指出一个空闲区的主存起始地址。
长度——指出从起始地址开始的一个连续空闲的长度。
状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区。
(2) 当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。
有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分给作业占用;另一部分又成为一个较小的空闲区。
为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。
为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。
操作系统设备管理实验报告
操作系统设备管理实验报告1.计算机操作系统计算机操作系统(operating system缩写作OS)是管理计算机硬件与软件资源的计算机的系统程序, 同时也是计算机系统的内核与基石。
操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。
操作系统也提供一个让用户与系统交互的操作界面。
操作系统在计算机系统中的位置1)操作系统位于底层硬件与用户之间, 是两者沟通的桥梁。
用户可以通过操作系统的用户界面, 输入命令。
操作系统则对命令进行解释, 驱动硬件设备, 实现用户要求。
•2)以现代标准而言, 一个标准PC的操作系统应该提供以下的功能: •进程管理: 计算机中的应用程序都是以进程单位运行的, 操作系统调度多个进程到CPU执行的过程称为进程管理。
•内存管理: 操作系统管理计算机内存, 控制着内存的分配和回收, 管理者内存与外存的信息交换, 以及配合硬件做地址转换。
•文件系统: 管理硬盘的数据, 可将数据已目录或者文件的形式存储。
•网络通信:管理与计算机外部的网络通信, 例如通过浏览器浏览网页, 打印文件等。
安全机制: 控制一些安全机制, 包含计算机非法入侵和一些合法校验。
用户界面: 图形界面。
驱动程序:与硬件交互的计算机软件, 操作系统通过驱动程序与硬件交互, 例如:USB驱动。
2.常见的操作系统1)Windowswindows10微软创始人比尔.盖茨Windows操作系统是美国微软公司推出的一款操作系统。
该系统从1985年诞生到现在, 经过多年的发展完善, 相对比较成熟稳定, 是当前个人计算机的主流操作系统。
Windows系统的特点:a、Windows操作系统界面友好, 窗口制作优美, 操作动作易学, 多代系统之间有良好的传承, 计算机资源管理效率较高, 效果较好。
b、Windows操作系统作为优秀的操作系统, 由开发操作系统的微软公司控制接口和设计, 公开标准, 因此, 有大量商业公司在该操作系统上开发商业软件。
操作系统完整版实验报告
《操作系统》实验报告书班级计算机科学与技术一班姓名朱乾超郭奔邬维袁平欣学号20107986 20107988 20107989 20107990 成绩中南林业科技大学涉外学院理工系2012年12月一、实验的目的和要求操作系统是一门实践性很强的课程,只有把理论和实践紧密地结合在一起,才能取得较好的学习效果。
学生们通过课堂学习或自学,并在完成书本每一章后面的一些习题后,理解了操作系统的基本概念。
但仅有这一方面的训练还是很不够的。
一个普遍的规律是学生们似乎已掌握了书本内容,也能完成一些基本的习题甚至很轻松地通过了一些测验,但一旦需要编制一个稍为复杂的实用系统软件,哪怕只有近百行的不大的程序,就会碰到很多难以克服的困难,甚至不知从何处下手。
即使绞尽了脑汁,花了很多时间才编写出来的程序,在计算机上却怎么也调试不出来。
程序中不仅有不少平时不注意的语法错误,更含有一些严重的逻辑错误,改正了一个又暴露出了另一个。
好多小时过去了,不少学生还坐在终端前面束手无策。
即使勉强调试出了程序,但程序结构性差,效率低,也经不起较为严格的测试。
上机实验是一种更全面更严格的训练,是学习环节中的一个不可缺少的组成部分。
实验对于提高学生用学到的书本知识解决实际问题,培养实际工作所需要的动手能力,对于提高以科学理论和工程上的技术规范地开发大型、复杂、高质量的应用软件和系统软件具有关键性的作用。
机器是最为严厉的老师,通过上机实验,学生可以在程序设计方法、上机操作等基本技能和科学的作风方面受到比较系统和严格的训练。
很多学生认为上机实验就是编写一个程序,上机通一通。
有少数学生甚至不作准备,直接在终端前“打草稿”,边运行边修改。
这些学生以为按实验步骤规范地做是添了麻烦,做“文章”比编程更吃力。
对以往的教学实验中的问题分析表明,规范化的实验步骤不但可以培养科学、正规化的工作方法和作风,为今后设计编制复杂、庞大的应用程序和系统程序打下扎实的基础,即使在现阶段的实验中也能有效地少犯和避免犯大错误,节约上机准备和上机调试时间。
操作系统课内实验报告
.. 西安交通大学实验报告操作系统实验报告2130505133计算机36班操作系统实验实验一:用户接口实验实验目的1)理解面向操作命令的接口Shell。
2)学会简单的shell编码。
3)理解操作系统调用的运行机制。
4)掌握创建系统调用的方法。
操作系统给用户提供了命令接口和程序接口(系统调用)两种操作方式。
用户接口实验也因此而分为两大部分。
首先要熟悉Linux的基本操作命令,并在此基础上学会简单的shell 编程方法。
然后通过想Linux内核添加一个自己设计的系统调用,来理解系统调用的实现方法和运行机制。
在本次实验中,最具有吸引力的地方是:通过内核编译,将一组源代码变成操作系统的内核,并由此重新引导系统,这对我们初步了解操作系统的生成过程极为有利。
实验内容1)控制台命令接口实验该实验是通过“几种操作系统的控制台命令”、“终端处理程序”、“命令解释程序”和“Linux操作系统的bash”来让实验者理解面向操作命令的接口shell和进行简单的shell编程。
➢查看bash版本。
在shell 提示符下输入:$echo $BASH_VERSION我们的版本是4.3.42(1)-release(2)建立bash 脚本,输出Hello word在编辑器中输入以下内容#!/bin/bashecho Hello World!执行脚本使用指令:$./script➢编写bash脚本,统计/my目录下c语言文件的个数通过bash 脚本,可以有多种方式实现这个功能,而使用函数是其中个一个选择。
在使用函数之前,必须先定义函数。
进入自己的工作目录,编写名为count 的文件脚本程序:#! /bin/bashfunction count{echo –n " Number of matches for $1: " #接收程序的第一个参数ls $1|wc –l #对子程序的第一个参数所在的目录进行操作}将count 文件复制到当前目录下,然后在当前目录下建立文件夹,在my 目录下建立几个c 文件,以便用来进行测试2)系统调用实验该实验是通过实验者对“Linux操作系统的系统调用机制”的进一步了解来理解操作系统调用的运行机制;同时通过“自己创建一个系统调用mycall()”和“编程调用自己创建的系统调用”进一步掌握创建和调用系统调用的方法。
系统安装实验报告总结(3篇)
第1篇一、实验目的本次实验旨在通过实际操作,使学生掌握操作系统安装的基本方法,熟悉不同操作系统的安装流程,提高学生的实际动手能力和系统维护能力。
二、实验环境1. 实验机:一台具备安装操作系统能力的计算机,硬件配置满足实验要求。
2. 操作系统:Windows 10、Linux Ubuntu等。
3. 实验工具:安装光盘、U盘启动工具、系统镜像文件等。
三、实验内容1. Windows 10操作系统安装2. Linux Ubuntu操作系统安装3. 操作系统安装过程中的注意事项及解决方法四、实验步骤1. Windows 10操作系统安装(1)准备安装光盘或U盘启动工具,将Windows 10系统镜像文件复制到U盘中。
(2)开机进入BIOS设置,将启动顺序设置为U盘启动。
(3)从U盘启动,进入Windows 10安装界面。
(4)选择安装语言、时间和键盘布局,点击“下一步”。
(5)点击“我接受许可条款”,点击“下一步”。
(6)选择安装类型,这里选择“自定义:仅安装Windows(高级)”。
(7)选择磁盘分区,将所有磁盘空间分给新分区。
(8)格式化分区,点击“下一步”。
(9)等待系统安装完成,重启计算机。
2. Linux Ubuntu操作系统安装(1)准备安装光盘或U盘启动工具,将Ubuntu系统镜像文件复制到U盘中。
(2)开机进入BIOS设置,将启动顺序设置为U盘启动。
(3)从U盘启动,进入Ubuntu安装界面。
(4)选择安装语言、时间和键盘布局,点击“继续”。
(5)选择安装类型,这里选择“桌面安装”。
(6)选择磁盘分区,将所有磁盘空间分给新分区。
(7)格式化分区,点击“继续”。
(8)选择安装位置,点击“继续”。
(9)设置用户名、密码等信息,点击“继续”。
(10)等待系统安装完成,重启计算机。
五、实验结果1. 成功安装Windows 10操作系统。
2. 成功安装Linux Ubuntu操作系统。
六、实验总结1. 在安装操作系统过程中,要确保计算机硬件配置满足系统要求,以免出现安装失败的情况。
《操作系统》实验报告(2)
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为空____
操作系统实验报告
操作系统实验报告操作系统是计算机科学中十分重要的一门课程,本次实验是关于操作系统的,通过实验,我们可以更深入地了解操作系统的相关知识和操作。
本篇文章将着重介绍本次操作系统实验的内容和实验过程中的收获。
一、实验内容本次实验内容主要涉及操作系统的进程、线程和进程同步三部分。
具体内容包括: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()函数释放进程或线程。
为了更好地理解信号量的工作原理,我们将代码分为生产者和消费者两部分,其中生产者用于向缓冲区添加数据,消费者则用于删除数据。
在这个过程中,我们需要使用信号量控制生产者和消费者的数量,避免出现生产过多或消费过多的情况。
操作系统课程实验报告
操作系统课程实验报告一、实验目的操作系统是计算机系统中最为关键的软件之一,它负责管理计算机的硬件资源和软件资源,为用户提供一个良好的工作环境。
通过操作系统课程实验,旨在深入理解操作系统的基本原理和功能,提高对操作系统的实际操作能力和问题解决能力。
二、实验环境本次实验使用的操作系统为Windows 10 和Linux(Ubuntu 1804),开发工具包括 Visual Studio Code、gcc 编译器等。
三、实验内容(一)进程管理1、进程创建与终止在 Windows 系统中,使用 C++语言创建多个进程,并通过进程句柄控制进程的终止。
在 Linux 系统中,使用 fork()系统调用创建子进程,并通过 exit()函数终止进程。
2、进程同步与互斥使用信号量实现进程之间的同步与互斥。
在 Windows 中,利用CreateSemaphore()和 WaitForSingleObject()等函数进行操作;在Linux 中,通过 sem_init()、sem_wait()和 sem_post()等函数实现。
(二)内存管理1、内存分配与释放在 Windows 中,使用 HeapAlloc()和 HeapFree()函数进行动态内存的分配与释放。
在 Linux 中,使用 malloc()和 free()函数完成相同的操作。
2、内存页面置换算法实现了几种常见的内存页面置换算法,如先进先出(FIFO)算法、最近最少使用(LRU)算法等,并比较它们的性能。
(三)文件系统管理1、文件创建与读写在 Windows 和 Linux 系统中,分别使用相应的 API 和系统调用创建文件,并进行读写操作。
2、目录操作实现了目录的创建、删除、遍历等功能。
四、实验步骤(一)进程管理实验1、进程创建与终止(1)在 Windows 系统中,编写 C++程序,使用 CreateProcess()函数创建新进程,并通过 TerminateProcess()函数终止指定进程。
《操作系统》课程综合性的实验报告
《操作系统》课程综合性的实验报告一、实验目的本次《操作系统》课程的综合性实验旨在通过实际操作和实践,深入理解操作系统的基本原理、功能和运行机制。
具体目标包括熟悉操作系统的进程管理、内存管理、文件系统管理以及设备管理等核心模块,提高对操作系统的整体认知和应用能力。
二、实验环境本次实验在以下环境中进行:操作系统:Windows 10 专业版开发工具:Visual Studio 2019编程语言:C++三、实验内容及步骤(一)进程管理实验1、创建多个进程使用 C++中的多线程库,创建多个进程,并观察它们的并发执行情况。
通过设置不同的优先级和资源需求,研究进程调度算法对系统性能的影响。
2、进程同步与互斥实现生产者消费者问题,使用信号量、互斥锁等机制来保证进程之间的同步和互斥。
观察在不同并发情况下,数据的正确性和系统的稳定性。
(二)内存管理实验1、内存分配与回收模拟内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。
通过随机生成内存请求,观察不同算法下内存的利用率和碎片情况。
2、虚拟内存管理研究虚拟内存的工作原理,通过设置页面大小和页表结构,观察页面置换算法(如 FIFO、LRU 等)对内存访问性能的影响。
(三)文件系统管理实验1、文件操作创建、读取、写入和删除文件,了解文件系统的基本操作和数据结构。
2、文件目录管理实现文件目录的创建、遍历和搜索功能,研究目录结构对文件访问效率的影响。
(四)设备管理实验1、设备驱动程序模拟编写简单的设备驱动程序,模拟设备的输入输出操作,如键盘输入和屏幕输出。
2、设备分配与调度研究设备分配算法,如先来先服务和优先级算法,观察设备的使用情况和系统的响应时间。
四、实验结果与分析(一)进程管理实验结果分析1、在创建多个进程的实验中,发现高优先级进程能够更快地获得CPU 资源,系统响应时间更短。
但过度提高某些进程的优先级可能导致其他进程饥饿。
2、对于进程同步与互斥问题,正确使用信号量和互斥锁能够有效地保证数据的一致性和系统的稳定性。
操作实验系统实验报告
实验名称:操作实验系统实验日期:2023年3月15日实验地点:XX大学计算机实验室实验目的:1. 熟悉实验系统的基本操作流程。
2. 掌握实验系统的基本功能使用方法。
3. 培养动手实践能力和团队协作精神。
实验原理:实验系统是一种模拟真实工作环境的软件平台,通过该平台可以完成各种实验任务。
本实验系统基于Windows操作系统,采用C#语言开发,具有图形界面和丰富的功能模块。
实验内容:1. 系统启动与关闭2. 系统界面熟悉3. 功能模块使用4. 实验任务完成实验步骤:一、系统启动与关闭1. 打开实验系统所在的文件夹,找到实验系统可执行文件。
2. 双击可执行文件,系统开始加载,出现启动界面。
3. 系统加载完成后,进入主界面。
4. 完成实验任务后,点击“退出”按钮,系统开始关闭。
二、系统界面熟悉1. 观察主界面,了解系统各个功能模块的布局。
2. 点击各个功能模块,了解其功能及使用方法。
3. 查看系统帮助文档,了解系统功能和使用技巧。
三、功能模块使用1. 数据管理模块:(1)创建数据表:点击“创建数据表”按钮,输入数据表名称,选择数据类型,点击“确定”按钮。
(2)添加数据:选择数据表,点击“添加数据”按钮,输入数据,点击“保存”按钮。
(3)查询数据:选择数据表,点击“查询数据”按钮,输入查询条件,点击“查询”按钮。
2. 图形处理模块:(1)打开图片:点击“打开图片”按钮,选择要处理的图片。
(2)图片编辑:对图片进行缩放、裁剪、旋转等操作。
(3)保存图片:点击“保存图片”按钮,选择保存路径和文件名,点击“保存”按钮。
3. 文本处理模块:(1)打开文本文件:点击“打开文本文件”按钮,选择要处理的文本文件。
(2)文本编辑:对文本进行复制、粘贴、删除等操作。
(3)保存文本:点击“保存文本”按钮,选择保存路径和文件名,点击“保存”按钮。
四、实验任务完成1. 根据实验要求,选择合适的功能模块。
2. 完成实验任务,记录实验数据。
西安交大操作系统实验报告
西安交通大学操作系统专题实验报告班级:学号:姓名:2022年4月25日目录1内核编译与系统调用 (1)1.1实验目的 (1)1.2实验内容 (1)1.3实验思想(或流程图) (1)1.4实验步骤 (1)1.5测试数据设计 (3)1.6程序运行初值及运行结果分析 (3)1.7实验总结 (4)1.7.1实验中的问题与解决过程 (4)1.7.2实验收获 (5)1.7.3意见与建议 (5)1.8附件 (5)1.8.1附件1 程序 (5)1.8.2附件2 MakeFile (8)1.8.3附件3 Readme (8)2 进程软中断与管道通信 (13)2.1实验目的 (13)2.2实验内容 (13)2.3实验思想(或流程图) (13)2.4结果分析 (15)2.5实验总结 (16)2.6源代码 (17)3 模块编程与字符设备驱动 (20)3.1实验目的 (20)3.2实验内容 (20)3.3实验总结 (21)3.4附件 (22)1内核编译与系统调用1.1实验目的掌握系统调用的设计过程,为以后设计更复杂系统奠定基础。
1.2实验内容安装Linux,熟悉Linux的操作,并编译内核,构建、使用自己的Linux内核设计系统调用:设计、添加自己的系统调用,并重新编译内核予以验证为Linux内核设计添加一个系统调用,将系统的相关信息(CPU型号、操作系统的版本号、系统中的进程等,类似于Windows的任务管理器)以文字形式列表显示于屏幕,并编写用户程序予以验证。
请参阅proc文件系统的相关说明,读取proc文件系统的相关信息,可参考实验指导书的proc编程实验1.3实验思想(或流程图)系统调用是应用程序和操作系统内核之间的功能接口,其主要目的使用户可以使用操作系统提供的有关设备管理、输入/ 输出系统、文件系统和进程控制、通信以及存储管理等方面的功能 ,而不必了解系统程序的内部结构和有关硬件细节,从而起到减轻用户负担和保护系统以及提高资源利用率的作用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告实验一:用户接口实验一.实验目的1.理解面向操作命令的接口Shell。
2.学会简单的shell编码。
3.理解操作系统调用的运行机制。
4.掌握创建系统调用的方法。
操作系统给用户提供了命令接口和程序接口(系统调用)两种操作方式。
用户接口实验也因此而分为两大部分。
首先要熟悉Linux的基本操作命令,并在此基础上学会简单的shell编程方法。
然后通过想Linux内核添加一个自己设计的系统调用,来理解系统调用的实现方法和运行机制。
在本次实验中,最具有吸引力的地方是:通过内核编译,将一组源代码变成操作系统的内核,并由此重新引导系统,这对我们初步了解操作系统的生成过程极为有利。
二.实验内容1)控制台命令接口实验该实验是通过“几种操作系统的控制台命令”、“终端处理程序”、“命令解释程序”和“Linux操作系统的bash”来让实验者理解面向操作命令的接口shell 和进行简单的shell编程。
➢查看bash版本。
➢编写bash脚本,统计/my目录下c语言文件的个数2)系统调用实验该实验是通过实验者对“Linux操作系统的系统调用机制”的进一步了解来理解操作系统调用的运行机制;同时通过“自己创建一个系统调用mycall ()”和“编程调用自己创建的系统调用”进一步掌握创建和调用系统调用的方法。
➢编程调用一个系统调用fork(),观察结果。
➢编程调用创建的系统调用foo(),观察结果。
➢自己创建一个系统调用mycall(),实现功能:显示字符串到屏幕上。
➢编程调用自己创建的系统调用。
三.实验步骤系统调用实验:1.首先将Linux-3.0.tar.bz2拷贝到/usr/src目录下——命令:cp linux-3.0.tar.bz2 /usr/src/2.打开终端,获得root权限——命令:sudo –s3.进入/usr/src目录——命令:cd /usr/src4.解压linux源码——命令:tar xvzf linux-3.0.tar.bz25.进入目录linux-3.0.5——命令:cd linux-3.06.添加系统调用——操作:gedit kernel/myservice.c 在文本编辑器中添加#include <linux/kernel.h>#include <linux/linkage.h>asmlinkage void sys_mycall(){printk(KERN_INFO "Hello, world!\n");return;}7.修改kernel/Makefile添加生成myservice.c添加到Makefile的编译规则中:obj-y += myservice.o8..修改arch/x86/include/asm/unistd_32.h,添加以下内容:#define __NR_mycall SYS_ID//SYS_ID表示新添加系统调用的调用号并修改文件中的NR_syscalls,将其值增加19.修改arxh/x86/include/asm/syscalls.h添加以下内容:asmlinkage void sys_mycall();10.修改arch/x86/kernel/syscall_table_32.S,添加以下内容:.long sys_mycall11.配置内核(仅仅修改local versions即可)——命令:make menuconfig12.编译内核——命令:make –j4 bzImage(开4个线程编译)13.编译内核模块——命令:make –j4 modules14.安装内核模块——命令:make modules_install15.安装内核——命令:make install16.重启系统,在系统选择页面选择进入自己编译的linux-3.0内核17.在桌面建立测试的C程序test.c程序内容如下:#include <stdio.h>int main(int argc, char *argv[]){syscall(SYS_ID); // SYS_ID表示新添加系统调用的调用号return 0;}18.编译程序——gcc test.c –o a.out19.运行程序——./a.out20.查看内核日志(printk的输出信息在内核日志中):dmesg四.实验结果1.成功完成内核编译的任务,结果显示图如下:2.下图为添加系统调用结果五.实验小结这次实验的内核编译需要进行一系列比较花时间的操作过程,但同时也锻炼了实际动手能力,在实践中对于操作系统这门课有了进一步的了解。
同时,在本次实验中,学习了linux系统的使用方法,掌握了很多的基本命令,也明白了添加系统调用的方法,为以后的学习提供了很大的帮助。
实验四:一个简单文件系统的实现一.实验目的1.熟悉Ext文件系统的原理2.根据Ext文件系统的数据结构和构建方法,自行实现一个简单的内存文件系统二.实验内容1.设计并实现一个一级(单用户)文件系统程序a.提供以下操作:a)文件创建/删除接口命令create/deleteb)目录创建/删除接口命令mkdir/rmdirc)显示目录内容命令lsb.创建的文件不要求格式和内容2.设计并实现一个二级文件系统程序a.提供用户登录;b.文件、目录要有权限三.实验原理Ext文件系统结构:1.引导块BootBlock每个硬盘分区的开头1024字节,即0 byte至1023 byte是分区的启动扇区。
存放由ROM BIOS自动读入的引导程序和数据,但这只对引导设备有效,而对于非引导设备,该引导块不含代码。
这个块与ext2没有任何关系。
2.超级块SuperBlock每个分区均有一个super block块,定义了文件系统的全局信息,包括块的大小,总块数,空闲块,索引结点数,各种位图和i节点表的地址和大小等信息。
3.数据块位图这是ext2管理存储空间的方法。
即位图法。
每个位对应一个数据块,位值为0表示空闲,1表示已经分配。
数据块位图定义为一个块大小。
于是,一个组中的数据块个数就决定了。
假设块大小为b 字节。
可以区别的块数为b*8个4.数据块 DataBlocks每个组的数据最大个数是在块大小定义后就确定了的。
所以组容量也就确定了。
假设块大小为b 字节。
那么组容量就确定为(b*8)*b 字节若1块=4K,则组块大小=4K*8*4K=128M5.inode位图与数据块位图相似,用来表示索引结点是否已经被使用。
假设块大小为b 字节,每个索引结点数据结构大小为128字节。
最多可以有b*8个索引结点,索引结点表需要占用的存储空间大小为(b*8)*128字节。
即(b*8)*128/b=8*128个块6.inode表索引结点表由若干个索引结点数据结构组成,需要占用若干个块。
Ext2中的每个索引结点数据结构大小为128字节。
每个索引结点即对应一个文件或是目录。
是对其除文件名(目录名)以外的所有属性的描述。
例如:文件类型,文件创建时间,访问时间,修改时间,文件所占数据块的个数,指向数据块的指针。
其中,数据块指针是由15个元组的数据组成四.实验步骤运行结果1.根据要求编写源程序,实验源代码见附录1。
2. 运行程序,运行结果如图:1.根据提示输入help,结果如图:2.输入ls 列出根目录下的项目,然后创建文件目录c 再输入ls观察是否创建成功:5.进入文件目录c并在c中创建文件a6.打开a,并读取a7. 关闭a7.删除a9. 删除文件目录c五.实验小结本次实验要求建立一个文件系统,由于在专业课上的基本知识学习比较薄弱,所以参考了网上的一些代码,进行了一些修改后最后获得结果。
最后,也算完成了一个简单的文件系统,具备了题目中的要求。
但在以后的学习中,还要对这一方面的知识进行一些补充。
附录1:实验源码:#include <stdio.h>#include <time.h>#include <string.h>#include <signal.h>#define DATA_BLOCK 263680 //数据块起始地址#define BLOCK_SIZE 512 //块大小#define DISK_START 0 //磁盘开始地址#define BLOCK_BITMAP 512 //块位图起始地址#define INODE_BITMAP 1024//inode 位图起始地址#define INODE_TABLE 1536//索引节点表起始地址#define INODE_SIZE 64 //struct inode的大小struct group_desc{char bg_volume_name[16]; //卷名unsigned short bg_block_bitmap; //保存块位图的块号unsigned short bg_inode_bitmap; //保存索引结点位图的块号unsigned short bg_inode_table; //索引结点表的起始块号unsigned short bg_free_blocks_count; //本组空闲块的个数unsigned short bg_free_inodes_count; //本组空闲索引结点的个数 unsigned short bg_used_dirs_count; //本组目录的个数char bg_pad[4]; //填充(0xff)};struct inode{unsigned short i_mode; //文件类型及访问权限unsigned short i_blocks; //文件的数据块个数unsigned long i_size; //大小( 字节)unsigned long i_atime; //访问时间unsigned long i_ctime; //创建时间unsigned long i_mtime; //修改时间unsigned long i_dtime; //删除时间unsigned short i_block[8]; //指向数据块的指针char i_pad[24]; //填充(0xff)};struct dir_entry{ //目录项结构unsigned short inode; //索引节点号unsigned short rec_len; //目录项长度unsigned short name_len; //文件名长度char file_type; //文件类型(1: 普通文件, 2: 目录.. )char name[9]; //文件名};char Buffer[512]; //针对数据块的缓冲区char tempbuf[4097]; //unsigned char bitbuf[512]; //位图缓冲区unsigned short index_buf[256];short fopen_table[16]; // 文件打开表unsigned short last_alloc_inode; // 最近分配的节点号unsigned short last_alloc_block; // 最近分配的数据块号unsigned short current_dir; // 当前目录的节点号struct group_desc super_block[1]; // 组描述符缓冲区struct inode inode_area[1]; // 节点缓冲区struct dir_entry dir[32]; // 目录项缓冲区char current_path[256]; // 当前路径名unsigned short current_dirlen;FILE *fp;void update_group_desc()fseek(fp,DISK_START,SEEK_SET);fwrite(super_block,BLOCK_SIZE,1,fp);}void reload_group_desc()//载入组描述符{fseek(fp,DISK_START,SEEK_SET);fread(super_block,BLOCK_SIZE,1,fp);}void update_inode_bitmap()//更新inode位图{fseek(fp,INODE_BITMAP,SEEK_SET);fwrite(bitbuf,BLOCK_SIZE,1,fp);}void reload_inode_bitmap()//载入inode位图{fseek(fp,INODE_BITMAP,SEEK_SET);fread(bitbuf,BLOCK_SIZE,1,fp);}void update_block_bitmap()//更新block位图{fseek(fp,BLOCK_BITMAP,SEEK_SET);fwrite(bitbuf,BLOCK_SIZE,1,fp);}void reload_block_bitmap()//载入block位图{fseek(fp,BLOCK_BITMAP,SEEK_SET);fread(bitbuf,BLOCK_SIZE,1,fp);}void update_inode_entry(unsigned short i)//更新第i个inode入口{fseek(fp,INODE_TABLE+(i-1)*INODE_SIZE,SEEK_SET);fwrite(inode_area,INODE_SIZE,1,fp);}void reload_inode_entry(unsigned short i)//载入第i个inode入口{fseek(fp,INODE_TABLE+(i-1)*INODE_SIZE,SEEK_SET);fread(inode_area,INODE_SIZE,1,fp);}void reload_dir(unsigned short i)//更新第i个目录{fseek(fp,DATA_BLOCK+i*BLOCK_SIZE,SEEK_SET);fread(dir,BLOCK_SIZE,1,fp);void update_dir(unsigned short i)//载入第i个目录{fseek(fp,DATA_BLOCK+i*BLOCK_SIZE,SEEK_SET);fwrite(dir,BLOCK_SIZE,1,fp);}void reload_block(unsigned short i)//载入第i个数据块{fseek(fp,DATA_BLOCK+i*BLOCK_SIZE,SEEK_SET);fread(Buffer,BLOCK_SIZE,1,fp);}void update_block(unsigned short i)//更新第i个数据块{fseek(fp,DATA_BLOCK+i*BLOCK_SIZE,SEEK_SET);fwrite(Buffer,BLOCK_SIZE,1,fp);}int alloc_block()//分配一个数据块,返回数据块号;{unsigned short cur=last_alloc_block;unsigned char con=128;int flag=0;if(super_block[0].bg_free_blocks_count==0){printf("There is no block to be alloced!\n"); return(0);}reload_block_bitmap();cur=cur/8;while(bitbuf[cur]==255){if(cur==511)cur=0;else cur++;}while(bitbuf[cur]&con){con=con/2;flag++;}bitbuf[cur]=bitbuf[cur]+con;last_alloc_block=cur*8+flag;update_block_bitmap();super_block[0].bg_free_blocks_count--;update_group_desc();return last_alloc_block;void remove_block(unsigned short del_num)//删除一个block {unsigned short tmp;tmp=del_num/8;reload_block_bitmap();switch(del_num%8)//更改block位图{case 0:bitbuf[tmp]=bitbuf[tmp]&127;break;case 1:bitbuf[tmp]=bitbuf[tmp]&191;break;case 2:bitbuf[tmp]=bitbuf[tmp]&223;break;case 3:bitbuf[tmp]=bitbuf[tmp]&239;break;case 4:bitbuf[tmp]=bitbuf[tmp]&247;break;case 5:bitbuf[tmp]=bitbuf[tmp]&251;break;case 6:bitbuf[tmp]=bitbuf[tmp]&253;break;case 7:bitbuf[tmp]=bitbuf[tmp]&254;break;}update_block_bitmap();super_block[0].bg_free_blocks_count++;update_group_desc();}//int get_inode()//分配一个inode,返回序号{unsigned short cur=last_alloc_inode;unsigned char con=128;int flag=0;if(super_block[0].bg_free_inodes_count==0){printf("There is no Inode to be alloced!\n");return 0;}reload_inode_bitmap();cur=(cur-1)/8;while(bitbuf[cur]==255){if(cur==511)cur=0;else cur++;}while(bitbuf[cur]&con){con=con/2;flag++;}bitbuf[cur]=bitbuf[cur]+con;last_alloc_inode=cur*8+flag+1;update_inode_bitmap();super_block[0].bg_free_inodes_count--;update_group_desc();return last_alloc_inode;}//void remove_inode(unsigned short del_num){unsigned short tmp;tmp=(del_num-1)/8;reload_inode_bitmap();switch((del_num-1)%8)//更改block位图{case 0:bitbuf[tmp]=bitbuf[tmp]&127;break;case 1:bitbuf[tmp]=bitbuf[tmp]&191;break;case 2:bitbuf[tmp]=bitbuf[tmp]&223;break;case 3:bitbuf[tmp]=bitbuf[tmp]&239;break;case 4:bitbuf[tmp]=bitbuf[tmp]&247;break;case 5:bitbuf[tmp]=bitbuf[tmp]&251;break;case 6:bitbuf[tmp]=bitbuf[tmp]&253;break;case 7:bitbuf[tmp]=bitbuf[tmp]&254;break;}update_inode_bitmap();super_block[0].bg_free_inodes_count++;update_group_desc();}// dirvoid dir_prepare(unsigned short tmp,unsigned short len,int type) //新目录和文件初始化.and ..{reload_inode_entry(tmp);//得到新目录的节点入口地址if(type==2)//目录{inode_area[0].i_size=32;inode_area[0].i_blocks=1;inode_area[0].i_block[0]=alloc_block();dir[0].inode=tmp;dir[1].inode=current_dir;dir[0].name_len=len;dir[1].name_len=current_dirlen;dir[0].file_type=dir[1].file_type=2;for(type=2;type<32;type++)dir[type].inode=0;strcpy(dir[0].name,".");strcpy(dir[1].name,"..");update_dir(inode_area[0].i_block[0]);inode_area[0].i_mode=01006;//drwxrwxrwx:目录}else{inode_area[0].i_size=0;inode_area[0].i_blocks=0;inode_area[0].i_mode=0407;//drwxrwxrwx:文件}update_inode_entry(tmp);}//unsigned short reserch_file(char tmp[9],int file_type,unsigned short *inode_num,unsigned short *block_num,unsigned short *dir_num){ //查找文件并改写缓冲区里节点号,所在目录节点的数据块号(0~7)、目录项所在号unsigned short j,k;reload_inode_entry(current_dir);j=0;while(j<inode_area[0].i_blocks){reload_dir(inode_area[0].i_block[j]);k=0;while(k<32){if(!dir[k].inode||dir[k].file_type!=file_type||strcmp(dir[k].name,tmp))k++; else{*inode_num=dir[k].inode;*block_num=j;*dir_num=k;return 1;}}j++;}return 0;}//void cd(char tmp[9]){unsigned short i,j,k,flag;flag=reserch_file(tmp,2,&i,&j,&k);if(flag){current_dir=i;if(!strcmp(tmp,"..")&&dir[k-1].name_len){current_path[strlen(current_path)-dir[k-1].name_len-1]='\0'; current_dirlen=dir[k].name_len;}else if(!strcmp(tmp,"."));else if(strcmp(tmp,"..")){current_dirlen=strlen(tmp);strcat(current_path,tmp);strcat(current_path,"/");}}else printf("The directory %s not exists!\n",tmp);}//void del(char tmp[9]){unsigned short i,j,k,m,n,flag;m=0;flag=reserch_file(tmp,1,&i,&j,&k);if(flag){flag=0;while(fopen_table[flag]!=dir[k].inode&&flag<16)flag++;if(flag<16)fopen_table[flag]=0;reload_inode_entry(i);while(m<inode_area[0].i_blocks)remove_block(inode_area[0].i_block[m++]); inode_area[0].i_blocks=0;inode_area[0].i_size=0;remove_inode(i);reload_inode_entry(current_dir);dir[k].inode=0;//if(k!=0)dir[k-1].rec_len+=dir[k].rec_len ;update_dir(inode_area[0].i_block[j]);inode_area[0].i_size-=16;m=1;while(m<inode_area[i].i_blocks){flag=n=0;reload_dir(inode_area[0].i_block[m]);while(n<32){if(!dir[n].inode)flag++;n++;}if(flag==32){remove_block(inode_area[i].i_block[m]);inode_area[i].i_blocks--;while(m<inode_area[i].i_blocks)inode_area[i].i_block[m]=inode_area[i].i_blo ck[++m];}}update_inode_entry(current_dir);}else printf("The file %s not exists!\n",tmp);}//void mkdir(char tmp[9],int type){unsigned short tmpno,i,j,k,flag;reload_inode_entry(current_dir); //获得当前目录的索引节点给inode_area[0]if(!reserch_file(tmp,type,&i,&j,&k)) //未找到同名文件{if(inode_area[0].i_size==4096) //目录项已满{printf("Directory has no room to be alloced!\n");return;}flag=1;if(inode_area[0].i_size!=inode_area[0].i_blocks*512)//目录中有某些个块中32个项未满{i=0;while(flag&&i<inode_area[0].i_blocks){reload_dir(inode_area[0].i_block[i]);j=0;while(j<32){if(dir[j].inode==0){flag=0;break;}j++;}i++;}tmpno=dir[j].inode=get_inode();dir[j].name_len=strlen(tmp);dir[j].file_type=type;strcpy(dir[j].name,tmp);update_dir(inode_area[0].i_block[i-1]);}else//全满{inode_area[0].i_block[inode_area[0].i_blocks]=alloc_block(); inode_area[0].i_blocks++;reload_dir(inode_area[0].i_block[inode_area[0].i_blocks-1]); tmpno=dir[0].inode=get_inode();dir[0].name_len=strlen(tmp);dir[0].file_type=type;strcpy(dir[0].name,tmp);//初始化新块for(flag=1;flag<32;flag++)dir[flag].inode=0;update_dir(inode_area[0].i_block[inode_area[0].i_blocks-1]); }inode_area[0].i_size+=16;update_inode_entry(current_dir);dir_prepare(tmpno,strlen(tmp),type);}else //已经存在同名文件或目录{if(type==1)printf("File has already existed!\n");else printf("Directory has already existed!\n");}}//void rmdir(char tmp[9]){unsigned short i,j,k,flag;unsigned short m,n;if(!strcmp(tmp,"..")||!strcmp(tmp,".")){printf("The directory can not be deleted!\n");return;}flag=reserch_file(tmp,2,&i,&j,&k);if(flag){reload_inode_entry(dir[k].inode); //找到要删除的目录的节点并载入if(inode_area[0].i_size==32) //只有.and ..{inode_area[0].i_size=0;inode_area[0].i_blocks=0;//reload_dir(inode_area[0].i_block[0]);//dir[0].inode=0;//dir[1].inode=0;remove_block(inode_area[0].i_block[0]);reload_inode_entry(current_dir);//得到当前目录的节点并更改当前目录项remove_inode(dir[k].inode);dir[k].inode=0;update_dir(inode_area[0].i_block[j]);inode_area[0].i_size-=16;flag=0;m=1;while(flag<32&&m<inode_area[0].i_blocks){flag=n=0;reload_dir(inode_area[0].i_block[m]);while(n<32){if(!dir[n].inode)flag++;n++;}if(flag==32){remove_block(inode_area[0].i_block[m]);inode_area[0].i_blocks--;while(m<inode_area[0].i_blocks)inode_area[0].i_block[m]=inode_area[0].i_blo ck[++m];}}update_inode_entry(current_dir);}else printf("Directory is not null!\n");}else printf("Directory to be deleted not exists!\n");}//void ls(){int i,j,k,tmpno,no;i=0;printf("items type mode size\n");reload_inode_entry(current_dir);while(i<inode_area[0].i_blocks){k=0;reload_dir(inode_area[0].i_block[i]);while(k<32){if(dir[k].inode){printf("%s",dir[k].name);if(dir[k].file_type==2){j=0;reload_inode_entry(dir[k].inode);if(!strcmp(dir[k].name,".."))while(j++<13)printf(" "); else if(!strcmp(dir[k].name,"."))while(j++<14)printf(" ");else while(j++<15-dir[k].name_len)printf(" ");printf("<DIR> ");switch(inode_area[0].i_mode&7){case 1:printf("____x");break;case 2:printf("__w__");break;case 3:printf("__w_x");break;case 4:printf("r____");break;case 5:printf("r___x");break;case 6:printf("r_w__");break;case 7:printf("r_w_x");break;}printf(" ----");}else if(dir[k].file_type==1){j=0;reload_inode_entry(dir[k].inode);while(j++<15-dir[k].name_len)printf(" ");printf("<FILE> ");switch(inode_area[0].i_mode&7){case 1:printf("____x");break;case 2:printf("__w__");break;case 3:printf("__w_x");break;case 4:printf("r____");break;case 5:printf("r___x");break;case 6:printf("r_w__");break;case 7:printf("r_w_x");break;}printf(" %d bytes ",inode_area[0].i_size); }printf("\n");}k++;reload_inode_entry(current_dir);}i++;}}// fileunsigned short search_file(unsigned short Ino)//在打开文件表中查找是否已打开文件{unsigned short fopen_table_point=0;while(fopen_table_point<16&&fopen_table[fopen_table_point++]!=Ino);if(fopen_table_point==16)return 0;return 1;}//void read_file(char tmp[9])//读文件{unsigned short flag,i,j,k;flag=reserch_file(tmp,1,&i,&j,&k); //返回文件目录项的信息if(flag){if(search_file(dir[k].inode)){reload_inode_entry(dir[k].inode);if(!(inode_area[0].i_mode&4))//i_mode:111b:读,写,执行 {printf("The file %s can not be read!\n",tmp);return;}for(flag=0;flag<inode_area[0].i_blocks;flag++){reload_block(inode_area[0].i_block[flag]);Buffer[512]='\0';printf("%s",Buffer);}if(flag==0)printf("The file %s is empty!\n",tmp);else printf("\n");}else printf("The file %s has not been opened!\n",tmp);}else printf("The file %s not exists!\n",tmp);}void write_file(char tmp[9])//写文件{unsigned short flag,i,j,k,size=0,need_blocks;flag=reserch_file(tmp,1,&i,&j,&k);if(flag){if(search_file(dir[k].inode)){reload_inode_entry(dir[k].inode);if(!(inode_area[0].i_mode&2))//i_mode:111b:读,写,执行 {printf("The file %s can not be writed!\n",tmp);return;}while(1){tempbuf[size]=getchar();if(tempbuf[size]=='#'){tempbuf[size]='\0';break;}if(size>=4096){printf("Sorry,the max size of a file is 4KB!\n"); tempbuf[size]='\0';break;}size++;}need_blocks=strlen(tempbuf)/512;if(strlen(tempbuf)%512)need_blocks++;if(need_blocks<9){while(inode_area[0].i_blocks<need_blocks){inode_area[0].i_block[inode_area[0].i_blocks]=alloc_block();inode_area[0].i_blocks++;}j=0;while(j<need_blocks){if(j!=need_blocks-1){reload_block(inode_area[0].i_block[j]);memcpy(Buffer,tempbuf+j*BLOCK_SIZE,BLOCK_SIZE); update_block(inode_area[0].i_block[j]);}else{reload_block(inode_area[0].i_block[j]);memcpy(Buffer,tempbuf+j*BLOCK_SIZE,strlen(tempbuf)-j*BLOCK_SIZE);if(strlen(tempbuf)>inode_area[0].i_size){Buffer[strlen(tempbuf)-j*BLOCK_SIZE]='\0';inode_area[0].i_size=strlen(tempbuf);}update_block(inode_area[0].i_block[j]);}j++;}update_inode_entry(dir[k].inode);}else printf("Sorry,the max size of a file is 4KB!\n");}else printf("The file %s has not opened!\n",tmp);}else printf("The file %s does not exist!\n",tmp);}//void close_file(char tmp[9])//关闭文件{unsigned short flag,i,j,k;flag=reserch_file(tmp,1,&i,&j,&k);if(flag){if(search_file(dir[k].inode)){flag=0;while(fopen_table[flag]!=dir[k].inode)flag++;fopen_table[flag]=0;printf("File: %s! closed\n",tmp);}else printf("The file %s has not been opened!\n",tmp);}else printf("The file %s does not exist!\n",tmp);}void open_file(char tmp[9]){unsigned short flag,i,j,k;flag=reserch_file(tmp,1,&i,&j,&k);if(flag){if(search_file(dir[k].inode))printf("The file %s has opened!\n",tmp);else{flag=0;while(fopen_table[flag])flag++;fopen_table[flag]=dir[k].inode;printf("File %s! opened\n",tmp);}}else printf("The file %s does not exist!\n",tmp);}// formatvoid initialize_disk(){int i=0;printf("Creating the ext2 file system\n");printf("Please wait ");while(i<1){printf("... ");// sleep(1);i++;}printf("\n");last_alloc_inode=1;last_alloc_block=0;for(i=0;i<16;i++)fopen_table[i]=0;//清空缓冲表for(i=0;i<BLOCK_SIZE;i++)Buffer[i]=0;// 清空缓冲区,通过缓冲区清空文件,即清空磁盘fp=fopen("FS_zqw_zzw.txt","w+b");fseek(fp,DISK_START,SEEK_SET);for(i=0;i<4611;i++)fwrite(Buffer,BLOCK_SIZE,1,fp);//清空文件,即清空磁盘全部用0填充reload_group_desc();reload_inode_entry(1);reload_dir(0);strcpy(current_path,"[root@ /"); //该路径名strcpy(super_block[0].bg_volume_name,"EXT2FS"); //改卷名,初始化组描述符内容super_block[0].bg_block_bitmap=BLOCK_BITMAP;super_block[0].bg_inode_bitmap=INODE_BITMAP;super_block[0].bg_inode_table=INODE_TABLE;super_block[0].bg_free_blocks_count=4096;super_block[0].bg_free_inodes_count=4096;super_block[0].bg_used_dirs_count=0;// 初始化组描述符内容 update_group_desc(); //更新组描述符内容reload_block_bitmap();reload_inode_bitmap();inode_area[0].i_mode=518;inode_area[0].i_blocks=0;inode_area[0].i_size=32;inode_area[0].i_atime=0;inode_area[0].i_ctime=0;inode_area[0].i_mtime=0;inode_area[0].i_dtime=0;inode_area[0].i_block[0]=alloc_block();inode_area[0].i_blocks++;current_dir=get_inode();update_inode_entry(current_dir);dir[0].inode=dir[1].inode=current_dir;dir[0].name_len=0;dir[1].name_len=0;dir[0].file_type=dir[1].file_type=2;//1:文件;2:目录strcpy(dir[0].name,".");strcpy(dir[1].name,"..");update_dir(inode_area[0].i_block[0]);printf("The ext2 file system has been installed!\n");}void initialize_memory(){int i=0;last_alloc_inode=1;last_alloc_block=0;for(i=0;i<16;i++)fopen_table[i]=0;strcpy(current_path,"[root@ /");current_dir=1;fp=fopen("FS_zqw_zzw.txt","r+b");if(fp==NULL){printf("The File system does not exist!\n");initialize_disk();return ;}reload_group_desc();}void format(){initialize_disk();initialize_memory();}void help(){printf(" ext文件系统模拟\n");printf(" 可以使用的命令: \n");printf(" 1.进入文件目录: cd+dir_name 7.创建文件目录:mkdir+dir_name \n");printf(" 2.创建文件: mkf+file_name 8.删除目录:rmdir+dir_name \n");printf(" 3.删除文件: rm+file_name 9.读取文件:read+file_name \n");printf(" 4.打开文件: open+file_name 10.写文件:write+file_name \n");printf(" 5.关闭文件 : close+file_name 11.退出: quit \n");printf(" 6.列出项目 : ls 12.查看帮助 : help \n");printf(" 13.format disk : format \n");}// mainint main(char argc,char **argv){char command[10],temp[9];initialize_memory();printf("输入help查看帮助\n");while(1){printf("%s]#",current_path);scanf("%s",command);if(!strcmp(command,"cd")){scanf("%s",temp);cd(temp);}else if(!strcmp(command,"mkdir")){scanf("%s",temp);mkdir(temp,2);}else if(!strcmp(command,"mkf")){scanf("%s",temp);mkdir(temp,1);}else if(!strcmp(command,"rmdir")){scanf("%s",temp);rmdir(temp);}else if(!strcmp(command,"rm")){scanf("%s",temp);del(temp);}else if(!strcmp(command,"open")){scanf("%s",temp);open_file(temp);}else if(!strcmp(command,"close")){scanf("%s",temp);close_file(temp);}else if(!strcmp(command,"read")){scanf("%s",temp);read_file(temp);}else if(!strcmp(command,"write")){scanf("%s",temp);write_file(temp);}else if(!strcmp(command,"ls"))ls();else if(!strcmp(command,"format")){char tempch;printf("Format will erase all the data in the Disk\n");printf("Are you sure?y/n:\n");scanf(" %c",&tempch);if(tempch=='Y'||tempch=='y'){fclose(fp);initialize_disk();}elseprintf("Format Disk canceled\n");}else if(!strcmp(command,"help"))help();else if(!strcmp(command,"quit"))break;else printf("No this Command,Please check!\n");}return 0;}(注:文档可能无法思考全面,请浏览后下载,供参考。