最近,笔者当然还是在努力写系统,并且在笔者的“滋润”下,我们的cunix
系统已经有一个操作系统的样子了。大家可以看看https://github.com/pengruiyang-cpu/cunix.git,gitee上也有,https://gitee.com/pengruiyang-cpu/cunix.git,有兴趣的当然可以向上面提交代码啦,作为开源与GPL
的狂热热爱者,笔者当然欢迎。
今天我们要聊的这个“诡异的数值”,几乎就是一本活生生的教科书,是笔者在编写cunix
的文件系统
时出现的一个问题。代码笔者同样是放在了github上,https://github.com/pengruiyang-cpu/lessons/tree/master/0x00000001/code,https://gitee.com/pengruiyang-cpu/lessons/tree/master/0x00000001/code
大家可以试试用GCC
编译一下:
gcc mkfs.c bitmap.c -o mkfs
编译出mkfs
,然后试试用它格式化一个磁盘映像。或者干脆格式化一个不用的磁盘也可以。大家会发现,屏幕上显示出的inode
非常少,例如笔者的64GB的U盘(实际57GB可用),竟然只有50000个?
大家最开始得出这个数值一定是怀疑笔者的逻辑写错了,其实并不是,笔者设定的逻辑是,inode
大小是磁盘大小的512分之一,而每个inode
占用64
个字节。所以,57GB
的磁盘,inode
应该有(57GB / 512 / 64
)1867776
个才对,这里竟然只显示50000
个,连三十分之一都不到。
而且,这里的代码笔者自认为写的还算漂亮,下面是笔者开始怀疑的问题代码。
int setup_sb(int fd, __uint32_t cblocks) {
superblock_d.magic = SB_MAGIC;
superblock_d.cblocks = cblocks;
printf("blocks count: %u\n", cblocks);
/* block bitmap start at second block */
/* `>> 3` is faster than ` / 8` */
/* MINODES_USED = 4GB * 64 = 256GB */
/* if you want use 4G inodes, you must have a disk with 128TB (MINODES_USED * 512) */
/* don't forget `ALIGNUP_4096`! else maybe overflow, I did it :-( */
#define BBM_START (0 + 1)
#define BBM_BLOCKS (ALIGNUP_4096(cblocks >> 3))
/* on my computer, a 64GB disk will have 2 million inodes, but it takes about only 50000 */
#define INODES_COUNT (((cblocks * BLOCK_SIZE) >> 9) / sizeof(struct inode))