《操作系统》课程设计说明书.docx
《《操作系统》课程设计说明书.docx》由会员分享,可在线阅读,更多相关《《操作系统》课程设计说明书.docx(24页珍藏版)》请在冰豆网上搜索。
《操作系统》课程设计说明书
河南城建学院
《操作系统》课程设计说明书
设计题目:
UNIX/Linux文件系统分析
专业:
计算机科学与技术
指导教师:
邵国金耿永军陈红军
班级:
0614082
学号:
061408261
姓名:
贠炳森
同组人:
叶矿辉、陈宇
计算机科学与工程系
2011年1月7日
前言
在现在计算机更新如此迅速的时代要学好计算机软件技术,特别是操作系统的学习,不仅要努力学好课本上的基础知识,还要经常在图书馆看些有关这方面的书籍,而更重要的是要有足够的实践经验,也要注重和同学的交流,经常尝试性的做些小的操作系统,对自己技术的提升会有很大的帮助。
同时,学习计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。
如何学习和掌握操作系统技术的原理与实际技巧呢?
除了听课和读书之外,最好的方法恐怕就是在实践中练习。
例如,自己设计一个小型操作系统,多使用操作系统,多阅读和分析操作源代码等。
但由于我们的条件和学时有限,在理论学习过程中没有给同学们提供更多的实验机会。
本操作系统课程设计,是给同学提供一个集中实验的机会。
希望同学们通过该设计加深对所学习课程的理解。
本设计是基于课程中学到的UNIX系统调用,使用操作系统环境是RedHatLinux9,言语开发环境是Linux的GNUC或C++。
我做的课程设计是:
Linux/Unix文件系统分析。
在Linux系统下,使用与文件相关的系统调用实现对物理设备文件的读写,参照Linux系统源代码以及Grub系统的源代码,对不同介质上的FAT格式文件系统进行分析。
要求在Linux环境下设计出C语言程序,实现以下功能:
1)分析UNIXSysV/Linux系统引导记录的作用;
2)分析UNIXSysV/Linux的超级块及其结构,并建立相关数据结构,通过编程实现UNIXSysV/Linux文件系统内各部分的定位。
3)至少要实现对给定i节点文件的只读访问
目录
一.系统环境5
1.1硬件环境5
1.2软件环境5
二.设计目的及要求5
三.总体设计7
四.详细设计8
五.调试与测试8
六.设计中遇到的问题及解决方法8
七.Linux/Unix文件系统分析源程序清单9
7.1头文件9
7.2示例程序12
八.运行结果及分析18
8.1linux文件系统读取18
8.2UNIX文件系统读取20
九.心得体会21
十.参考文献22
Linux/Unix文件系统分析
一.系统环境
1.1硬件环境
cpu为pentium4双线程技术,频率为2.8GHZ,内存为256MB。
1.2软件环境
使用操作系统环境是RedHatLinux9,言语开发环境是Linux的GNUC或C++。
二.设计目的及要求
1、设计目的
学习计算机软件技术,特别是计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。
如何学习和掌握操作系统技术的原理与实际技巧呢?
除了听课和读书之外,最好的方法恐怕就是在实践中练习。
例如,自己设计一个小型操作系统,多使用操作系统,多阅读和分析操作源代码等。
但由于条件和学时有限,在理论学习过程中没有给提供更多的实验机会。
本操作系统课程设计,是提供了一个集中实验的机会。
应该通过该设计加深对所学习课程的理解。
2、设计要求
按软件工程的思想和方法进行设计,并把它作为一个工程来做。
设计的每一步都有要形成文档,“成品”出来以后要有使用说明书和测试报告。
最后按院方统一要求整理出软件实习“论文”,并分别以电子和书面文档的形式上交。
最后,设计的程序要编译通过,并在验收时进行演示。
本设计的内容是基于《操作系统原理》教材的,但同学们必须对以前的《C语言程序设计》和《数据结构》等内容进行认真的复习。
本设计是基于课程中学到的UNIX系统调用,使用操作系统环境是RedHatLinux9,言语开发环境是Linux的GNUC或C++。
因此,要求课程设计者对Linux操作系统和GNUC或C++有一定的了解。
3、设计内容
在Linux系统下,使用与文件相关的系统调用实现对物理设备文件的读写,参照Linux系统源代码以及Grub系统的源代码,对不同介质上的FAT格式文件系统进行分析。
要求在Linux环境下设计出C语言程序,实现以下功能:
1)分析UNIXSysV/Linux系统引导记录的作用;
2)分析UNIXSysV/Linux的超级块及其结构,并建立相关数据结构,通过编程实现UNIXSysV/Linux文件系统内各部分的定位。
3)至少要实现对给定i节点文件的只读访问。
4)建议根据文件读取文件。
文件系统必须完成下列工作:
1)为了合理的存放文件,必须对磁盘等辅助空间(或称文件空间)进行统一管理。
在用户创新新文件时为其分配空闲区,而在用户删除或修改某个文件时,回收和调整存储区。
2)为了实现按名存取,需要有一个用户可见的文件逻辑结构,用户按照文件逻辑结构所给定的方式进行信息的存取和加工。
这种逻辑结构时独立于物理存储设备的。
3)为了便于存放和加工信息,文件在存储和设备上应按一定的顺序存放。
这种存放方式被称为文件物理结构。
4)完成对存放在存储设备上的文件信息的查找。
5)完成文件的共享和提供保护功能。
三.总体设计
四.详细设计
分析UNIXSysV/Linux系统引导记录的作用
UNIXSysV/Linux系统引导记录存放于整个硬盘的第一个扇区,即0柱面0磁头l扇区,也叫做MBR(MaserBootReoofd)扇区,即主引导记录。
主引导记录在计算机引导过程中起着举足轻重的作用,计算机在按下电源键以后,开始执行主板BI0S程序,进行完一系列检测和配置以后,开始按BI0S中设定的系统引导顺序引导系统。
BIOS执行完自己的程序后如何把执行投交给硬盘呢。
交给硬盘后叉执行存储在哪里的程序呢?
其实,称为MBR的扇区中的一段代码起着举足轻重的作用。
MBR不随操作系统的不同而小同,即不同的操作系统町能会存在相同的MBR.即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。
对文件系统的操作参看程序源代码。
实现对磁盘文件的访问,实现读写、查看文件系统的存取信息,对应各个i节点的相关信息,以及各个i节点的排列情况,使用户能清楚的看到文件系统磁盘结构。
更加了解计算机文件系统的工作流程。
五.调试与测试
(1)通过输入命令ccchengxu.c将文件编译为可执行文件a.out,通过输入命令./a.out加参数执行文件。
(2)判断命令行参数进行操作,当参数为./a.outus51k.img时进行Linux文件系统读取,当参数为../a.outxxenix.img时进行Unix文件系统读取。
(3)判断是否有第四个参数,若没有,则提示输入i节点号并实现对给定i节点文件的只读访问。
六.设计中遇到的问题及解决方法
在设计程序时。
我们按自己的理解编写了一个超级块和inode节点的结构体。
然后放在主程序中去读取信息,但是运行的结果大出我们的预料。
没有按我们的预期读出文件系统的信息,而是输出了一堆乱码,我们有经过查资料最后终于解决了问题,程序输出正常。
七.Linux/Unix文件系统分析源程序清单
7.1头文件
#include
typedef__s16s16;
typedef__u16u16;
typedef__s32s32;
typedef__u32u32;
typedefu16sysv_ino_t;
/*Blocknumbersare24bit,sometimesstoredin32bit.
OnCoherentFS,theyarealwaysstoredinPDP-11manner:
theleast
significant16bitscomelast.
*/
typedefu32sysv_zone_t;
/*Amongtheblocks...*/
/*XenixFS,CoherentFS:
block0isthebootblock,block1thesuper-block.
SystemVFS:
block0containsboththebootsectorandthesuper-block.*/
/*Thefirstinodezoneissb->sv_firstinodezone(1or2).*/
/*Amongtheinodes...*/
/*0isnon-existent*/
#defineSYSV_BADBL_INO1/*inodeofbadblocksfile*/
#defineSYSV_ROOT_INO2/*inodeofrootdirectory*/
/*Xenixsuper-blockdataondisk*/
#defineXENIX_NICINOD100/*numberofinodecacheentries*/
#defineXENIX_NICFREE100/*numberoffreeblocklistchunkentries*/
structxenix_super_block{
u16s_isize;/*indexoffirstdatazone*/
u32s_fsize;//__packed2__;/*totalnumberofzonesofthisfs*/
/*thestartofthefreeblocklist:
*/
u16s_nfree;/*numberoffreeblocksins_free,<=XENIX_NICFREE*/
u32s_free[XENIX_NICFREE];/*firstfreeblocklistchunk*/
/*thecacheoffreeinodes:
*/
u16s_ninode;/*numberoffreeinodesins_inode,<=XENIX_NICINOD*/
sysv_ino_ts_inode[XENIX_NICINOD];/*somefreeinodes*/
/*locks,notusedbyLinux:
*/
chars_flock;/*lockduringfreeblocklistmanipulation*/
chars_ilock;/*lockduringinodecachemanipulation*/
chars_fmod;/*super-blockmodifiedflag*/
chars_ronly;/*flagwhetherfsismountedread-only*/
u32s_time;//__packed2__;/*timeoflastsuperblockupdate*/
u32s_tfree;//__packed2__;/*totalnumberoffreezones*/
u16s_tinode;/*totalnumberoffreeinodes*/
s16s_dinfo[4];/*deviceinformation?
?
*/
chars_fname[6];/*filesystemvolumename*/
chars_fpack[6];/*filesystempackname*/
chars_clean;/*setto0x46whenfilesystemisproperlyunmounted*/
chars_fill[371];
s32s_magic;/*versionoffilesystem*/
s32s_type;/*typeoffilesystem:
1for512byteblocks
2for1024byteblocks
3for2048byteblocks*/
};
/*SystemVFScomesintwovariants:
*sysv2:
SystemVRelease2(e.g.Microport),structureelementsaligned
(2).
*sysv4:
SystemVRelease4(e.g.Consensys),structureelementsaligned(4).
*/
#defineSYSV_NICINOD100/*numberofinodecacheentries*/
#defineSYSV_NICFREE50/*numberoffreeblocklistchunkentries*/
/*SystemV4super-blockdataondisk*/
structsysv4_super_block{
u16s_isize;/*indexoffirstdatazone*/
u16s_pad0;
u32s_fsize;/*totalnumberofzonesofthisfs*/
/*thestartofthefreeblocklist:
*/
u16s_nfree;/*numberoffreeblocksins_free,<=SYSV_NICFREE*/
u16s_pad1;
u32s_free[SYSV_NICFREE];/*firstfreeblocklistchunk*/
/*thecacheoffreeinodes:
*/
u16s_ninode;/*numberoffreeinodesins_inode,<=SYSV_NICINOD*/
u16s_pad2;
sysv_ino_ts_inode[SYSV_NICINOD];/*somefreeinodes*/
/*locks,notusedbyLinux:
*/
chars_flock;/*lockduringfreeblocklistmanipulation*/
chars_ilock;/*lockduringinodecachemanipulation*/
chars_fmod;/*super-blockmodifiedflag*/
chars_ronly;/*flagwhetherfsismountedread-only*/
u32s_time;/*timeoflastsuperblockupdate*/
s16s_dinfo[4];/*deviceinformation?
?
*/
u32s_tfree;/*totalnumberoffreezones*/
u16s_tinode;/*totalnumberoffreeinodes*/
u16s_pad3;
chars_fname[6];/*filesystemvolumename*/
chars_fpack[6];/*filesystempackname*/
s32s_fill[12];
s32s_state;/*filesystemstate:
0x7c269d38-s_timemeansclean*/
s32s_magic;/*versionoffilesystem*/
s32s_type;/*typeoffilesystem:
1for512byteblocks
2for1024byteblocks*/
};
/*SystemV/Coherentinodedataondisk*/
structsysv_inode{
u16i_mode;
u16i_nlink;
u16i_uid;
u16i_gid;
u32i_size;
union{/*directories,regularfiles,...*/
unsignedchari_addb[3*(10+1+1+1)+1];/*zonenumbers:
max.10datablocks,
*then1indirectionblock,
*then1doubleindirectionblock,
*then1tripleindirectionblock.
*Thenmaybea"filegenerationnumber"?
?
*/
/*namedpipesonCoherent*/
struct{
charp_addp[30];
s16p_pnc;
s16p_prx;
s16p_pwx;
}i_p;
}i_a;
u32i_atime;/*timeoflastaccess*/
u32i_mtime;/*timeoflastmodification*/
u32i_ctime;/*timeofcreation*/
};
/*
*SystemV/V7/CoherentFSinodedatainmemory
*/
structsysv_inode_info{
u32i_data[10+1+1+1];/*zonenumbers:
max.10datablocks,
*then1indirectionblock,
*then1doubleindirectionblock,
*then1tripleindirectionblock.
*/
};
7.2示例程序
#include
#include
#include
#include
#include
#include"sysvfs.h"
#include
main(intargc,char**argv)
{
inti,j,k,typ,fd,L=5;
char*file_sys,*tmp,buff[1024],buff_i[1025];
structsysv4_super_block*sbu;
structxenix_super_block*sbx;
structsysv_inode*inode;
intinode_size,inode_no,blk_size;
inti_start,d_start;
longll;
ulongi_add[13];
if(argc<3){
fprintf(stderr,"Usage:
\n\t%argv[0]u|xfilesystem\n",argv[0]);
exit
(1);
}
switch(argv[1][0]){
case'U':
case'u':
typ=1;
break;
case'X':
case'x':
typ=2;
break;
default:
typ=0;
}
file_sys=argv[2];
if((fd=open(file_sys,O_RDONLY))==-1){
fprintf(stderr,"FileSystem'%s'OPENerror!
\a\n",file_sys);
exit
(2);
}
if(lseek(fd,typ*512,SEEK_SET)!
=typ*512){
fprintf(stderr,"FileSystem'%s'SEEKerror!
\a\n",file_sys);
close(fd);exit(3);
}
if(read(fd,buff,512*typ)!
=512*typ){
fprintf(stderr,"FileSystem'%s'READerror!
\a\n",file_sys);
close(fd);exit(4);
}
if(typ==1)gotounix_;
if(typ==2)gotoxenix_;
exit(100);
unix_:
sbu=(structsysv4_super_block*)buff;
printf("indexoffirstdatazone:
%x\n",sbu->s_isize);
printf("s_pad0:
%x\n",sbu->s_pad0);
printf("totalnumberofzonesofthisfs:
%x\n",sbu->s_fsize);
printf("/*thestartofthefreeblocklist:
*/\n");
printf("numberoffreeblocksins_free,<=SYSV_NICFREE:
%x\n",sbu->s_nfree);
printf("s_pad1:
%x\t%ud\n",sbu->s_pad1,sbu->s_pad1);
printf("/*thecacheoffreeinodes:
*/\n");
printf("numberoffreeinodesins_inode,<=SYSV_NICINOD:
%x\n",sbu->s_ninode);
printf("s_pad2:
%x\n",sbu->s_pad2);
printf("somefreeinodes:
\n");
printf("/*locks,notusedbyLinux:
*/\n");
printf("timeoflastsuperblockupdate:
%x\n",sbu->s_time);
printf("totalnumberoffreezones:
%x\n",sbu->s_tfree);
pri