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”目录下创建临时文件。在文件名中包括进程标识数就可构成一惟一文件名
参考文献:《莱昂氏源代码分析》
相关推荐: