欢迎来到天天文库
浏览记录
ID:37846260
大小:940.52 KB
页数:24页
时间:2019-06-01
《jos实验5实验记录》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、JOS实验五实验记录作者:卓达城邮箱:zhuodc@qq.com(wflfjand1874)开始本实验之前请使用svn把代码合并。本实验编程技巧不多,不想lab4,用了很多很多技巧,好像是在卖弄什么似的,但是代码量大和逻辑复杂,总的来说分成四大块,分别是服务器模块,用户模块还有底层模块和通讯模块。以下先按照底层模块,服务器模块(包含通讯模块),用户模块(包含通讯模块),四个模块如何合作的顺序详细叙述。底层模块(fs.c)磁盘结构:Directoryorfilebitmapsuper1super0super0这里我们不用管,是bootloa
2、der。super1记录着磁盘的基本信息(魔数和总块数)和根目录文件。bitmap记录这那些块可用那些不可用(已用或者未用)。File结构可以表示文件或者目录,在jos里面目录是记录文件和目录信息的文件。如果一个文件是目录的话,那么这个文件里面记录的是File结构数组。文件系统里面有两个概念,一个是实际块号,一个是文件块号,实际块号就是块在磁盘的位置,也可以在服务器进程中转化为虚拟地址。文件块号是相对文件而言的,文件的第一块块号为0磁盘File结构解释:File这个里面又放着1024个块号,其中前10个没有用。一个block是4k,一个文
3、件最大可以放1024个block,所以一个文件最大是4M........direct0namedirect1direct2...........direct2...........indirect...........。。如果文件的大小小于10个block,那么文件块号就放在direct记录的块里面,如果文件大于10个block,那么文件的10个块以上的文件块号就放在indirect里面,indirectblock是指向一个块的,块里面放在块号的信息,这里要注意的是indirectblock块的前十个块号是没有用的,为什么作者要这样做,这
4、是因为要保证文件最大是4M,jos文件最大只能是4M。服务器模块:先看线性地址(虚拟地址)的分布情况0xffffffffopentab是一个OpenFile数组,具体在内存那个位置不知道,由编译器决定,编译器应该足够聪明不至于让它跟上面提到的地方重复了。堆栈等其它信息0xf0000000KERNBASE0.5G4K4K............opentab[i].o_fd0xD0000000(FILEVA)这里为何要4k一个呢?原因很简单,因为这里要用作页映射,是进程通信需要的。bitmap这一段是用来映射3G磁盘的,每从磁盘读一块磁盘块
5、,服务器进程就会把它映射到这一段空间中。(4K为单位)然后映射给用户模块。superbootloaderblock2对应的地址(4K)block1对应的地址(4K)block0对应的地址(4K)4k0x10000000(DISKMAP)这里是用来接收客户端进程发来的请求的0x0ffff000(REQVA)0x00000000这里最关键的结构式OpenFile结构其中o_file是用来操作底层文件系统的,o_fd是用来传到客户进程的,客户进程根据o_fd的信息操作文件。这段代码就是把o_fd映射到FILEVA以上的地址,以便进程之间的通讯,
6、具体见服务器模块的图。用户模块:0xffffffff线性地址(物理地址)其它信息0xf0000000KERNBASE这里是用来存储映射过来的文件的,每个文件最大为4M。(就是映射地址)一共4M*32=128M4M4M..0xD000000FILEBASE.........这里是用来存储Fd结构的。这里一开始没有分配地址空间,只是在用的时候才分配。通过使用检查页表是否存在的方式判断是否被分配或者使用。4K4M4K4KFDTABLE0x0000000这里最关键的结构式Fd用户进程通过Fd保存的信息实现相关的文件操作。(例如dev是保存相关操作
7、函数的指针)通信模块:在inc/fs.h中定义了一些通信的数据结构。通过这些数据结构,服务器进程对底层文件系统进行相应的操作。发送函数如下:第一个参数是操作类型,第二个是要传递的参数,第三个就是fd(服务器进程把openfile的o_fd映射到这里),第四个就是权限。四个模块的合作大体上是:用户需要文件操作--->用户进程向服务器进程发出请求--->服务器进程操作底层文件模块--->服务器进程向用户进程发出已经完成操作的信息,并把相关信息传递回去--->用户进程获得相关文件。底层文件用file结构操作,用户用fd结构,服务器用OpenFi
8、le把两者联系起来。先从客户端进程开始(icode)客户端:第一个函数(icode.c)这个函数的作用就是打开一个文件并获得句柄。(file.c)分配一个句柄(fsip.c)方框里面的内容是设
此文档下载收益归作者所有