Name | Modified | Size | Downloads / Week |
---|---|---|---|
Parent folder | |||
zenglOX_v1.5.0.zip | 2014-07-20 | 111.5 kB | |
readme.txt | 2014-07-20 | 8.5 kB | |
Totals: 2 Items | 119.9 kB | 0 |
zenglOX v1.5.0 zenglfs文件系统, MBR主引导记录, fdisk分区工具及format磁盘格式化工具, file文件目录读写工具等 >>> fdisk工具简介(源代码为build_initrd_img/fdisk.c文件): 我们可以使用类似fdisk -l 0的命令来查看0号ide硬盘里的分区信息, 原理就是通过读取该硬盘的0号扇区(也就是硬盘的第一个扇区, 也可以称之为MBR), 对MBR里的分区表进行分析,就可以显示出每个分区的信息了。 要设置分区的话,可以使用类似如下的命令: fdisk -hd 0 -pt 1 -type zenglfs -start 8 -num 123456 该命令表示将0号IDE硬盘的1号分区设置为zenglfs文件系统,该分区的 起始扇区号为8,分区拥有的扇区数为123456(相当于60M) 在执行该命令时,fdisk工具会检测你设置的信息是否有误, 比如当-num设置的扇区数超过磁盘的总扇区数时,等等。 如果参数没问题,在fdisk将分区信息写入到MBR后,通过fdisk -l 0就可以看到类似如下的输出 zenglOX> fdisk -l 0 [1] start LBA: 8 Total Sectors: 123456 [60M] filesystem: zenglfs [2] ............. [3] ............. [4] ............. 如果要删除1号分区,则可以使用类似如下的命令: fdisk -hd 0 -pt 1 -type 0 -start 0 -num 0 其实就是将相关信息设置为0,再使用fdisk -l 0就可以看到该分区被删除了 fdisk工具只是对MBR里的分区表进行写入操作,要使用该分区,还必须使用 format工具来格式化该分区,格式化好后,最后再通过mount工具加载分区 MBR的结构可以参考 http://wiki.osdev.org/MBR_%28x86%29 MBR里的分区表结构则可以参考 http://wiki.osdev.org/Partition_Table >>> format工具简介(源代码为build_initrd_img/format.c文件): 通过format工具可以对fdisk工具所分的区进行格式化操作, 可以使用类似如下的命令: format -hd 0 -pt 1 -type zenglfs 该命令表示将0号IDE硬盘的1号分区格式化为zenglfs文件系统 如果格式化成功,则可以使用format -l命令来查看格式化后的zenglfs文件系统的相关信息: zenglOX> format -l 0 1 super block info: .................. Group Info: .................. 如果不想显示Group Info信息,或者想控制Group Info所显示的Group信息数量, 则可以在末尾再添加一个数字,例如: format -l 0 1 0 最后一个0表示显示的Group信息数为0,即不显示Group Info信息。 >>> mount工具简介(源代码为build_initrd_img/mount.c文件) mount工具可以加载cdrom到iso目录,也可以将硬盘里格式化过的zenglfs分区给加载到hd目录, 当使用mount iso命令时,会通过syscall_mount_iso()系统调用将cdrom加载到iso目录 当使用类似 mount hd 0 1 命令时,则可以将0号IDE硬盘的1号分区给加载到hd目录 iso和hd是内核固定设置好的目录,目前不可以加载到其他的目录名上 >>> unmount工具简介(源代码为build_initrd_img/unmount.c文件): 使用unmount iso命令可以卸载iso目录 使用unmount hd命令可以卸载hd目录 >>> file工具简介(源代码为build_initrd_img/file.c文件): 当使用mount工具将硬盘分区挂载到hd目录后,就可以使用 file工具对hd目录进行读写文件或创建文件,创建子目录,删除文件, 删除子目录,重命名文件,重命名子目录的操作, 例如:file hd/hello命令表示在hd目录内创建一个空的hello文件 然后使用ls hd命令就可以在hd目录中查看到刚才创建的hello文件了, 通过ls hd/hello命令可以看到该hello文件的length尺寸为0, 通过file ata hd/ata2命令可以将ramdisk里的ata文件拷贝到hd目录内,同时, 在hd目录里的文件名为ata2,接着就可以通过hd/ata2命令来执行ata工具的操作了,如下所示: zenglOX> file ata hd/ata2 copy content of ata to hd/ata2 success zenglOX> hd/ata2 -s ata0-master(....) ...... ......................... zenglOX> 通过file -rm hd/ata2命令就可以将刚才创建的ata2文件给删除掉。 file工具里为了简化起见,目录是在创建文件时,一起被创建的, 在你自定义的程式里,也可以根据file里的原理来单独创建某目录。 例如 file ata hd/dir/ata命令表示将ata文件拷贝到hd目录里的dir目录内, 如果dir目录不存在,则会创建该目录。 使用-rm参数删除目录时,必须先将目录里的所有内容删除,再删除该目录, 当然在你自定义的程式里,也可以通过递归方法,让工具自动将目录里的文件删除,再将目录删除, file工具目前为了简化起见,并没有这么做。 通过file -rename hd/hello hello2命令可以将hd目录的hello文件重命名为hello2,如果 hello是一个目录的话,就将该目录重命名为hello2,如果重命名的名称里包含斜杠'/',则'/'会被zenglfs替换为下划线'_' 以上就是file工具的用法。 >>> zenglfs文件系统简介(源代码为zlox_zenglfs.c文件): zenglfs 文件系统是参考ext2文件系统的,ext2文件系统可以参考 http://wiki.osdev.org/Ext2 zenglfs去掉了ext2里的一些字段,同时调整了Group块组信息和位图信息 其结构中,第1部分是super block超级块,第2部分是Group组信息部分, 第3部分是block逻辑块的位图信息(位图里的二进制1表示已分配的逻辑块,二进制0表示未分配 的逻辑块),第4部分是文件节点的位图信息(位图里的二进制1表示已分配的文件节点,二进制0表示 未分配的文件节点),第5部分是文件节点数组,数组里的每一项都记录了一个文件节点的具体字段信息, 剩余的部分则都是用于存储文件或目录的内容的 文件系统里所使用的逻辑块都是1024字节的大小,相当于2个磁盘扇区的大小 super block超级块的逻辑块地址是1,0号逻辑块地址目前是预留的 另外,1号文件节点是root根目录文件节点,在format格式化时,会对其进行简单的设置 在mount工具挂载zenglfs文件系统时,会调用zenglfs模块(对应为zlox_zenglfs.c文件)里的zlox_mount_zenglfs函数来完成加载工作, 在file之类的工具对hd目录所在的zenglfs文件系统进行写目录操作时(比如创建子目录,或创建目录里的文件时), 会调用zenglfs模块的zlox_zenglfs_writedir函数, 在file之类的工具对hd目录进行读写文件的操作时, 会调用zenglfs模块的zlox_zenglfs_read或zlox_zenglfs_write函数, 当对hd目录进行列表或查找文件及子目录的操作时, 会调用zenglfs模块的zlox_zenglfs_readdir或zlox_zenglfs_finddir_ext函数, 当对hd目录进行删除文件或删除子目录的操作时, 会调用zenglfs模块的zlox_zenglfs_remove函数, 当对hd目录里的子文件或子目录进行重命名操作时, 会调用zenglfs模块的zlox_zenglfs_rename函数, 在unmount工具卸载zenglfs文件系统时,则会调用zenglfs模块的zlox_unmount_zenglfs函数。 在zenglfs模块的开头定义了类似zenglfs_cache_inode, zenglfs_cache_inode_blk, zenglfs_cache_group之类的缓存结构,定义这些结构是为了能缓存磁盘里的数据, 以减少频繁的磁盘I/O读写操作 在文件节点里有SinglyBlockAddr,DoublyBlockAddr,TriplyBlockAddr字段, 这些字段是对blockAddr字段的补充,这些字段参考自ext2文件系统, blockAddr[12]字段只能分配到12个逻辑块数据(相当于12KByte), SinglyBlockAddr对应的逻辑块里可以存储256个blockAddr(相当于256k的数据), DoublyBlockAddr的逻辑块里则可以存储256个SinglyBlock的逻辑块地址,这样就可以分配到 256 * 256k = 65536k = 64M的数据, TriplyBlockAddr对应的逻辑块里可以存储256个DoublyBlock的逻辑块地址,这样就可以分配到 256 * 256 * 256k = 16777216k = 16384M = 16G的数据 因此,理论上,这种结构的单个文件的最大尺寸是16G多, 当然还要看具体的读写操作的算法,目前的读写算法是先将要写入的数据全部缓存到内存, 再将内存里的数据写入磁盘,因此,zenglfs目前可写入文件的实际大小是受限于内存大小的。 如果将读写算法调整为每次只写入一部分数据,分批将数据写入到磁盘的话,就可以让文件 达到理论上的最大尺寸。 作者:zenglong 时间:2014年7月20日 官网:www.zengl.com