1、操作系统课程设计说明书河南城建学院操作系统课程设计说明书 设计题目: UNIX/Linux文件系统分析 专 业: 计算机科学与技术 指导教师: 邵国金 耿永军 陈红军 班 级: 0614082 学 号: 061408261 姓 名: 贠炳森 同 组 人: 叶矿辉 、 陈 宇 计算机科学与工程系2011年1月 7日前 言在现在计算机更新如此迅速的时代要学好计算机软件技术,特别是操作系统的学习,不仅要努力学好课本上的基础知识,还要经常在图书馆看些有关这方面的书籍,而更重要的是要有足够的实践经验,也要注重和同学的交流,经常尝试性的做些小的操作系统,对自己技术的提升会有很大的帮助。同时,学习计算机操作
2、系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。如何学习和掌握操作系统技术的原理与实际技巧呢?除了听课和读书之外,最好的方法恐怕就是在实践中练习。例如,自己设计一个小型操作系统,多使用操作系统,多阅读和分析操作源代码等。但由于我们的条件和学时有限,在理论学习过程中没有给同学们提供更多的实验机会。本操作系统课程设计,是给同学提供一个集中实验的机会。希望同学们通过该设计加深对所学习课程的理解。本设计是基于课程中学到的UNIX系统调用,使用操作系统环境是Red Hat Linux 9,言语开发环境是Linux的GNU C或C+。我做的课程设计是:Linux/Unix文件系统分
3、析。在Linux系统下,使用与文件相关的系统调用实现对物理设备文件的读写,参照Linux系统源代码以及Grub系统的源代码,对不同介质上的FAT格式文件系统进行分析。要求在Linux环境下设计出C语言程序,实现以下功能:1) 分析UNIX SysV/Linux系统引导记录的作用;2) 分析UNIX SysV/Linux的超级块及其结构,并建立相关数据结构,通过编程实现UNIX SysV/Linux文件系统内各部分的定位。3) 至少要实现对给定i节点文件的只读访问目 录一系统环境 51.1硬件环境 51.2软件环境 5二设计目的及要求 5三总体设计 7四详细设计 8五调试与测试 8六设计中遇到的
4、问题及解决方法 8七Linux/Unix文件系统分析源程序清单 97.1 头文件 97.2 示例程序 12八运行结果及分析 188.1 linux文件系统读取 188.2 UNIX文件系统读取 20九心得体会 21十参考文献 22Linux/Unix文件系统分析一系统环境1.1硬件环境cpu为pentium4双线程技术,频率为2.8GHZ,内存为256MB。1.2软件环境使用操作系统环境是Red Hat Linux 9,言语开发环境是Linux的 GNU C或C+。二设计目的及要求1、设计目的学习计算机软件技术,特别是计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计
5、技巧。如何学习和掌握操作系统技术的原理与实际技巧呢?除了听课和读书之外,最好的方法恐怕就是在实践中练习。例如,自己设计一个小型操作系统,多使用操作系统,多阅读和分析操作源代码等。但由于条件和学时有限,在理论学习过程中没有给提供更多的实验机会。本操作系统课程设计,是提供了一个集中实验的机会。应该通过该设计加深对所学习课程的理解。2、设计要求按软件工程的思想和方法进行设计,并把它作为一个工程来做。设计的每一步都有要形成文档,“成品”出来以后要有使用说明书和测试报告。最后按院方统一要求整理出软件实习“论文”,并分别以电子和书面文档的形式上交。最后,设计的程序要编译通过,并在验收时进行演示。本设计的内
6、容是基于操作系统原理教材的,但同学们必须对以前的C语言程序设计和数据结构等内容进行认真的复习。本设计是基于课程中学到的UNIX系统调用,使用操作系统环境是Red Hat Linux 9,言语开发环境是Linux的GNU C或C+。因此,要求课程设计者对Linux操作系统和GNU C或C+有一定的了解。3、设计内容在Linux系统下,使用与文件相关的系统调用实现对物理设备文件的读写,参照Linux系统源代码以及Grub系统的源代码,对不同介质上的FAT格式文件系统进行分析。要求在Linux环境下设计出C语言程序,实现以下功能:1)分析UNIX SysV/Linux系统引导记录的作用;2)分析UN
7、IX SysV/Linux的超级块及其结构,并建立相关数据结构,通过编程实现UNIX SysV/Linux文件系统内各部分的定位。3)至少要实现对给定i节点文件的只读访问。4)建议根据文件读取文件。文件系统必须完成下列工作:1) 为了合理的存放文件,必须对磁盘等辅助空间(或称文件空间)进行统一管理。在用户创新新文件时为其分配空闲区,而在用户删除或修改某个文件时,回收和调整存储区。2) 为了实现按名存取,需要有一个用户可见的文件逻辑结构,用户按照文件逻辑结构所给定的方式进行信息的存取和加工。这种逻辑结构时独立于物理存储设备的。3) 为了便于存放和加工信息,文件在存储和设备上应按一定的顺序存放。这
8、种存放方式被称为文件物理结构。4) 完成对存放在存储设备上的文件信息的查找。5) 完成文件的共享和提供保护功能。三总体设计 四详细设计分析UNIX SysV/Linux系统引导记录的作用 UNIX SysV/Linux系统引导记录存放于整个硬盘的第一个扇区,即0柱面0磁头l扇区,也叫做MBR(MaserBoot Reoofd)扇区,即主引导记录。 主引导记录在计算机引导过程中起着举足轻重的作用,计算机在按下电源键以后,开始执行主板BI0S程序,进行完一系列检测和配置以后,开始按BI0S中设定的系统引导顺序引导系统。BIOS执行完自己的程序后如何把执行投交给硬盘呢。交给硬盘后叉执行存储在哪里的程
9、序呢?其实,称为MBR的扇区中的一段代码起着举足轻重的作用。 MBR不随操作系统的不同而小同,即不同的操作系统町能会存在相同的MBR即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。对文件系统的操作参看程序源代码。 实现对磁盘文件的访问,实现读写、查看文件系统的存取信息,对应各个i节点的相关信息,以及各个i节点的排列情况,使用户能清楚的看到文件系统磁盘结构。更加了解计算机文件系统的工作流程。五调试与测试(1)通过输入命令cc chengxu.c将文件编译为可执行文件a.out,通过输入命令./a.out加参数执行文件。(2)判断命令行参数进行操作,当参数为./a.out u s51
10、k .img时进行Linux文件系统读取,当参数为./a.out x xenix.img时进行Unix文件系统读取。(3)判断是否有第四个参数,若没有,则提示输入i节点号并实现对给定i节点文件的只读访问。六设计中遇到的问题及解决方法在设计程序时。我们按自己的理解编写了一个超级块和inode节点的结构体。然后放在主程序中去读取信息,但是运行的结果大出我们的预料。没有按我们的预期读出文件系统的信息,而是输出了一堆乱码,我们有经过查资料最后终于解决了问题,程序输出正常。 七Linux/Unix文件系统分析源程序清单7.1 头文件#include typedef _s16 s16;typedef _u
11、16 u16;typedef _s32 s32;typedef _u32 u32;typedef u16 sysv_ino_t;/* Block numbers are 24 bit, sometimes stored in 32 bit. On Coherent FS, they are always stored in PDP-11 manner: the least significant 16 bits come last.*/typedef u32 sysv_zone_t;/* Among the blocks . */* Xenix FS, Coherent FS: block 0
12、 is the boot block, block 1 the super-block. SystemV FS: block 0 contains both the boot sector and the super-block. */* The first inode zone is sb-sv_firstinodezone (1 or 2). */* Among the inodes . */* 0 is non-existent */#define SYSV_BADBL_INO 1 /* inode of bad blocks file */#define SYSV_ROOT_INO 2
13、 /* inode of root directory */* Xenix super-block data on disk */#define XENIX_NICINOD 100 /* number of inode cache entries */#define XENIX_NICFREE 100 /* number of free block list chunk entries */struct xenix_super_block u16 s_isize; /* index of first data zone */ u32 s_fsize;/ _packed2_; /* total
14、number of zones of this fs */ /* the start of the free block list: */ u16 s_nfree;/* number of free blocks in s_free, = XENIX_NICFREE */ u32 s_freeXENIX_NICFREE; /* first free block list chunk */ /* the cache of free inodes: */ u16 s_ninode; /* number of free inodes in s_inode, = XENIX_NICINOD */ sy
15、sv_ino_t s_inodeXENIX_NICINOD; /* some free inodes */ /* locks, not used by Linux: */ char s_flock;/* lock during free block list manipulation */ char s_ilock;/* lock during inode cache manipulation */ char s_fmod; /* super-block modified flag */ char s_ronly;/* flag whether fs is mounted read-only
16、*/ u32 s_time;/_packed2_;/*time of last super block update*/ u32 s_tfree;/ _packed2_; /* total number of free zones */ u16 s_tinode; /* total number of free inodes */ s16 s_dinfo4; /* device information ? */ char s_fname6; /* file system volume name */ char s_fpack6; /* file system pack name */ char
17、 s_clean; /* set to 0x46 when filesystem is properly unmounted */ char s_fill371; s32 s_magic; /* version of file system */ s32 s_type; /* type of file system: 1 for 512 byte blocks 2 for 1024 byte blocks 3 for 2048 byte blocks */;/* SystemV FS comes in two variants: * sysv2: System V Release 2 (e.g
18、. Microport), structure elements aligned(2). * sysv4: System V Release 4 (e.g. Consensys), structure elements aligned(4). */#define SYSV_NICINOD 100 /* number of inode cache entries */#define SYSV_NICFREE 50 /* number of free block list chunk entries */* SystemV4 super-block data on disk */struct sy
19、sv4_super_block u16 s_isize; /* index of first data zone */ u16 s_pad0; u32 s_fsize; /* total number of zones of this fs */ /* the start of the free block list: */ u16 s_nfree;/* number of free blocks in s_free, = SYSV_NICFREE */ u16 s_pad1; u32 s_freeSYSV_NICFREE; /* first free block list chunk */
20、/* the cache of free inodes: */ u16 s_ninode;/* number of free inodes in s_inode, = SYSV_NICINOD */ u16 s_pad2; sysv_ino_t s_inodeSYSV_NICINOD; /* some free inodes */ /* locks, not used by Linux: */ char s_flock; /* lock during free block list manipulation */ char s_ilock; /* lock during inode cache
21、 manipulation */ char s_fmod; /* super-block modified flag */ char s_ronly; /* flag whether fs is mounted read-only */ u32 s_time; /* time of last super block update */ s16 s_dinfo4; /* device information ? */ u32 s_tfree; /* total number of free zones */ u16 s_tinode; /* total number of free inodes
22、 */ u16 s_pad3; char s_fname6; /* file system volume name */ char s_fpack6; /* file system pack name */ s32 s_fill12; s32 s_state;/* file system state: 0x7c269d38-s_time means clean */ s32 s_magic; /* version of file system */ s32 s_type; /* type of file system: 1 for 512 byte blocks 2 for 1024 byte
23、 blocks */;/* SystemV/Coherent inode data on disk */struct sysv_inode u16 i_mode; u16 i_nlink; u16 i_uid; u16 i_gid; u32 i_size; union /* directories, regular files, . */ unsigned char i_addb3*(10+1+1+1)+1; /* zone numbers: max. 10 data blocks, * then 1 indirection block, * then 1 double indirection
24、 block, * then 1 triple indirection block. * Then maybe a file generation number ? */ /* named pipes on Coherent */ struct char p_addp30; s16 p_pnc; s16 p_prx; s16 p_pwx; i_p; i_a; u32 i_atime; /* time of last access */ u32 i_mtime; /* time of last modification */ u32 i_ctime; /* time of creation */
25、;/* * SystemV/V7/Coherent FS inode data in memory */struct sysv_inode_info u32 i_data10+1+1+1; /* zone numbers: max. 10 data blocks, * then 1 indirection block, * then 1 double indirection block, * then 1 triple indirection block. */;7.2 示例程序#include #include #include #include #include #include sysv
26、fs.h#include main(int argc, char *argv) int i,j,k,typ,fd,L=5; char *file_sys,*tmp,buff1024,buff_i1025; struct sysv4_super_block *sbu; struct xenix_super_block *sbx; struct sysv_inode *inode; int inode_size, inode_no,blk_size; int i_start,d_start; long ll; ulong i_add13; if(argcs_isize); printf(s_pad
27、0:%xn, sbu-s_pad0); printf(total number of zones of this fs:%xn,sbu-s_fsize); printf(/* the start of the free block list: */n); printf(number of free blocks in s_free, s_nfree); printf(s_pad1:%xt%udn, sbu-s_pad1, sbu-s_pad1); printf(/* the cache of free inodes: */n); printf(number of free inodes in s_inode, s_ninode); printf(s_pad2:%xn ,sbu-s_pad2); printf(some free inodes:n); printf(/* locks, not used by Linux: */n); printf(time of last super block update:%xn ,sbu-s_time); printf(total number of free zones:%xn ,sbu-s_tfree); pri
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1