龙芯软件开发(30)-- 自动加载操作系统

    技术2022-05-11  108

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

    最新回复(0)