示例#1
0
///////// TEST PROGRAM, NOT FOR ACTUAL USERS, MAKES DIRECT KERNEL CALLS !
int _dwrite (int argc, char ** argv)
{
	char ans[1024] = "HARA BARA";
	int bytes = 1024;
	unsigned int sector = 1;
	if(argc > 2)
	{
		int i;
		int len = strlen(argv[1]);
		sector = atoi(argv[2]);
		if(len < 1024)
		{
			for(i = 0; i < len; ++i)	{
				ans[i] = argv[1][i];
			}
			for(; i < 1024; ++i)
			{
				ans[i] = 0;
			}
		}
		int offset = 0;
		int ata = ATA0;

		_disk_write(ata, ans, 1, sector);
		printf("Escrito en sector %d\n", sector);
	}
	return 0;
}
示例#2
0
int write_disk(int ata, int sector, void * msg, int count, int offset) {

	//##################### NEW

	//sprintf("sector:%d\tcount:%d\n",sector,count);
	/*new cache stuff according to hipotetical_write*/
	/*int quantblocks = (int) (count / 512) + 1;
	if (quantblocks > CACHE_BLOCKS) {
		_disk_write(0x1f0, (char *) msg, count / 512, sector + 1);
		return -1; //disk_write(block,buffer,size);
	}
	//Si no estan todos los bloques, entonces leo y meto en la cache.
	if (cache_searchblockpackage(sector, quantblocks) == -1) {
		char * buffer2 = (char *) malloc(count);
		read_disk(0, sector, buffer2, count, 0);
		cache_write(sector, buffer2, count);
		//hipotetical_read(block, buffer2, size);
	}
	return cache_write(sector, msg, count);

	//calculo la cantidad de bloques.
	//si es muy grande lo que me piden para cache leo de disco directamente.
	//me fijo si estan en la cache.
	//si no estan me los traigo.
	//escribo de la cache en el buffer y marco como dirty.
*/
	//##################### NEW

	return _disk_write(0x1f0, (char *) msg, count / 512, sector + 1);

}
示例#3
0
文件: hdd.c 项目: maximovs/so-2011-3
void hdd_write(char * buffer, unsigned int sector) {
	if(cache){
		_cache_write(ATA0, buffer, 2, sector);
	}
	else{
		_disk_write(ATA0, buffer, 2, sector);
	}
}
示例#4
0
int _cache_flush(void){
	int i = 0;
	for( i=0; i<SECTORS; i++ ){
		if( sectors[i].used && sectors[i].dirty ){
			_disk_write( ATA0, sectors[i].data, 1, sectors[i].index );
		}
		sectors[i].used = 0;
	}
	return 1;
}
示例#5
0
int getFree(){
	int i = 0;
	for( i=0; i<SECTORS; i++ ){
		if(!sectors[i].used){
			return i;
		}
	}
	if( sectors[SECTORS-count%SECTORS-1].dirty ){
		_disk_write( ATA0, sectors[SECTORS-count%SECTORS-1].data, 1, sectors[SECTORS-count%SECTORS-1].index);
		sectors[SECTORS-count%SECTORS-1].dirty = 0;
	}
	sectors[SECTORS-count%SECTORS-1].used = 0;
	return SECTORS-count++%SECTORS-1;
}
示例#6
0
int _dfill (int argc, char ** argv)
{
	int j = 0;
	
	for(j = 0; j < 1000; ++j)
	{
		int count = 384;
		int bytes = 65536;
		int sector = 1 + j * 128;
		if(argc > 1)
		{
			int i;
			sector = atoi(argv[1]);
			for(i = 0; i < 65536; ++i)	{
				ans[i] = '0' + (i / 512) % 10;
			}
			int offset = 0;
			int ata = ATA0;
	
			Cli();
			_disk_write(ata, ans, count, sector);
			for(i = 0; i < 65536; ++i)	{
				ans[i] = 0;
			}
			// _disk_read(ata, ans, count, sector);
			Sti();
			
				printf("%d\n", j);
			
	
			// for(i = 0; i < count; ++i)	{
			// 	if(ans[i * 512] != i % 10 + '0')	{
			// 		printf("Err %d %d %d %d\n", i % 10 + '0', ans[i * 512], i, j);
			// 		getC();
			// 		break;
			// 	}
			// }
	
		}
	}
	return 0;
}