8.7 代码:块分配器
文件和目录内容存储在磁盘块中,磁盘块必须从空闲池中分配。xv6的块分配器在磁盘上维护一个空闲位图,每一位代表一个块。0表示对应的块是空闲的;1表示它正在使用中。程序mkfs
设置对应于引导扇区、超级块、日志块、inode块和位图块的比特位。
块分配器提供两个功能:balloc
分配一个新的磁盘块,bfree
释放一个块。Balloc
中位于kernel/fs.c:71的循环从块0到sb.size
(文件系统中的块数)遍历每个块。它查找位图中位为零的空闲块。如果balloc
找到这样一个块,它将更新位图并返回该块。为了提高效率,循环被分成两部分。外部循环读取位图中的每个块。内部循环检查单个位图块中的所有BPB位。由于任何一个位图块在buffer cache中一次只允许一个进程使用,因此,如果两个进程同时尝试分配一个块,可能会发生争用。
Bfree
(kernel/fs.c:90)找到正确的位图块并清除正确的位。同样,bread
和brelse
隐含的独占使用避免了显式锁定的需要。
与本章其余部分描述的大部分代码一样,必须在事务内部调用balloc
和bfree
。