rw.c

来自「参照MINIX3写的操作系统 用GCC+NASM+BOCHS开发」· C语言 代码 · 共 687 行 · 第 1/2 页

C
687
字号
	pInode->FileSize+=1024;/
	/*else ((12+256)<=FileBlockSize<(12+256+256*256)//二次间接块
	{
		if(Inode->Block[13]==0)//二次间接块指针为空
		{	
			//申请新块,作为二次间接块
			NewBlock2=OldMallocPhysicalBlock(LPInode pInode);
            //取得该块
			pBuffer=GetPhysicalBlock(NewBlock ,Device);
			Data=pBuffer->Data;
			//清零
			MemorySet((void *)Data,0,1024);
           	//申请新块,作为一次间接块
			NewBlock1=OldMallocPhysicalBlock(LPInode pInode);
            //取得该块
			pBuffer=GetPhysicalBlock(NewBlock ,Device);
			Data=pBuffer->Data;
			//清零
			MemorySet((void *)Data,0,1024);
            //将一次间接块写入二次块间接块
			SetAddressToIndirectBlock(Device,NewBlock2,0,NewBlock1)
			//将PhysicalBlock写入一次块
			SetAddressToIndirectBlock(Device,NewBlock1,0,NewBlock1)
		}
		else //二次间接块存在
		{
	    	if((FileBlockSize-12-256)/256==0)//一次间接块指针为空
			{  
				//申请新块,作为一次间接块
				NewBlock1=OldMallocPhysicalBlock(LPInode pInode);
				//取得该块
				pBuffer=GetPhysicalBlock(NewBlock ,Device);
				Data=pBuffer->Data;
				//清零
				MemorySet((void *)Data,0,1024);
				//将一次间接块写入二次块间接块
				SetAddressToIndirectBlock(Device,Inode->Block[13],0,NewBlock1);

			}
			else//一次间接块存在
			{
				
				//计算一次块在二次块中的位置
				NewBlock1=(FileBlockSize-12-256)/256;
				NewBlock1=GetAddressFromIndirectBlock(Device,Inode->Block[13],NewBlock1);
				//计算新的PhysicalBlock在一次间接块中的位置
				NewBlock=(FileBlockSize-12-256)%256;
            	//将PhysicalBlock写入一次块
		    	SetAddressToIndirectBlock(Device,NewBlock1,NewBlock,PhysicalBlock);
				
			}
		}

	}
	else if (12+256+256*256)<=FileBlockSize<(12+256+256*256+256*256*256)//三次块
	{
        if(Inode->Block[14]==0)//三次间接块指针为空
		{
			//申请新块,作为三次间接块
			NewBlock3=OldMallocPhysicalBlock(LPInode pInode);
            //取得该块
			pBuffer=GetPhysicalBlock(NewBlock3 ,Device);
			Data=pBuffer->Data;
			//清零
			memset((void *)Data,1024,0);
           	//申请新块,作为二次间接块
			NewBlock2=OldMallocPhysicalBlock(LPInode pInode);
            //取得该块
			pBuffer=GetPhysicalBlock(NewBlock3 ,Device);
			Data=pBuffer->Data;
			//清零
			memset((void *)Data,1024,0);
            //申请新块,作为一次间接块
			NewBlock1=OldMallocPhysicalBlock(LPInode pInode);
            //取得该块
			pBuffer=GetPhysicalBlock(NewBlock1 ,Device);
			Data=pBuffer->Data;
			//清零
			memset((void *)Data,1024,0);
            //将二次间接块写入三次块间接块
			SetAddressToIndirectBlock(Device,NewBlock3,0,NewBlock2);
            //将一次间接块写入二次块间接块
			SetAddressToIndirectBlock(Device,NewBlock2,0,NewBlock1);
			//将PhysicalBlock写入一次块
			SetAddressToIndirectBlock(Device,NewBlock2,0,PhysicalBlock);

		}
		else//三次间接块存在
		{
			if((FileBlockSize-12-256-256*256)/(256*256)==0)//二次间接块指针为空
			{  
				//申请新块,作为二次间接块
				NewBlock2=OldMallocPhysicalBlock(LPInode pInode);
				//取得该块
				pBuffer=GetPhysicalBlock(NewBlock3 ,Device);
				Data=pBuffer->Data;
				//清零
				memset((void *)Data,1024,0);
               //申请新块,作为一次间接块
				NewBlock1=OldMallocPhysicalBlock(LPInode pInode);
				//取得该块
				pBuffer=GetPhysicalBlock(NewBlock1 ,Device);
				Data=pBuffer->Data;
				//清零
				memset((void *)Data,1024,0);
				//计算二次间接块在三次间接块中的位置
				NumberInOneBlock=(FileBlockSize-12-256-256*256)%256;
				SetAddressToIndirectBlock(Device,Inode->Block[14],NumberInOneBlock,NewBlock2);
				 //将一次间接块写入二次块间接块
				SetAddressToIndirectBlock(Device,NumberInOneBlock,0,NewBlock1);
				//将PhysicalBlock写入一次块
				SetAddressToIndirectBlock(Device,NewBlock2,0,PhysicalBlock);
			}
			else//二次间接块存在
			{	
				if((FileBlockSize-12-256)/256==0)//一次间接块指针为空
				{  
				    
				//申请新块,作为一次间接块
				NewBlock1=OldMallocPhysicalBlock(LPInode pInode);
				//取得该块
				pBuffer=GetPhysicalBlock(NewBlock1 ,Device);
				Data=pBuffer->Data;
				//清零
				memset((void *)Data,1024,0);
				//计算一次间接块在二次次间接块中的位置
				NumberInOneBlock=(FileBlockSize-12-256-256*256)%(256*256);
				SetAddressToIndirectBlock(Device,Inode->Block[14],NumberInOneBlock,NewBlock2);
				
				}
			    else//一次间接块存在
				{
                	//将PhysicalBlock写入一次块
		        	WritePhysicalBlock
		 		
			   }	
			}
		}
			
	}*/
}
t_32 ReadFile(LPInode pInode,t_32 StartPosition,t_32 Count,t_8 Mode,t_32 Dest)
//
{
	  if(StartPosition+Count>pInode->FileSize)//要读入的数据大于文件
		  Count=pInode->FileSize-StartPosition;//截短
	  if(Count<=0)//小于零返回
		  return 0;
	  //FileBlock数组保存文件在数据内存区中块群的指针
	  t_32 FileBlock=StartPosition/1024;//要读取的文件块,由StartPosition计算第一块的位置
	  t_32 PhysicalBlock;//物理块
	  t_32 LoaclStart=(StartPosition+1)%1024-1;//一块内的开始位置
	  t_32 ReadSize=0; //ReadSize保存已经读取的数据量
	  LPBuffer pBuffer;//块缓冲区
	  char *Data;//数据块指针
	  t_32 i=0;
	  //将文件逻辑块号转换成物理块号
      PhysicalBlock=FileBlockToPhysicalBlock(pInode,FileBlock++,0);
	  //取得物理块
	  pBuffer=GetPhysicalBlock(PhysicalBlock,0);
	  Data=pBuffer->Data;
	  Data+=LoaclStart;//将指针移到要读的位置 
	  ReadSize+=1024-LoaclStart;//第一块要读入的数据量
	  if(ReadSize>=Count)//要读入的数据还不能填满一块
	  {
        
	    MemoryCopy((void *)Dest,(void *)Data,Count);
		ReadSize=Count;//读出的数据
	    return ReadSize;
        
	  }
	  else 
	  {
		//处理数据开始部分,内存区不满一块的情况
	    MemoryCopy((void *)Dest,(void *)Data,ReadSize);
        Dest+=ReadSize;
		Count-=ReadSize;
	
		//循环写入数据(一次一块)
		for(i=0;i<Count/1024;i++)
		{
			//将文件逻辑块号转换成物理块号
			PhysicalBlock=FileBlockToPhysicalBlock(pInode,FileBlock++,0);;
			 //取得物理块
			pBuffer=GetPhysicalBlock(PhysicalBlock,0);
			Data=pBuffer->Data;
      		MemoryCopy((void *)Dest,(void *)Data,1024);
			Dest+=1024;
			ReadSize+=1024;

		}
		if(ReadSize>=Count)//全部数据读入
			 return ReadSize;
		else//剩下还不满一块的数据
		{
		    //将文件逻辑块号转换成物理块号
			PhysicalBlock=FileBlockToPhysicalBlock(pInode,FileBlock++,0);;
			 //取得物理块
			pBuffer=GetPhysicalBlock(PhysicalBlock,0);
			Data=pBuffer->Data;
      		MemoryCopy((void *)Dest,(void *)Data,Count-ReadSize);
			Dest+=1024;
			ReadSize+=Count-ReadSize;
			return ReadSize;

		}
	}

}

t_32 WriteFile(LPSuper Super,LPInode pInode,t_32 Count,t_8 Mode,t_32 Dest)
//fd文件描述符,Count要写入的大小,Mode写入的模式,Dest要写入数据的内存区指针
//CURRENT从当前位置写入,BEGIN从文件开始位置写入,END从文件结束位置写入
{  
	//WriteSize保存已经写入的数据量
	t_32 WriteSize=0;
	t_32 Block;
	t_32 LoaclStart;
	t_32 PhysicalBlock;
	LPBuffer pBuffer;
	char *Data;
	t_32 i=0;
	if(pInode->FileSize==0)//空文件
	{
		//新分配物理块
		Block= NewMallocPhysicalBlock(Super,pInode,25); 
		//将物理块写入Inode
		PhysicalBlockToFileBlock(Super,pInode,Block,0);
		//当前块位置为零
		LoaclStart=0;
	}
	else if(pInode->FileSize%1024==0)//文件刚好满一块
	{
		//分配新的物理块位图
		Block=OldMallocPhysicalBlock(Super,pInode);
		//当前块位置为零
		LoaclStart=0;
		//将物理块写入Inode
		PhysicalBlockToFileBlock(Super,pInode,Block,0);
		
	}
	else
	{
		Block=FileBlockToPhysicalBlock(pInode,pInode->FileSize/1024,0);
		LoaclStart=pInode->FileSize%1024;
	}

	//LPInode pInode;	
	//根据文件的大小计和模式算出要写的第一块的块号FirstWriteBlock
	/*switch(Mode)
	{
	case CURRENT://从当前位置
		 Block=pInode->FileSize/1024
		 break;
	case BEGIN://从文件开始
		break;
	case END://从文件末尾
	
		break;
	default :break;

	}*/
	
	//将其读入
    //取得物理块
	printk("GetPhysicalBlock(Block,0) %d\n",Block);
	pBuffer=GetPhysicalBlock(Block,0);
	printk("pBuffer %x\n",pBuffer);
	Data=pBuffer->Data;
	
	Data+=LoaclStart; 
	WriteSize+=1024-LoaclStart;
	if(WriteSize>=Count)//要写入的数据还不能填满一块或刚满一块
	{
        
	    MemoryCopy((void *)Data,(void *)Dest,Count);

		pBuffer->Dirty=DIRTY;
		FreeBufferBlock(pBuffer);
		WriteSize=Count;//写入的字节
		
        
	}
	else 
	{
		//处理数据开始部分,内存区不满一块的情况
	    MemoryCopy((void *)Data,(void *)Dest,WriteSize);
		pBuffer->Dirty=DIRTY;
		FreeBufferBlock(pBuffer);
        Dest+=WriteSize;
		Count-=WriteSize;
	
		//循环写入数据
		for(i=0;i<Count/1024;i++)
		{
			//分配物理块位图
			PhysicalBlock=OldMallocPhysicalBlock(Super,pInode);
			//将物理块号写入Inode
			//将物理块号写入Inode后物理块就映射到对应的文件块
			PhysicalBlockToFileBlock(Super,pInode,PhysicalBlock,0);
			//取得对应的块PhysicalBlock(物理块)
			pBuffer=GetPhysicalBlock(PhysicalBlock ,0);
			Data=pBuffer->Data;
      		MemoryCopy((void *)Data,(void *)Dest,1024);
			pBuffer->Dirty=DIRTY;
			FreeBufferBlock(pBuffer);
			Dest+=1024;
			WriteSize+=1024;

		}
		
		
		if(WriteSize<Count)
		//剩下还不满一块的数据
		{
			//分配物理块位图
			PhysicalBlock=OldMallocPhysicalBlock(Super,pInode);
			//将物理块号写入Inode
			//将物理块号写入Inode后物理块就映射到对应的文件块
			PhysicalBlockToFileBlock(Super,pInode,PhysicalBlock,0);
			//取得对应的块PhysicalBlock(物理块)
			pBuffer=GetPhysicalBlock(PhysicalBlock ,0);
			Data=pBuffer->Data;
      		MemoryCopy((void *)Data,(void *)Dest,Count-WriteSize);
			pBuffer->Dirty=DIRTY;
			FreeBufferBlock(pBuffer);
			WriteSize+=Count-WriteSize;
		

		}
	}
			pInode->FileSize+=WriteSize;
			pInode->Blocks=pInode->FileSize/1024;
		
	          printk("pInode->FileSize %d\n",pInode->FileSize);
			  printk("pInode %d\n",pInode);
			return WriteSize;

}



⌨️ 快捷键说明

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