⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xsfsunits.c

📁 一个操作系统,用C语言实现开发的,我在一个浙江大学的操作系统实验网站找到.大家学习以下
💻 C
字号:
// XSFS Units Management

#include <memory.h>
#include "xsfsbase.h"
#include "xsfsunits.h"
#include "xsfsstream.h"

static inline int read_unit(HXSFS xsfs, _u32 unit)
{
	return fsioRead(xsfs->handle, i_xsfs_start_sector(xsfs)+unit*xsfs->desc.n_scale,
					xsfs->buffer, xsfs->desc.n_scale);
}

static inline int write_unit(HXSFS xsfs, _u32 unit)
{
	return fsioWrite(xsfs->handle, i_xsfs_start_sector(xsfs)+unit*xsfs->desc.n_scale,
					xsfs->buffer, xsfs->desc.n_scale);
}

int xsfsAllocUnits(HXSFS xsfs, _u32 base, int count, _u32 result[], int mode)
{
	int i, n, j, l, k, m, cnt;
	_u32 byte;

	// the current version is quite simple

	l = i_xsfs_unit_size(xsfs);

	for(i=0, cnt=0; i<xsfs->desc.n_bitmap && cnt<count; i++)
	{
		read_unit(xsfs, i);
		j = 0; n = 0; m = 0;
		while(j<l && n<l && cnt<count)
		{
			for(j=n; j<l && ((_u8*)xsfs->buffer)[j]==0xff; j++);
			if(j<l) 
			{
				byte = ((_u8*)xsfs->buffer)[j];
				for(k=0; k<8 && cnt<count; k++)
					if(((byte>>k)&1)==0)
					{
						result[cnt++] = i*xsfs->desc.sector_size*xsfs->desc.n_scale*8 + j*8 + k;
						m = 1;
					}
				((_u8*)xsfs->buffer)[j] |= (_u8)(byte | ((1<<k)-1) );
				n = j+1;
			}
		}
		if(m)
			write_unit(xsfs, i);
	}
	// need cleaning
	if(mode&XSAM_CLEAN)
	{
		memset(xsfs->buffer, 0, i_xsfs_unit_size(xsfs));
		for(i=0; i<cnt; i++)
			write_unit(xsfs, result[i]);
	}
	return cnt;
}

void xsfsFreeUnits(HXSFS xsfs, _u32 units[], int count, int mode)
{
	int oldunit = -1;
	int b, n, o, i;
	_u32 pos;

	// number of unit-bits can one unit hold
	b = xsfs->desc.sector_size*xsfs->desc.n_scale*8;

	for(i=0; i<count; i++)
	{
		pos = mode&XSAM_CONTINUE ? units[0]+i : units[i];
		n = pos/b; o = pos%b;

		// last unit-bit is updated (oldunit>=0)
		// and a different unit should be loaded (n!=oldunit)
		if(oldunit>=0 && n!=oldunit)
		{
			write_unit(xsfs, oldunit);
			oldunit = -1;
		}
		// if no unit loaded
		if(oldunit<0)
		{
			read_unit(xsfs, n);
			oldunit = n;
		}
		// clear used bit
		((char*)xsfs->buffer)[o/8] &= ~( 1<<(o%8) );
	}
	// the last unit must not be written back
	write_unit(xsfs, oldunit);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -