《操作系统》基本课程实验指导书-2014 联系客服

发布时间 : 星期六 文章《操作系统》基本课程实验指导书-2014更新完毕开始阅读

8. 文件系统管理实验

8.1 实验7.1 代码分析

1、实验目的

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

2、实验内容

阅读 Linux/Minix中有关文件模块的调用主线,并写出分析报告,包括

? 文件建立模块,即系统调用create() ? 文件删除模块,即系统调用rm() ? 读/写模块,即 read/write

3、分析报告示例

A. 创建文件模块分析

5780 /*creat system call */ 5781 Creat() 5782 {

5783 resister *ip; 5784 extern uchar; 5785

5786 ip = namei(&uchar,1); 5787 if(ip == NULL){ 5788 if(u.u_error) 5789 return;

5790 ip = maknode(u.u_arg[1]&07777&(~ISVTX)); 5791 if (ip == NULL) 5792 return; 5793 open1(ip,FWRITE,2); 5794

}else

5795 open1(ip,FWRITE,1); 5796 }

第5 7 8 6:“namei”( 7 5 1 8 )将一路径名变换成一个“inode”指针。“uchar”是一个过程的名字,它从用户程序数据区一个字符一个字符地取得文件路径名。

5 7 8 7:一个空“inode”指针表示出了一个错,或者并没有具有给定路径名的文件存在。 5 7 8 8:对于出错的各种条件,请见U P M的C R E AT ( I I )。 5 7 9 0:“maknode”( 7 4 5 5 )调用“ialloc”创建一内存“ inode”,然后对其赋初值,并使其进入适当的目录。注意,显式地清除了“粘住”位( I S V T X )。

B. 删除文件rm模块分析

3510 unlink() 3511 {

3512 resister *ip,*pp; 3513 extern uchar; 3514

3515 pp = namei(&uchar,2); 3516 if (pp ==NULL) 3517 return; 3518 prele(pp);

3519 ip = iset(pp ->dev,u.u_dent.u_ino); 3520 if (ip == NULL)

3521 panic (*unlink – iset *);

3522 if ((ip ->i_mode%IFMT) == IFDIR && !suser()) 3523 goto out;

3524 u.u_offset[1] = - DIRSIZ+2; 3525 u.ubase = &u.u_dent; 3526 u.ucount = DIRSIZE +2; 3527 u.u_dent.u_ino = 0; 3528 writei(pp); 3529 ip ->i_nlink--; 3530 ip->i_flag =! IUPD; 3531

3532 out:

3533 iput(pp); 3534 iput(ip); 3535 }

新文件作为永久文件自动进入文件目录。关闭文件不会自动地造成文件被删除。当内存“ inode”项中的“ i _ nlink”字段值为0并且相应文件未被打开时,将删除该文件。在创建文件时,该字段由“ m a k n o d e”赋初值为1。系统调用“ link”( 5 9 4 1 )可将其值加1,系统调用“unlink”( 3 5 2 9 )则可将其值减1。创建临时“工作文件”的程序应当在其终止前执行“ unlink”系统调用将这些文件删除。 注意,“unlink”系统调用本身并没有删除文件。当引用计数( i _ count )被减为0时( 7 3 5 0、7 3 6 2 ),才删除该文件。

为了减少在程序或系统崩溃时遗留下来的临时文件所带来的问题,程序员应当遵守下列约定:

(1) 在打开临时文件后立即对其执行“ unlink”操作。

(2) 应在“tmp”目录下创建临时文件。在文件名中包括进程标识数就可构成一惟一文件名

参考文献:《莱昂氏源代码分析》