基于Linux内核编程的实验报告(Linux内核分析实验报告).doc_第1页
基于Linux内核编程的实验报告(Linux内核分析实验报告).doc_第2页
基于Linux内核编程的实验报告(Linux内核分析实验报告).doc_第3页
基于Linux内核编程的实验报告(Linux内核分析实验报告).doc_第4页
基于Linux内核编程的实验报告(Linux内核分析实验报告).doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux内核分析实验报告实验题目: 文件系统实验实验目的: linux文件系统使用虚拟文件系统VFS作为内核文件子系统。可以安装多种不同形式的文件系统在其中共存并协同工作。VFS对用户提供了统一的文件访问接口。本实验的要求是(1) 编写一个 get_FAT_boot 函数,通过系统调用或动态模块调用它可以提取和显示出 FAT 文件系统盘的引导扇区信息。这些信息的格式定义在内核文件的fat_boot_sector 结构体中。函数可通过系统调用或动态模块调用。(2) 编写一个 get_FAT_dir 函数,通过系统调用或动态模块调用它可以返回 FAT 文件系统的当前目录表,从中找出和统计空闲的目录项(文件名以 0X00 打头的为从未使用过目录项,以0XE5 打头的为已删除的目录项),将这些空闲的目录项集中调整到目录表的前部。这些信息的格式定义在内核文件的 msdos_dir_entry 结构体中。硬件环境:内存1G以上软件环境:Linux(Ubuntu) 2-6实验步骤: 一:实验原理: 以实验4 为蓝本,在优盘中编译并加载模块,启动测试程序,查看/proc/mydir/myfile的文件内容。从优盘得到fat文件系统的内容存在msdos_sb_info结构中,然后得到msdos_sb_info结构相应的属性值,得到实验一的数据。实验二中,得到fat文件系统第一个扇区的十六个文件信息。然后按照文件名头文字的比较方法,应用归并排序的方法,将头文件是0X00和0XE5的文件调到前面,其他的文件调到后面 二:主要数据结构说明:(1) 超级块对象: 数据结构说明: 一个已经安装的文件系统的安装点由超级块对象代表。struct super_block . const struct super_operations *s_op; (2) 索引i节点对象数据结构说明: 索引 i 节点对象包含了内核要操作的文件的全部控制信息,对应着打开文件的 i 节点表。struct inode const struct inode_operations *i_op; .(3) 目录项对象数据结构说明: 录项对象代表了文件路径名的各个部分,目录文件名和普通文件名都属于目录项对象。struct dentry . struct dentry_operations *d_op; .(4) 文件对象 数据结构说明:文件对象表示已经打开的文件,它是直接连系用户应用程序的内核对象。struct file . struct file_operations *f_op; . 三:函数说明:系统函数:container_of()sb_bread()自定义函数:get_FAT_dir()函数:首先输出16个文件的文件名,然后176191行使用归并排序,设定两个指针,一个从指向0位置,一个指向15位置。分别向后,向前查找出第一个文件头名不是0X00或者0XE5的文件和第一个文件头文字是二者的文件名,如果向后的指针一直位于向前的指针前面,就进行二者的调换,在总的循环中,如果向后的指针超过了向前的指针,则停止循环。最后输出重新排序的文件名 五:结果检测: the file system is:PWD Filesystem Type is : vfatPWD = 512 -FAT-info:引导扇区信息:每簇扇数=8簇位数=c簇大小4096FAT位数=32FAT开始扇=414FAT长度=7985目录开始扇=16384目录入口0数据开始扇16384最大簇号=1021954根开始扇=2fs信息扇=1-目录文件名:-before change file name is-KEJIAN v- - file name is-1 - - file name is-CHAPTE1PPT - - file name is-t|- - file name is-T- - file name is- -have such files file name is- -have such files file name is- - file name is- -have such files file name is- - file name is- - file name is-L- - file name is-JJJJpJ- - file name is-&- -have such files file name is- - file name is-%xx- -after change: fine name is-KEJIAN v- fine name is-1 - fine name is-CHAPTE1PPT - fine name is-t|- fine name is-T- fine name is- fine name is- fine name is- fine name is- fine name is- fine name is- fine name is-L- fine name is-JJJJpJ- fine name is-&- fine name is- fine name is-%xx-(优盘中文件较多,排序结构不是很明显,但算法正确) 结论分析与体会:文件系统是计算机介质存储的重要方式。尤其是VFS文件系统可以提供不同文件系统的接口,方便了对文件的统一管理。将来我们也可以试着写自己的文件系统。 附 :程序源代码/* main.c - description begin : 4 4 21:01:11 CST 2003 copyright : (C) 2003 by 寮犻缚鐑? Function : 缂栧啓鍒涘缓proc鏂囦欢绯荤粺鐨勬鍧?璇搴忓垱寤哄湪/proc鐩綍涓? : 鍒涘缓mydir鐩綍, 鍦ydir鐩綍涓嬪垱寤轰繚瀛樺綋鍓嶇殑绯荤粺鏃堕棿 jiffies鍊肩殑鏂囦欢 myfile, */ /*#include #include #include #include #include #include #include #include #include #include #include #include */#include #include #include #include #include #include #include #include /#include #include /#include #include #include #include #include #include #include /#include #include fat.h#define MODULE_NAME Myproc #define MYDATA_LEN 16384/2 / 鏀剧敤鎴风闂翠紶鍏殑鏁版嵁struct my_proc_data char valueMYDATA_LEN; ; struct my_proc_data mydata; struct task_struct *task;int count;static struct proc_dir_entry *example_dir; static struct proc_dir_entry *date_file;static int param; char temp15;module_param(param, int , 0644); /璇绘枃浠秏yfile 鐨勮椹卞姩鍑芥暟static int proc_read(char *page, char *start,off_t off,int count,int *eof,void *data ) int len=0; struct my_proc_data *mydatap = (struct my_proc_data *) data; len+=sprintf(page,%s%ldn,mydatap-value,jiffies); /灏嗗瓧绗覆鏍煎紡鍖? /鍙互鐩存帴浣跨敤鍐呮牳鍙橀噺 return len; /鍐欐枃浠秏yfile鐨勫啓椹卞姩鍑芥暟 ,鎶妋ydata鐨勬暟鍊煎啓鍒版枃浠朵腑static int proc_write(struct file *file,const char *buffer,unsigned long count,void *data) /file鐩存帴灏辨槸myfile?buffer鎸囧悜鐨勬槸鐢埛绌洪棿鐨勪粈涔堟暟鎹紵 int len ; struct my_proc_data *mydatap = (struct my_proc_data *) data; if(countMYDATA_LEN) len = MYDATA_LEN; else len = count; /闀垮害鏈澶槸16 if(copy_from_user(mydatap-value,buffer,len) /鎶奲uffer(鐢埛绌洪棿)涓殑鏁版嵁鍐欓亾mapdatap(鍐呮牳绌洪棿)鐨刣ata缁撴瀯涓幓 return -EFAULT; /鏁版嵁宸茬粡瀛樺湪mydata缁撴瀯褰撲腑浜? mydatap-valuelen-1 = 0; return len; int get_file_info(char * filesystem_type, unsigned long blk_size) return 0;/ 瑁呭叆妯潡int init_module(void) example_dir = (struct proc_dir_entry * )proc_mkdir(mydir,0); /在/proc目录下建立 if(example_dir = 0) printk(mkdir failn); return -1; /创建/proc/mydir/myfile文件 date_file=(struct proc_dir_entry *)create_proc_entry(myfile,0666,example_dir); if(date_file = 0) remove_proc_entry(myfile,0); printk(mkfile failn); return -ENOMEM; strcpy(mydata.value,the file system is:n); /-teachers example struct fs_struct *fs ; struct vfsmount *mnt ; struct super_block *mnt_sb ; struct file_system_type *s_type; struct dentry *cpwd; struct inode *ci; struct msdos_sb_info * dos_sb; struct fat_boot_sector *fbs; / struct msdos_sb_info * dos_sb; struct msdos_dir_entry *dos_de; struct msdos_inode_info *dos_si;/- struct fat_slot_info *sinfo; /struct fat_boot_sector *fbs; struct buffer_head *bh=NULL; read_lock(¤t-fs-lock); fs = current-fs; mnt = (&fs-pwd)-mnt; mnt_sb = mnt- mnt_sb ; s_type = mnt_sb - s_type; printk(PWD Filesystem Type is : %sn,s_type-name); printk(PWD= %ldn,mnt_sb-s_blocksize); sprintf(mydata.value,%sPWD Filesystem Type is : %snPWD = %d -n,mydata.value,s_type-name,mnt_sb-s_blocksize); sprintf(mydata.value,%s-FAT-info:n,mydata.value); read_unlock(¤t-fs-lock); if(*s_type-name = v) dos_sb = (struct msdos_sb_info *)mnt_sb-s_fs_info; sprintf(mydata.value,%s引导扇区信息:n,mydata.value); sprintf(mydata.value,%s每簇扇数=%dn,mydata.value,dos_sb-sec_per_clus); sprintf(mydata.value,%s簇位数=%xn,mydata.value,dos_sb-cluster_bits); sprintf(mydata.value,%s簇大小%dn,mydata.value,dos_sb-cluster_size); sprintf(mydata.value,%sFAT位数=%dn,mydata.value,dos_sb-fat_bits); / sprintf(mydata.value,%sFAT开始扇=%dn,mydata.value,dos_sb-fat_start); sprintf(mydata.value,%sFAT长度=%ldn,mydata.value,dos_sb-fat_length); sprintf(mydata.value,%s目录开始扇=%ldn,mydata.value,dos_sb-dir_start); sprintf(mydata.value,%s目录入口%dn,mydata.value,dos_sb-dir_entries); sprintf(mydata.value,%s数据开始扇%ldn,mydata.value,dos_sb-data_start); sprintf(mydata.value,%s最大簇号=%ldn,mydata.value,dos_sb-max_cluster); sprintf(mydata.value,%s根开始扇=%ldn,mydata.value,dos_sb-root_cluster); sprintf(mydata.value,%sfs信息扇=%ldn,mydata.value,dos_sb-fsinfo_sector); /- /- dos_si = container_of(ci, struct msdos_inode_info, vfs_inode);fbs = (struct fat_boot_sector *)(bh-b_data);sprintf(mydata.value,%s-目录文件名:n,mydata.value); bh = sb_bread(mnt_sb, dos_sb-dir_start);if (bh = NULL) printk(KERN_ERR FAT: Directory bread(block %llu) failedn,dos_sb-dir_entries); dos_de = (struct msdos_dir_entry *)(bh-b_data); sprintf(mydata.value,%s-before changen,mydata.value); int i;i=0; char *name; do name=(dos_de+ i*sizeof(struct msdos_dir_entry)-name;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论