2009-07-30

今天把 emacs 从23.0.x升级到了23.1.x,另外把/tmp换成了tmpfs。我在想,除非你的机器上只有 zfs 一种文件系统,否则fstab还是很必要的。tmpfs、proc这些既然早已被linux用户习惯,必然有它们的优势。

tmpfs的出现,是否就意味着/etc/rc.d/tmp可以被干掉了呢?我还没有看过tmpfs的实现,不知道它与直接mount_md到/tmp,有什么区别。

以下是今天读ffs写下的一些笔记:

man fs说:

从 BBLOCK 开始,大小为 BBSIZE (单位是字节)的是disklabel以及引导程序。(我找不到BBLOCK这个宏的定义。)

按《Freebsd设计与实现》的8.9节中所说,ufs1中,BBSIZE的大小是8K。ufs2中,BBSIZE的大小可能是0,或者8K,或者64K,或者256K。
我只读的懂i386 的实现。它是这么做的:
在boot0的末尾,它调用bios的int 13h中断,使用42h或者20h从主分区的开始读一个扇区到内存,然后跳转到该位置开始执行。但是boot2的大小是7.5K,它是如何做完剩下的事情的呢?按《FreeBSD Architecture Handbook》的1.5所说,boot1是用于从floppy引导。我观察的结果是这样的:boot2是用btxld链接得到的。传递给btxld的-l参数的就是一个512字节的空文件(boot2.ldr),目的是预留512字节的空间用于存放disklabel,所以/boot/boot2的前512个字节是zero。用cat命令把boot1和boot2组合到一起得到/boot/boot,然后用bsdlabel -B 写入该主分区的开始。boot0最后读到的那512字节就是boot1。接着,boot1从这个主分区的开始读16个扇区(也就是8K)到内存中。这8K包含boot1,然后512字节的disklabel,然后是boot2真正的代码。
至于这512字节的disklabel数据如何解析,在/usr/src/sys/geom/geom_bsd_enc.c的bsd_disklabel_le_dec有详解。它的末尾包含一个分区表,指明了每个label对应的文件系统的开始扇区以及大小。
真正的文件系统是从SBLOCK开始。最前面是大小为SBLOCKSIZE的main superblock。(定义在ufs/ffs/fs.h的 struct fs )

fs.h中有这样一段宏,

#define SBLOCK_FLOPPY 0
#define SBLOCK_UFS1 8192
#define SBLOCK_UFS2 65536
#define SBLOCK_PIGGY 262144
#define SBLOCKSIZE 8192
#define SBLOCKSEARCH \
{ SBLOCK_UFS2, SBLOCK_UFS1, SBLOCK_FLOPPY, SBLOCK_PIGGY, -1 }
geom是根据这样的顺序寻找superblock的。
每个ffs文件系统由许多cylinder group组成。superblock描述了cylinder groups信息.每个cylinder group由inode和数据组成.
每个cylinder group的开头都有一份superblock的备份,所以称文件系统最开始的那个叫main superblock。据我的理解,每个cylinder group开头的那个superblock只是在执行newfs的时候被初始化,之后无论main superblock发生什么更改,其它的superblock不会随之变动。
在superblock中发现一个很有趣的magic number,19540119,这是谁的生日呢?

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥