Download Latest Version zenglOX.iso (5.1 MB)
Email in envelope

Get an email when there's a new version of zenglox

Home / zenglOX_v1.5.0
Name Modified Size InfoDownloads / 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
Source: readme.txt, updated 2014-07-20