您的位置:首页 > 产品设计 > 产品经理

PMON中autoload自动加载操作系统代码分析

2012-02-26 16:05 363 查看
龙芯BIOS的最终目的,还是需要加载一个更好的操作系统。当你在启动时不按下任何按键,pmon就会自动地加载缺省设置的操作系统。它的实现代码如下:

#ifdef AUTOLOAD

s = getenv ("al");

autoload (s);

#else

s = getenv ("autoboot");

autorun (s);

#endif

上面先从al参数里读取缺省设置的操作系统所在的目录路径,然后调用autoload函数来加载系统文件。接着下来再去看函数autoload的实现,如下:

static void

autoload(char *s)

{

char buf[LINESZ];

char *pa;

unsigned int dly, lastt;

unsigned int cnt;

struct termio sav;

if(s != NULL && strlen(s) != 0) {

dly = 1024;

上面判断是否有缺省的加载系统,如果有就设置延时为1024。

SBD_DISPLAY ("AUTO", CHKPNT_AUTO);

printf("Press <Enter> to execute loading image:%s\n",s);

printf("Press any other key to abort.\n");

ioctl (STDIN, CBREAK, &sav);

lastt = 0;

do {

ioctl (STDIN, FIONREAD, &cnt);

delay(10000);

if (dly % 128 == 0) printf (".");

} while (dly— != 0 && cnt == 0);

上面提示用户输入按键,然后不断地查询用户是否输入非ENTER按键,如果有输入,就设置cnt不为0。

if(cnt > 0 && strchr("\n\r", getchar())) {

cnt = 0;

}

上面判断是否输入回车键。

ioctl (STDIN, TCSETAF, &sav);

putchar ('\n');

if(cnt == 0) {

上面判断是否自动加载操作系统。

strcpy(buf,"load ");

strcat(buf,s);

do_cmd(buf);

上面这里执行load命令,把操作系统加载到内存。

pa=getenv("karg");

strcpy(buf,"g ");

if(pa != NULL && strlen(pa) != 0) strcat(buf,pa);

else strcat(buf," -S root=/dev/hda1 console=tty");

//else strcat(buf," root=/dev/hda1 console=tty");

printf("%s\n",buf);

delay(100000);

do_cmd (buf);

上面首先取得内核参数,然后构造g命令的参数,接着执行g命令。

}

}

}

这段程序是通过构造load和g命令实现自动加载操作系统文件,如果没有选择自动加载,就会返回到上一级的函数功能。后面执行的代码如下:

dbginit(NULL);

/*

* Set up exception vectors.

*/

SBD_DISPLAY("BEV1",0);

bcopy(MipsException, (char *)TLB_MISS_EXC_VEC, MipsExceptionEnd - MipsException);

bcopy(MipsException, (char *)GEN_EXC_VEC, MipsExceptionEnd - MipsException);

上面拷贝异常响应到0x8000 0000开始的位置,因为那里是CPU处理异常的地址。

CPU_FlushCache();

CPU_SetSR(0, SR_BOOT_EXC_VEC);

SBD_DISPLAY("BEV0",0);

printf("BEV in SR set to zero.\n");

上面设置BEV位为0,也就是从引导标志1转换为一般执行标志了。

#if 0

/* memtest */

addr_tst1();

addr_tst2();

movinv1(2,0,~0);

movinv1(2,0xaa5555aa,~0xaa5555aa);

printf("memtest done\n");

#endif

/*

* Launch!

*/

main();

上面实现命令输入交互响应阶段。比如在键盘里输入命令并执行,都是在这个函数实现的。

pmon运行到这里,就已经把所有东西都已经初始化了,进入命令处理阶段,只要用户输入什么命令,就响应什么样的动作,回到了一个DOS系统的样子。pmon实现不少命令,可以从硬盘、U盘、光盘和网络加载其它可以执行的程序。比如你在Windows下用龙芯指令的编译器就可以编译一些小程序,或者大程序,然后让pmon帮你加载到内存里运行。如果是基于嵌入式的开发,完全可以在windows下开发,通过TFTP加载到龙芯电脑里运行。当然,你如果有伟大计划,比如编写一个操作系统,也可以直接通过TFTP加载到龙芯电脑里运行。对于开发大型操作系统的人来说,经常是一台电脑是开发机,一台电脑是目标机,这样才非常方便测试。pmon目前主要支持fat、ext2和ISO9600的文件系统,如果有其它系统程序,可以直接放到ext2的分区里,然后就可以加载了,不需要做什么样特别的安装,这样的做法是非常“环保”的,是绿色软件的。

后面会不断地介绍U盘的控制和读取文件,硬盘文件系统,还有网络的TCP/IP协议等等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: