Linux内核源码分析--文件系统(四、Bitmap.c)

        前面两篇blog是分析缓存区的,而这里开始分析文件系统底层操作函数;首先开刀的是bitmap.c程序,这个程序主要负责逻辑块的申请和释放以及i节点的申请和释放;如果大家看了一系列的blog会想《Linux完全注释》不是有吗,我这个blog就没有什么价值了。其实不是这样的(至少我个人不是这么认为的),首先是我看了理解后的笔记,然后是《Linux完全注释》非常散,仅仅是注释,没有对整个操作系统的联系来分析。就好比如告诉你一篇文章中的每个字的意思,但你却未必知道整篇文章讲的是什么意思。

        总结的来说其实Bitmap.c程序就是操作文件系统中的两个位图:i节点位图和逻辑块位图;拿逻辑块位图来说吧,申请一个新的逻辑块时,首先是在8块逻辑块位图中查找一个空闲的比特位,找到以后转换成逻辑块号,然后就通过逻辑块号找到真正的逻辑块,通过函数把该逻辑块映射到缓存区中,当然最后要对缓存区做些属性设置;释放一个逻辑块时也一样,首先做些检查,然后释放缓存块,最后也是设置下逻辑块位图(当然也是根据逻辑块号转换成8块逻辑块位图中的某个比特位)。


        1、看下本程序涉及到的一些汇编;

        stosl指令:相当于将EAX中的值保存到ES:EDI指向的地址中, 若设置了EFLAGS中的方向位置位(即在STOSL指令前使用STD指令)则EDI自减4,否则(使用CLD指令)EDI自增4。一般和rep一起用循环的把eax中的值放到edi中(当然cx表示循环的次数)。本程序中在clear_block() 清除块上所有位数时使用;

        btsl指令:bts %1, %2 把基地址%2 偏移地址为%1所指的比特位值保存到cf进位标志中,然后设置该比特位为1;指令setb用于根据进位标志cf设置al,cf=1,al=1;cf=0,al=0;在set_bit(nr,addr)指定某块逻辑块上的某个位进行置1,并把该位原来的值保存到进位标志cf上,以便接下来的检查;

        btrl指令:btr %1, %2把基地址%2 偏移地址1所指的比特位保存到cf进位标志中,然后设置该比特位为0。setnb 根据进位标志cf设置al,cf=1,al=0;cf=0,al=1;这个指令刚好和上个相反;在clear_bit(nr,addr)指定某块逻辑块上的某个位进行清零,并把该位原来的值放到cf中,以便接下来的检查;

        在一块逻辑块上查找一个第一个比特位为0的比特位(其实就是在一个逻辑块中查找空闲位)


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值