操作系统实验报告 实验4 文件系统管理实验(答案全)

1.实验目的

了解与文件管理有关的Linux内核模块的代码结构。

2实验要求

1)创建文件模块分析
2)删除文件 rm 模块分析
3)读写模块分析

3.实验步骤

A. 创建文件模块分析

5780 /*creat system call */ 
5781 Creat() 
5782 { 
5783 	resister *ip;//将ip地址放在寄存器中,这样程序运行速度更快
5784 	extern uchar; //uchar变量是在别处定义的,要在此处应用
5785 
5786 	ip = namei(&uchar,1); //namei可以列出路径中所有成分的信息,包含符号链接。
                                      ip获取了uchar的指针。
5787 	if(ip == NULL){//如果ip是空的
5788 		if(u.u_error)//这里列出各种出错条件0 
5789 					return;//结束该程序 
5790		 ip = maknode(u.u_arg[1]&07777&(~ISVTX));// 调用maknode()新建一inode;
makenode(7455)是个简单的函数,它内部调用ialloc()分配磁盘inode资源,进行简单设置后,调用wdir()将此inode写入磁盘

5791 		if (ip == NULL)//如果ip是空的 
5792					 return;//结束程序 
5793		 open1(ip,FWRITE,2);//调用open1(ip, FWRITE, 2)分配file数组和u_ofile数组资源 
5794	 }else 
5795	 open1(ip,FWRITE,1); //调用open1(ip, FWRITE, 1)——删除原有文件,复用其inode
5796 }5786:“namei”( 7 5 1 8 )将一路径名变换成一个“inode”指针。“uchar”是一个过程的
名字,它从用户程序数据区一个字符一个字符地取得文件路径名。 
5787:一个空“inode”指针表示出了一个错,或者并没有具有给定路径名的文件存在。 
5788:对于出错的各种条件,请见 UMP 的 CREAT(II)5790:“maknode”( 7455)调用“ialloc”创建一内存“ inode”,然后对其赋初值,并使
其进入适当的目录。注意,显式地清除了“粘住”位( ISVTX)

B. 删除文件 rm 模块分析

3510 unlink() 
3511 { 
3512 resister *ip,*pp;//将ip地址放在寄存器中,这样程序运行速度更快
3513 extern uchar; //uchar变量是在别处定义的,要在此处应用
3514 
3515 pp = namei(&uchar,2);  //获取父目录的inode
3516 if (pp ==NULL)//如果pp是空的
3517 		return;//程序结束 
3518 prele(pp); //清除ILOCK标记,唤醒因此睡眠的进程
3519 ip = iset(pp ->dev,u.u_dent.u_ino); 
3520 if (ip == NULL) //如果ip是空的
3521 			panic (*unlink – iset *); 
3522 if ((ip ->i_mode%IFMT) == IFDIR && !suser()) 
3523 			goto out; //去到3532
3524 u.u_offset[1] = - DIRSIZ+2; //u_offset执行文件名目录项起始地址
3525 u.ubase = &u.u_dent; //用户地址设置为u_dent
3526 u.ucount = DIRSIZE +2;  //长度为目录项长度
3527 u.u_dent.u_ino = 0;  //inode指针置0,即此目录项设置为空
3528 writei(pp);  //更新父目录(该文件名的目录项置为空)
3529 ip ->i_nlink--; //文件硬链接计数减一
3530 ip->i_flag =! IUPD;     //设置IUPD标志               
3531 
3532 out: 
3533 	iput(pp); //释放文件inode
3534 	iput(ip); //释放文件inode
3535 }

新文件作为永久文件自动进入文件目录。关闭文件不会自动地造成文件被删除。当内存“ inode”项中的“ i _ nlink”字段值为 0 并且相应文件未被打开时,将删除该文件。在创建文件时,该字段由“ maknode”赋初值为 1。系统调用“ link”( 5941 )可将其值加1,系统调用“unlink”( 3529 )则可将其值减 1。创建临时“工作文件”的程序应当在其终止前执行“ unlink”系统调用将这些文件删除。
注意,“unlink”系统调用本身并没有删除文件。当引用计数( i _ count )被减为 0 时(7350、7362),才删除该文件。
为了减少在程序或系统崩溃时遗留下来的临时文件所带来的问题,程序员应当遵守下列约定:
(1) 在打开临时文件后立即对其执行“ unlink”操作。
(2) 应在“tmp”目录下创建临时文件。在文件名中包括进程标识数就可构成一惟一文件名

C. 读写模块分析

5711 Read( ); 
5712{ 
5713 		rdwr(FREAD); 
5714 } 
 //在2693中有trap{#3系统调用}。用户进程执行系统调用激活运行在核心态的“trap”。“trap”识别#3系统调用,然后通过“trapl”调用例程“read”,它又调用“rdwr”。

5720 Write( )
5721 { 
5722 		rdwr(FWRITE); 
5723	 } 
 //调用例程“Write”,又调用例程:“rdwr”
5731 rdwr(mode) 
5732{ 
5733 		resister *fp,m; //在寄存器中定义,速度更快
5734 
5735 		m = mode; 
5736 		fp = setf(u.u_arg[R0]); //将用户程序文件标识变换成指向相应文件表项的指针。
5737 		if (fp ==NILL) //如果fp是空的
5738 				return; //程序结束
5739		 if ((fp ->f_flag&m ==0) { //检查所要求的操作(读或写)是否与文件打开时的读/写方式符合。
5740									 u.u_error = EBADF; 
5741									 return; 
5742 									} 
5743 			u.u_base = u.u_arg[0]; //用各参数在“u”中设置几个标准单元。
5744 			u.u_count = u.u_arg[1]; 
5745			 u.u_segflg = 0; 
5746 			if(fp ->f_flag&FPIPE) { //从此开始对“管道”文件进行特殊处理。
5747 									if(m == FREAD) 
5748											 readp(fp);else 
5749									 writep(fp); 
5750 									}else{ 
5751 		u.u_offset[1] = fp ->f_offset[1]; 
5752 		u.u_offset[0] = fp ->f_offset[0]; 
5753 		if (m == FREAD) 
5754 		readi(fp ->f_inode);else 
5755 		writei(fp ->f_inode); //按读、写要求分别调用“ read i”或“write i”。 
5756		 dpadd(fp ->f_offset,u.u_arg[1] – u.u_count; //更新文件位移量,使其增加实际传送的字符数,同时也将实际传送的字符数返回
5757		 } 
5758 		u.u_ar0[R0] = u.u_arg[1] – u.u_count; //赋值
5759 } 
 
 “read”系统调用的基本工作过程为: 
……read ( f , b , n ) ;*用户程序*/ 
{发生陷入} 
2693 trap{#3 系统调用} 
5711 read()5713 rdwr(FREAD); 
 
用户进程执行系统调用激活运行在核心态的“ trap”。“trap”识别#3系统调用,然后通过“trap l”调用例程“read”,它又调用“rdwr”。 
“rdwr”包含了很多“read”和“write”操作共用的代码。它调用“ getf”( 6 6 1 9 )将用户进程提供的文件标识变换成“file”数组中一项的地址。 
注意,该系统调用的第 1 个参数是以不同于另外 2 个参数的方式传送的。 
将“u.u_segflg”设置为0,这表示此操作的目的地址在用户地址空间中。在以一个 inode指针参数调用“ read i”后,将要求传送的字符数减去剩余未传输字符数(在 u.u _ count 中),加至文件位移量中。 
6221 readi 
 
6239 lbn = lshift (u.u_offset,-9); //“l s h i f t”( 1 4 1 0 )将“u.u _ o ff s e t”数组中的两个字并接,然后右移 9位,并切除为1 6 
位。这规定了要引用的文件逻辑块号;

6248 on = u.u_offset[i] & 0777; //调用“b m a p”,将文件逻辑块号变换成其宿主设备上的物理块块号。很快我们还 
要对“b m a p”作更多说明,现在我们应注意到“ b m a p”作为一副作用设置了“r a b l o c k” 

6241 n = min (512 – on,u.u_count); //在本块内剩余字符数(亦即o n之后的字符数)和要求传送的字符数两者之中选择较小 
者,并将其赋予“n”。注意,“m i n”( 6 3 3 9 )将其参数处理为无符号整型。

6250 dn = ip->i_dev; //从“i n o d e”取设备标识,并将其赋予“ d n”。

6258 bp = bread (dn,bn); //只是读所希望的块。

6260 iomove (bp,on,n,B_READ); //调用“i o m o v e”,将信息从缓存传送到用户区。

6261 brelse (bp); //将该缓存释放回a v列表。

“read i”将文件位移量分解成两部分:一个逻辑块号“lbn”,以及一个块内索引“on”。将要传输的字符数是下而两个值中的较小者:“u.u _ count”和块内尚余字符数(在这种情况下以后还必须读其他块,此处没有进一步对此说明),还应考虑尚余留在文件中的字符数(对这种情况也未进一步说明)。
“dn”是存储在“ inode”中的设备编号,“bn”是在该设备(磁盘)上的实际块号,这是由“bmap”(6415)用“lbn”计算得到的。
对“ bread ”的调用找到所要求的磁盘块,若需要,则将其从磁盘复制到内存中。“iomove”(6364)将适当数量的字符传送至目的区,然后执行计数操作。
“read”和“ write”执行的操作有很多相似之处,两者共享很多代码。
系统调用“ read”(5711)和“write”( 5720),然后立即调用“rdwr”,它执行下列操作:
5736:将用户程序文件标识变换成指向相应文件表项的指针。
5739:检查所要求的操作(读或写)是否与文件打开时的读/写方式符合。
5743:用各参数在“u”中设置几个标准单元。
5746:从此开始对“管道”文件进行特殊处理。
5755:按读、写要求分别调用“ read i”或“write i”。
5756:更新文件位移量,使其增加实际传送的字符数,同时也将实际传送的字符数返回。


链接: 操作系统实验报告 实验1 VMware虚拟机配置与linux基本命令(答案全).
链接: 操作系统实验报告 实验2 进程管理(答案全).
链接: 操作系统实验报告 实验3存储管理实验(答案全).

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
实验目的】 1. 了解文件系统的原理; 2. 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。 【实验准备】 1.文件的逻辑结构  顺序文件  索引文件  索引顺序文件  直接文件和哈希文件 2.外存分配方式  连续分配  链接分配  索引分配 【实验内容】 1. 实验要求 要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 2. 实验题目  设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。  程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。  为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。 因系统小,文件目录的检索使用了简单的线性搜索。文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。程序中使用的主要设计结构如下:主文件目录和用户文件目录( MFD、UFD)打开文件目录( AFD)(即运行文件目录)。 M D F 用户名 文件目录指针 用户名 文件目录指针 U F D 文件名 保护码 文件长度 文件名 A F D 打开文件名 打开保护码 读写指针
操作系统实验(含实验报告) 1、进程调度 2、作业调度 3、主存空间的分配与回收 4、文件系统 一、 实验目的 用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。 二、实验内容和要求 编写并调试一个模拟的进程调度程序,采用“简单时间片轮转法”调度算法对五个进程进行调度。 每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、到达时间、需要运行时间、已运行时间、进程状态等等。 进程的到达时间及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。 进程的运行时间以时间片为单位进行计算。 每个进程的状态可以是就绪 W(Wait)、运行R(Run)两种状态之一。 就绪进程获得 CPU后都只能运行一个时间片。用运行时间加1来表示。 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应分配时间片给就绪队列中排在该进程之后的进程,并将它插入就绪队列队尾。 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。 重复以上过程,直到所要进程都完成为止。 三、实验主要仪器设备和材料 硬件环境:IBM-PC或兼容机 软件环境:C语言编程环境 四、实验原理及设计方案 1、进程调度算法:采用多级反馈队列调度算法。其基本思想是:当一个新进程进入内在后,首先将它放入第一个队列的末尾,按FCFS原则排队等待高度。当轮到该进程执行时,如能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚为完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行,以此类推。 2、实验步骤: (1)按先来先服务算法将进程排成就绪队列。 (2)检查所有队列是否为空,若空则退出,否则将队首进程调入执行。 (3)检查该运行进程是否运行完毕,若运行完毕,则撤消进程,否则,将该进程插入到下一个逻辑队列的队尾。 (4)是否再插入新的进程,若是则把它放到第一逻辑队列的列尾。 (5)重复步骤(2)、(3)、(4),直到就绪队列为空。 。。。。。。。。。。。。。。。。。。。。。。
文件管理系统是操作系统中一个非常重要的组成部分,它负责管理计算机硬盘上的文件和目录。在实验中,我们可以通过模拟操作系统文件管理系统来学习和熟悉文件管理系统的基本操作。 以下是一个文件管理系统实验的简要步骤: 1. 创建文件:打开命令行终端,使用 touch 命令创建一个新文件。例如,输入命令 touch file1.txt 可以创建一个名为 file1.txt 的新文件。 2. 复制文件:使用 cp 命令复制一个文件到另一个文件中。例如,输入命令 cp file1.txt file2.txt 可以将 file1.txt 复制到 file2.txt 中。 3. 移动文件:使用 mv 命令将一个文件从一个目录移动到另一个目录。例如,输入命令 mv file1.txt /home/user/documents 可以将 file1.txt 移动到 /home/user/documents 目录中。 4. 删除文件:使用 rm 命令删除一个文件。例如,输入命令 rm file1.txt 可以删除 file1.txt 文件。 5. 创建目录:使用 mkdir 命令创建一个新目录。例如,输入命令 mkdir mydir 可以创建一个名为 mydir 的新目录。 6. 列出目录内容:使用 ls 命令列出当前目录中的所有文件和子目录。例如,输入命令 ls 可以列出当前目录中的所有文件和子目录。 7. 改变工作目录:使用 cd 命令改变当前工作目录。例如,输入命令 cd /home/user/documents 可以将当前工作目录改为 /home/user/documents。 8. 创建软链接:使用 ln 命令创建一个软链接。例如,输入命令 ln -s file1.txt file1_link.txt 可以创建一个名为 file1_link.txt 的软链接,它指向 file1.txt 文件。 9. 查找文件:使用 find 命令查找指定名称或类型的文件。例如,输入命令 find /home/user -name "*.txt" 可以查找 /home/user 目录下所有扩展名为 .txt 的文件。 以上是一个简单的文件管理系统实验步骤,通过这些步骤可以熟悉文件管理系统的基本操作。当然,在真实的操作系统中,文件管理系统还有很多高级功能和操作,需要进一步学习和实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m明月Java3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值