龙芯
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 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
协议等等。