龙芯软件开发(30)-- 自动加载操作系统
2007-01-26 22:21
302 查看
龙芯BIOS的最终目的,还是需要加载一个更好的操作系统。当你在启动时不按下任何按键,pmon就会自动地加载缺省设置的操作系统。它的实现代码如下:
[align=left]#ifdef AUTOLOAD[/align]
[align=left] s = getenv ("al");[/align]
[align=left] autoload (s);[/align]
[align=left]#else[/align]
[align=left] s = getenv ("autoboot");[/align]
[align=left] autorun (s);[/align]
#endif
上面先从al参数里读取缺省设置的操作系统所在的目录路径,然后调用autoload函数来加载系统文件。接着下来再去看函数autoload的实现,如下:
[align=left]static void[/align]
[align=left]autoload(char *s)[/align]
[align=left]{[/align]
[align=left] char buf[LINESZ];[/align]
[align=left] char *pa;[/align]
[align=left] unsigned int dly, lastt;[/align]
[align=left] unsigned int cnt;[/align]
[align=left] struct termio sav;[/align]
[align=left] [/align]
[align=left] if(s != NULL && strlen(s) != 0) {[/align]
[align=left] dly = 1024;[/align]
上面判断是否有缺省的加载系统,如果有就设置延时为1024。
[align=left] [/align]
[align=left] SBD_DISPLAY ("AUTO", CHKPNT_AUTO);[/align]
[align=left] printf("Press <Enter> to execute loading image:%s/n",s);[/align]
[align=left] printf("Press any other key to abort./n");[/align]
[align=left] ioctl (STDIN, CBREAK, &sav);[/align]
[align=left] lastt = 0;[/align]
[align=left] do {[/align]
[align=left] ioctl (STDIN, FIONREAD, &cnt);[/align]
[align=left] delay(10000);[/align]
[align=left] if (dly % 128 == 0) printf (".");[/align]
[align=left] } while (dly-- != 0 && cnt == 0);[/align]
上面提示用户输入按键,然后不断地查询用户是否输入非ENTER按键,如果有输入,就设置cnt不为0。
[align=left] [/align]
[align=left] if(cnt > 0 && strchr("/n/r", getchar())) {[/align]
[align=left] cnt = 0;[/align]
[align=left] }[/align]
上面判断是否输入回车键。
[align=left] [/align]
[align=left] ioctl (STDIN, TCSETAF, &sav);[/align]
[align=left] putchar ('/n');[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] if(cnt == 0) {[/align]
上面判断是否自动加载操作系统。
[align=left] [/align]
[align=left] strcpy(buf,"load ");[/align]
[align=left] strcat(buf,s);[/align]
[align=left] do_cmd(buf);[/align]
上面这里执行load命令,把操作系统加载到内存。
[align=left] [/align]
[align=left] pa=getenv("karg");[/align]
[align=left] strcpy(buf,"g ");[/align]
[align=left] if(pa != NULL && strlen(pa) != 0) strcat(buf,pa);[/align]
[align=left] else strcat(buf," -S root=/dev/hda1 console=tty");[/align]
[align=left] //else strcat(buf," root=/dev/hda1 console=tty");[/align]
[align=left] [/align]
[align=left] printf("%s/n",buf);[/align]
[align=left] delay(100000);[/align]
[align=left] do_cmd (buf);[/align]
上面首先取得内核参数,然后构造g命令的参数,接着执行g命令。
[align=left] [/align]
[align=left] }[/align]
[align=left] }[/align]
}
这段程序是通过构造load和g命令实现自动加载操作系统文件,如果没有选择自动加载,就会返回到上一级的函数功能。后面执行的代码如下:
[align=left]dbginit(NULL);[/align]
[align=left] [/align]
[align=left] /*[/align]
[align=left] * Set up exception vectors.[/align]
[align=left] */[/align]
[align=left] SBD_DISPLAY("BEV1",0);[/align]
[align=left] bcopy(MipsException, (char *)TLB_MISS_EXC_VEC, MipsExceptionEnd - MipsException);[/align]
[align=left] bcopy(MipsException, (char *)GEN_EXC_VEC, MipsExceptionEnd - MipsException);[/align]
上面拷贝异常响应到0x8000 0000开始的位置,因为那里是CPU处理异常的地址。
[align=left] [/align]
[align=left] CPU_FlushCache();[/align]
[align=left] [/align]
[align=left] CPU_SetSR(0, SR_BOOT_EXC_VEC);[/align]
[align=left] SBD_DISPLAY("BEV0",0);[/align]
[align=left] [/align]
[align=left] printf("BEV in SR set to zero./n");[/align]
上面设置BEV位为0,也就是从引导标志1转换为一般执行标志了。
[align=left] [/align]
[align=left] [/align]
[align=left]#if 0[/align]
[align=left] /* memtest */[/align]
[align=left] addr_tst1();[/align]
[align=left] addr_tst2();[/align]
[align=left] movinv1(2,0,~0);[/align]
[align=left] movinv1(2,0xaa5555aa,~0xaa5555aa);[/align]
[align=left] printf("memtest done/n");[/align]
[align=left]#endif[/align]
[align=left] [/align]
[align=left] /*[/align]
[align=left] * Launch![/align]
[align=left] */[/align]
main();
上面实现命令输入交互响应阶段。比如在键盘里输入命令并执行,都是在这个函数实现的。
pmon运行到这里,就已经把所有东西都已经初始化了,进入命令处理阶段,只要用户输入什么命令,就响应什么样的动作,回到了一个DOS系统的样子。pmon实现不少命令,可以从硬盘、U盘、光盘和网络加载其它可以执行的程序。比如你在Windows下用龙芯指令的编译器就可以编译一些小程序,或者大程序,然后让pmon帮你加载到内存里运行。如果是基于嵌入式的开发,完全可以在windows下开发,通过TFTP加载到龙芯电脑里运行。当然,你如果有伟大计划,比如编写一个操作系统,也可以直接通过TFTP加载到龙芯电脑里运行。对于开发大型操作系统的人来说,经常是一台电脑是开发机,一台电脑是目标机,这样才非常方便测试。pmon目前主要支持fat、ext2和ISO9600的文件系统,如果有其它系统程序,可以直接放到ext2的分区里,然后就可以加载了,不需要做什么样特别的安装,这样的做法是非常“环保”的,是绿色软件的。
后面会不断地介绍U盘的控制和读取文件,硬盘文件系统,还有网络的TCP/IP协议等等。
[align=left]#ifdef AUTOLOAD[/align]
[align=left] s = getenv ("al");[/align]
[align=left] autoload (s);[/align]
[align=left]#else[/align]
[align=left] s = getenv ("autoboot");[/align]
[align=left] autorun (s);[/align]
#endif
上面先从al参数里读取缺省设置的操作系统所在的目录路径,然后调用autoload函数来加载系统文件。接着下来再去看函数autoload的实现,如下:
[align=left]static void[/align]
[align=left]autoload(char *s)[/align]
[align=left]{[/align]
[align=left] char buf[LINESZ];[/align]
[align=left] char *pa;[/align]
[align=left] unsigned int dly, lastt;[/align]
[align=left] unsigned int cnt;[/align]
[align=left] struct termio sav;[/align]
[align=left] [/align]
[align=left] if(s != NULL && strlen(s) != 0) {[/align]
[align=left] dly = 1024;[/align]
上面判断是否有缺省的加载系统,如果有就设置延时为1024。
[align=left] [/align]
[align=left] SBD_DISPLAY ("AUTO", CHKPNT_AUTO);[/align]
[align=left] printf("Press <Enter> to execute loading image:%s/n",s);[/align]
[align=left] printf("Press any other key to abort./n");[/align]
[align=left] ioctl (STDIN, CBREAK, &sav);[/align]
[align=left] lastt = 0;[/align]
[align=left] do {[/align]
[align=left] ioctl (STDIN, FIONREAD, &cnt);[/align]
[align=left] delay(10000);[/align]
[align=left] if (dly % 128 == 0) printf (".");[/align]
[align=left] } while (dly-- != 0 && cnt == 0);[/align]
上面提示用户输入按键,然后不断地查询用户是否输入非ENTER按键,如果有输入,就设置cnt不为0。
[align=left] [/align]
[align=left] if(cnt > 0 && strchr("/n/r", getchar())) {[/align]
[align=left] cnt = 0;[/align]
[align=left] }[/align]
上面判断是否输入回车键。
[align=left] [/align]
[align=left] ioctl (STDIN, TCSETAF, &sav);[/align]
[align=left] putchar ('/n');[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] if(cnt == 0) {[/align]
上面判断是否自动加载操作系统。
[align=left] [/align]
[align=left] strcpy(buf,"load ");[/align]
[align=left] strcat(buf,s);[/align]
[align=left] do_cmd(buf);[/align]
上面这里执行load命令,把操作系统加载到内存。
[align=left] [/align]
[align=left] pa=getenv("karg");[/align]
[align=left] strcpy(buf,"g ");[/align]
[align=left] if(pa != NULL && strlen(pa) != 0) strcat(buf,pa);[/align]
[align=left] else strcat(buf," -S root=/dev/hda1 console=tty");[/align]
[align=left] //else strcat(buf," root=/dev/hda1 console=tty");[/align]
[align=left] [/align]
[align=left] printf("%s/n",buf);[/align]
[align=left] delay(100000);[/align]
[align=left] do_cmd (buf);[/align]
上面首先取得内核参数,然后构造g命令的参数,接着执行g命令。
[align=left] [/align]
[align=left] }[/align]
[align=left] }[/align]
}
这段程序是通过构造load和g命令实现自动加载操作系统文件,如果没有选择自动加载,就会返回到上一级的函数功能。后面执行的代码如下:
[align=left]dbginit(NULL);[/align]
[align=left] [/align]
[align=left] /*[/align]
[align=left] * Set up exception vectors.[/align]
[align=left] */[/align]
[align=left] SBD_DISPLAY("BEV1",0);[/align]
[align=left] bcopy(MipsException, (char *)TLB_MISS_EXC_VEC, MipsExceptionEnd - MipsException);[/align]
[align=left] bcopy(MipsException, (char *)GEN_EXC_VEC, MipsExceptionEnd - MipsException);[/align]
上面拷贝异常响应到0x8000 0000开始的位置,因为那里是CPU处理异常的地址。
[align=left] [/align]
[align=left] CPU_FlushCache();[/align]
[align=left] [/align]
[align=left] CPU_SetSR(0, SR_BOOT_EXC_VEC);[/align]
[align=left] SBD_DISPLAY("BEV0",0);[/align]
[align=left] [/align]
[align=left] printf("BEV in SR set to zero./n");[/align]
上面设置BEV位为0,也就是从引导标志1转换为一般执行标志了。
[align=left] [/align]
[align=left] [/align]
[align=left]#if 0[/align]
[align=left] /* memtest */[/align]
[align=left] addr_tst1();[/align]
[align=left] addr_tst2();[/align]
[align=left] movinv1(2,0,~0);[/align]
[align=left] movinv1(2,0xaa5555aa,~0xaa5555aa);[/align]
[align=left] printf("memtest done/n");[/align]
[align=left]#endif[/align]
[align=left] [/align]
[align=left] /*[/align]
[align=left] * Launch![/align]
[align=left] */[/align]
main();
上面实现命令输入交互响应阶段。比如在键盘里输入命令并执行,都是在这个函数实现的。
pmon运行到这里,就已经把所有东西都已经初始化了,进入命令处理阶段,只要用户输入什么命令,就响应什么样的动作,回到了一个DOS系统的样子。pmon实现不少命令,可以从硬盘、U盘、光盘和网络加载其它可以执行的程序。比如你在Windows下用龙芯指令的编译器就可以编译一些小程序,或者大程序,然后让pmon帮你加载到内存里运行。如果是基于嵌入式的开发,完全可以在windows下开发,通过TFTP加载到龙芯电脑里运行。当然,你如果有伟大计划,比如编写一个操作系统,也可以直接通过TFTP加载到龙芯电脑里运行。对于开发大型操作系统的人来说,经常是一台电脑是开发机,一台电脑是目标机,这样才非常方便测试。pmon目前主要支持fat、ext2和ISO9600的文件系统,如果有其它系统程序,可以直接放到ext2的分区里,然后就可以加载了,不需要做什么样特别的安装,这样的做法是非常“环保”的,是绿色软件的。
后面会不断地介绍U盘的控制和读取文件,硬盘文件系统,还有网络的TCP/IP协议等等。
相关文章推荐
- 龙芯软件开发(30)-- 自动加载操作系统
- 龙芯软件开发(30)-- 自动加载操作系统
- 软件敏捷开发平台1.0(基于框架的代码全自动生成)
- iOS AutoLayout自动布局中级开发教程(5)-修改约束的值,延迟加载
- APP软件开发加载时信号不稳定应向用户展示什么内容?
- 64位Windows2008R2操作系统下的最新JAVA开发环境所需软件下载和设置办法
- 龙芯软件开发(39)- USB协议深入分析 配置
- zedboard--实现软件开机自动运行(运行库的自动加载)(十五)
- iOS开发UI基础—30在UItableview中实现加载更多功能
- WPF开发一款软件自动升级组件
- 龙芯软件开发(34)- USB协议深入分析 设备描述符配置包
- 中国特色管理类软件项目开发之通用权限必杀技 -- 权限自由配置设定、实现智能化自动检测校验
- 龙芯软件开发(38)- USB协议深入分析 设置USB地址
- 面试题总结之MISC(操作系统,网络,算法和数据结构,数学,面向对象设计,软件开发,测试,工具)
- 电脑小技巧 教你禁止Win7、Win8自动加载软件的小技巧
- 龙芯软件开发(31)-- PCI设备查找细节
- 龙芯软件开发(33)-- USB协议深入分析
- 用python开发股票自动技术分析的软件
- 软件开发中涉及操作系统知识总结—线程、进程与协程
- 用Activex控件(cab)自动部署软件:Activex开发和发布过程与总结。