WORD16 StratInit(RP FAR* _rp)
  {

  RPInit FAR* rp = (RPInit FAR*)_rp;
  int result=0;

//  HFILE FAR* File;

  // MANDATORY: Initialize the Device Driver libraries.
  DevInit(rp->In.DevHlp);

  // Signal that we've installed successfully by setting the size of
  // our code and data segments.
  rp->Out.FinalCS = OffsetFinalCS;
  rp->Out.FinalDS = OffsetFinalDS;

  // Print a sign on message to the debugging terminal.
  cdbg << ALL << endl;
  cdbg << MSG_DEBUG << endl;
  cdbg << MSG_CS << hex << setw(4) << OffsetFinalCS
       << setw() << dec << 'h' << endl;
  cdbg << MSG_DS << hex << setw(4) << OffsetFinalDS
       << setw() << dec << 'h' << endl;
  cdbg << endl;

  // Print a sign on message to the console.
  DosPutMessage(1, WELCOME_LENGTH, WELCOME);

  //user code

  return RPDONE;

  }
Exemple #2
0
static void KeStartupThread(void)
{
    process_info_t info;

    DevInit();
    FsInit();

    proc_idle.root = fs_root;
    wcscpy(proc_idle.info->cwd, L"/");
    FsChangeDir(L"/");

    if (!ProLoadProfile(SYS_BOOT L"/system.pro", L"/"))
        wprintf(L"KernelMain: unable to load " SYS_BOOT L"/system.pro\n");

    ThrCreateThread(&proc_idle, true, MemZeroPageThread, false, NULL, 24, L"MemZeroPageThread");

    info = *proc_idle.info;
    wcscpy(info.cmdline, kernel_startup.cmdline);
    ProcSpawnProcess(SYS_BOOT L"/monitor.exe", &info);

    ThrExitThread(0);
    KeYield();
}
Exemple #3
0
word StratInit(RPInit far* pPacket)
{
	int rc = 0;

	DevInit(pPacket->In.DevHlp);

	Say(CRLF DNAME VERSION CRLF COPYRIGHT DVENDOR CRLF);

	FixFarPointers();

	rc = NDISInit();
	if (rc)
	{
		Say(cRCStr[-rc]);
		Say(CRLF);
	}

	if (rc)
	{
	        Say(cDevName);
		Say(" driver not loaded.");
		Say(CRLF);

		pPacket->Out.FinalCS = 0;
		pPacket->Out.FinalDS = 0;
	}
	else
	{
	        Say(cDevName);
        	Say(" loaded.");
		Say(CRLF);
        	pPacket->Out.FinalCS = OffsetFinalCS;
	        pPacket->Out.FinalDS = OffsetFinalDS;
	}
	return RPDONE;
}
Exemple #4
0
void Mount(MountType type)
{
/*
 * precondition		: usage ) Mount(MT_TYPE_FORMAT);
 * postcondition	: 가상 디스크의 파일 시스템을 초기화 한다.
 * 					  (1) MT_TYPE_FORMAT : 가상 디스크, 즉, 디스크를 에뮬레이션할 파일을 생성하고,
 * 										   그 파일을 파일 시스템이 인식할 수 있도록 organize 함.
 * 										   즉, 디스크 포맷처럼 가상 디스크 역할을 담당하는 파일 내에
 * 										   superblock, inode bitmap, block bitmap, inode list
 * 										   등을 초기화한다. 이때, 생성될 가상디스크의 크기는 10MB로 한다.
 * 					  (2) MT_TYPE_READWRITE : MT_TYPE_FORMAT과 달리 가상 디스크를 포맷하지 않으며,
 * 											  파일 시스템 unmount 되기 이전의 디스크 사용 상태를 유지시키면서
 * 											  파일 시스템을 초기화한다. 이때, 내부적으로 가상 디스크용 파일을
 * 											  리눅스의 “open” system call을 사용하여 파일 열기를 수행하며,
 * 											  file system info, inode bitmap, block bitmap을
 * 											  정의된 in-memory data structure에 load한다.
 */
	int i = 0;
	Buf* pBuf = NULL;
	InodeInfo	inodeInfo;
	DirBlock	dirBlock;

//////////////////////////////////////////////////////////////////////
// 모두 block 단위임
	inodeBitmapSize = (FS_INODE_COUNT / 8/*1byte*/ / BLOCK_SIZE == 0) ? 1 : (int)(ceil((double)FS_INODE_COUNT / (double)8 / (double)BLOCK_SIZE));// FS_INODE_COUNT / 8/*1byte*/ / BLOCK_SIZE + 1;	// block 단위
	inodeListSize = (int)(ceil((double)FS_INODE_COUNT / (double)NUM_OF_INODE_IN_1BLK)); // block 단위
	dataRegionSize = (FS_DISK_CAPACITY / BLOCK_SIZE - 1/*FileSysInfo block*/ /* - 1*//*BlockBitmap block*/
						- (double)inodeBitmapSize - (double)inodeListSize);
	blockBitmapSize = ceil(dataRegionSize / 8/*1byte*/ / BLOCK_SIZE);	// block 단위
	dataRegionSize = dataRegionSize - blockBitmapSize;
//
//////////////////////////////////////////////////////////////////////
	memset(&fileDescTable, NULL, sizeof(FileDescTable));
	Init();			// 버퍼캐시 생성 및 초기화

	switch(type)
	{
	case MT_TYPE_FORMAT:
		DevInit();		// 디스크 초기화
		fileSysInfo.blocks = BLOCK_SIZE;
		fileSysInfo.rootInodeNum = 0; // 수정해야함
		fileSysInfo.diskCapacity = dataRegionSize;	// 수퍼블락을 제외한 순수 data rigion의 블록사이즈
		fileSysInfo.numAllocBlocks = 0;
		fileSysInfo.numFreeBlocks = fileSysInfo.diskCapacity;
		fileSysInfo.numInodes = FS_INODE_COUNT;
		fileSysInfo.numAllocInodes = 0;
		fileSysInfo.numFreeInodes = FS_INODE_COUNT;
		fileSysInfo.inodeBitmapStart = 1; // inode bitmap이 저장된 블록번호
		fileSysInfo.blockBitmapStart = fileSysInfo.inodeBitmapStart + inodeBitmapSize; // block bitmap이 저장된 블록 번호
		fileSysInfo.inodeListStart = fileSysInfo.blockBitmapStart + blockBitmapSize; // inode list를 저장하는 영역의 시작 블록 번호
		fileSysInfo.dataStart = fileSysInfo.inodeListStart + inodeListSize; // data region의 시작 블록 번호
		fileSysInfo.pInodeBitmap = malloc(inodeBitmapSize * BLOCK_SIZE);
		fileSysInfo.pBlockBitmap = malloc((int)blockBitmapSize * BLOCK_SIZE);

		memset(fileSysInfo.pInodeBitmap, 0xFF, inodeBitmapSize * BLOCK_SIZE);
		memset(fileSysInfo.pBlockBitmap, 0xFF, (int)blockBitmapSize * BLOCK_SIZE);
		memset(&inodeInfo, 0x0, sizeof(InodeInfo));
		memset(&dirBlock, 0x0, sizeof(DirBlock));

	////////////////////////////////////////////////////
	// root 생성
	//
		// inode 데이터 대입
		inodeInfo.size = 0;
		inodeInfo.type = FILE_TYPE_DIR;
		inodeInfo.mode = FILE_MODE_READONLY;
		inodeInfo.blocks = 1;
		inodeInfo.i_block[0] = fileSysInfo.dataStart;

		// inode 저장
		pBuf = BufRead(fileSysInfo.inodeListStart);
		BufWrite(pBuf, &inodeInfo, sizeof(InodeInfo));
		// inode 사용현황 변경
		if ( SetInodeFreeToAlloc() == WRONG_VALUE )
			fprintf(stderr, "* SetInodeFreeToAlloc() error!\n");
		// Directory Block 생성
		strncpy(dirBlock.dirEntries[0].name, ".", NAME_LEN_MAX);
		dirBlock.dirEntries[0].inodeNum = 0;
		dirBlock.dirEntries[0].type = FILE_TYPE_DIR;
		// dir block 저장
		pBuf = BufRead(fileSysInfo.dataStart);
		BufWrite(pBuf, &dirBlock, sizeof(DirBlock));
		// block 사용현황 변경
		if ( SetBlockFreeToAlloc() == WRONG_VALUE )
			fprintf(stderr, "* SetBlockFreeToAlloc() error!\n");
	//
	////////////////////////////////////////////////////
		break;

	case MT_TYPE_READWRITE:			// 버퍼캐시 생성 및 초기
		DevLoad();		// 디스크 로
		pBuf = BufRead(0);	/* FileSysInfo */
		memcpy(&fileSysInfo, pBuf->pMem, sizeof(fileSysInfo) - sizeof(char*) * 2 /*포인터변수 2개*/);

		fileSysInfo.pInodeBitmap = malloc(inodeBitmapSize * BLOCK_SIZE);
		fileSysInfo.pBlockBitmap = malloc((int)blockBitmapSize * BLOCK_SIZE);
		memset(fileSysInfo.pInodeBitmap, NULL, inodeBitmapSize * BLOCK_SIZE);
		memset(fileSysInfo.pBlockBitmap, NULL, (int)blockBitmapSize * BLOCK_SIZE);

		// inodeBitmap 로드
		for ( i = fileSysInfo.inodeBitmapStart ; i < fileSysInfo.inodeBitmapStart + inodeBitmapSize ; i++ )
		{
			pBuf = BufRead(i);
			memcpy(fileSysInfo.pInodeBitmap + (i - fileSysInfo.inodeBitmapStart) * BLOCK_SIZE, pBuf->pMem, BLOCK_SIZE);
		}
		// blockBitmap 로드
		for ( i = fileSysInfo.blockBitmapStart ; i < fileSysInfo.blockBitmapStart + blockBitmapSize ; i++ )
		{
			pBuf = BufRead(i);
			memcpy(fileSysInfo.pBlockBitmap + (i - fileSysInfo.blockBitmapStart) * BLOCK_SIZE, pBuf->pMem, BLOCK_SIZE);
		}
		break;
	}
}