文件系统ls实现与内核编码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文件系统ls实现与内核编码
一. 设计目的
操作系统是控制和管理计算机硬件和软件资源的虚拟机,其中的文件系统是对软件和设备进行管理的系统,文件系统是操作系统中非常重要的一个模块,它的实现占用了操作系统源码的最大编码量,其好坏也直接影响着用户对操作系统的感受程度。通过对操作系统课程设计的实践,进一步加深对文件系统的认识和理解,并在此基础上培养学生的工程应用能力。实验分别从用户态和内核态两个层实践文件系统的部分功能。
二. 设计内容
1.使用Linux编程实现用户态下带参数的ls命令功能
ls命令支持以下功能:
①支持 -l 参数;
②输出结果按字典排序;
③列出“.”文件,支持-a参数,在没有-a时候不显示隐藏文件;
④显示记录总数;
⑤支持对给定的目录进行操作,如 ls /tmp;
⑥正确显示文件特殊属性suid、sgid和stick y;
⑦支持-u参数,它会显示出文件的最后访问时间;
⑧当关掉一个文件的读权限,就不能打开这个文件来读。如果从一个终端登录,打开一个文件,保持文件的打开状态,然后从另外的终端登录,去掉文件的读权限,看会出现什么情况。编写一个程序,先用open()打开一个文件,用read()读一些内容,调用sleep()等待20s 以后,再读一些内容,从另外的终端,再等待的20s内去掉文件的读权限,这样会有什么结果?
2.编写内核模块显示目录或文件的信息。
⑪调试《Linux操作系统原理与应用》第8章文件系统P215 的例子
⑫给内核模块传入参数path,其中path为绝对路径
①当path为目录时,显示目录对应的dentrey结构中的相关信息(可打印的信息);
②当path为文件时,显示文件对应的indoe结构中的相关信息(可打印的信息);
③当路径错误时,有错误提示信息。三.概要设计
1.功能模块图;
⑪实现ls命令功能
⑫编写内核模块
①编写内核模块,打印super_block结构中一些域的值。(课本上的例子)
②给内核模块传入参数path,其中path为绝对路径
2.各个模块详细的功能描述。
⑪实现ls命令功能
①ls -l:每个文件单独占一行,显示文件的详细属性信息
②ls -a:显示包括隐藏文件在内的所有文件
③ls -u:显示出文件的最后访问时间
④ls:显示的文件名按字典顺序排序
⑤ls /指定目录:显示当前目录下的内容
⑥ls -lu:每个文件单独占一行,显示文件的详细属性信息,并且显示出文件的最后访问时间
⑦ls -la:显示包括隐藏文件在内的所有文件的详细属性信息
⑧ls -lua:显示包括隐藏文件在内的所有文件的详细属性信息,并且显示出文件的最后访问时间
⑨chmod 权限文件名:修改文件的权限,并且显示出此文件是否受suid,sgid和sticky的控制
⑩chmod 权限(3位) 在一终端运行程序,读取文件信息,在另一终端修改文件权限,看结果。
⑫编写内核模块
①编写内核模块,打印super_block结构中一些域的值。(课本上的例子)
遍历系统中的超级块:list_head结构类型的字段名称为s_list。list_entry宏通过指向list_head 节点的地址来得到外部超级块的首地址。获取系统中个超级块的地址,获得某个子进程的地址,打印文件系统所在的主设备号和次设备号和文件系统名。遍历打印每个超级块中的所有索引节点号,打印索引结点。
②给内核模块传入参数path,其中path为绝对路径
path=路径时,显示如下信息:
●目录项标志
●哈希表
●短目录名
●目录项长度
●目录项名
●目录项计数器的引用
path=文件时,显示如下信息:
●文件索引节点的数量
●文件类型和权限
●用户ID
●用户组ID
●指定文件系统的读写访问标志
●文件大小
●索引节点的状态
●硬链接数
●引用记数
●文件的块数
●版本号
●以位为单位的块大小
错误信息显示:Open file failed
四.详细设计
1.功能函数的调用关系图
⑪ls 命令
①错误处理函数,打印出错误所在行的行数和错误信息 void my_error(const char *error_string, int line); ②获取文件属性
void show_file_attribute(struct stat buf,char *file_name,int flag_u) ③输出文件的文件名,若命令中
没有-l 选项,则输出文件时要保证上下
对齐 void show_file_columns(char *file_name) ④根据命令行参数(存放在flag 中)和完整路径名(存放在pathname 中)显示目标文件 void show_file(int flag,char *pathname) ⑤为显示某个目录下的文件做准备,path:要显示的目录 void show_file_dir(int flag_param,char *path)
⑫编写内核模块
①编写内核模块,打印super_block 结构中一些域的值。(课本上的例子)
②给内核模块传入参数path,其中path为绝对路径
2.各功能函数的数据流程图
void show_file_dir(int flag_param,char *path)
⑫编写内核模块
①编写内核模块,打印super_block结构中一些域的值。(课本上的例子)