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

📄 main.c

📁 从dos下装载内核
💻 C
字号:
#include "print.h"/*包含print函数申明*/
#include "file.h"/*文件操作头文件*/
#include "mem.h"/*内存操作头文件*/
int LoadKernel(int FileHandle);/*读入内核并移动到内存1M处*/

/*到自己搬到0x90200处执行,并设置好内核参数,转入内核执行,该模块的代码在loader.asm*/
void MoveSelfToKernel(int DevNum);

int main(void){
	char ImageName[20],RootStr[10];
	int i=0,RootDeviceNum=0;
	int FileHandle=OpenFile("loader.ini",0);
	if(!FileHandle){
		print("Open loader.ini fail!\n");
		return 1;
	}
	ReadFile(FileHandle,&ImageName[i],1);
	while((ImageName[i]!=0x0d)&&(ImageName[i]!='#')){/*没有换行符或结束标志*/
		i++;
		ReadFile(FileHandle,&ImageName[i],1);
	}
	if((ImageName[i]==0x0d)||(ImageName[i]=='#'))
		ImageName[i]=0;
	RootStr[0]=ImageName[i];	
	while((RootStr[0]!='x')&&(RootStr[0]!='X'))
		ReadFile(FileHandle,RootStr,1);/*读取0x标志*/	
	i=0;
	ReadFile(FileHandle,&RootStr[i],1);	
	while((RootStr[i]!=0x0d)&&(RootStr[i]!='#')){
		i++;
		ReadFile(FileHandle,&RootStr[i],1);
	}	
	RootStr[i]=0;
	print("the root Device num is 0x");
	print(RootStr);
	i=0;
	while(RootStr[i]!=0){/*把字符串转换为数字*/
		if(RootStr[i]>='0'&&RootStr[i]<='9')
			RootDeviceNum=RootDeviceNum*16+RootStr[i]-'0';
		if(RootStr[i]>='a'&&RootStr[i]<='f')
			RootDeviceNum=RootDeviceNum*16+RootStr[i]-'a'+10;
		if(RootStr[i]>='A'&&RootStr[i]<='F')
			RootDeviceNum=RootDeviceNum*16+RootStr[i]-'A'+10;
		i++;
	}
		
	CloseFile(FileHandle);
	FileHandle=OpenFile(ImageName,0);
	if(!FileHandle){
		print("Open Kernel Image Fail!\n");
		return 1;
	}
	if(!LoadKernel(FileHandle)){/*装载内核到内存*/
		print("Load Kernel Fail\n");
		return 1;
	}
	CloseFile(FileHandle);
	print("\nLoad Kernel finished");
	MoveSelfToKernel(RootDeviceNum);	
	return 0;
}
int LoadKernel(int FileHandle){
	long unreadsize=0;
	unsigned long FreeBase=0x100000;/*内存1M处*/
	char buf[512];
	FileSize(FileHandle,&unreadsize);
	FileSeek(FileHandle,0,0);
	while(unreadsize){		
		if(unreadsize>sizeof(buf)){/*如果剩下的字节数大一缓冲大小*/						
			if(!ReadFile(FileHandle,buf,sizeof(buf)))/*则读取缓冲大小的的数据*/
				return 0;
			unreadsize-=sizeof(buf);			
			MoveToExtendMem(buf,FreeBase,sizeof(buf)/2);
			FreeBase+=sizeof(buf);
		}else{/*剩下的字节数小于缓冲区大小*/
			if(!ReadFile(FileHandle,buf,unreadsize))
				return 0;
			MoveToExtendMem(buf,FreeBase,unreadsize/2);
			unreadsize=0;
		}

	}
	return 1;
}

⌨️ 快捷键说明

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