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; }
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(); }
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; }
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; } }