uCOS的bootloader (PC机)


uCOS-II提供的例子编译成EXE文件,在DOS,Windows下可以直接运行,方便调试。

但uCOS-II本身就是个小型操作系统,是否可以让PC启动后直接加载运行uCOS系统呢?

之前研究的FreeDOS系统,就是先编译成EXE文件,然后转成bin文件,用boot引导后运行的。uCOS应该也可以。

OK,先设置好环境,参考 深入分析FreeDos – 编译

uCOS-II代码下载:ucos-II

编译步骤:
tcc -I. -Ic:\tcc\include -Lc:\tcc\lib -c -ml -1 -G -O -Z -d -k- -v -vi- -wpro uCOS_II.C
tcc -I. -Ic:\tcc\include -Lc:\tcc\lib -c -ml -1 -G -O -Z -d -k- -v -vi- -wpro OS_CPU_C.C
tcc -I. -Ic:\tcc\include -Lc:\tcc\lib -c -ml -1 -G -O -Z -d -k- -v -vi- -wpro PC.C
tcc -I. -Ic:\tcc\include -Lc:\tcc\lib -c -ml -1 -G -O -Z -d -k- -v -vi- -wpro Test.C
c:\tasm\bin\tasm /MX /ZI /O OS_CPU_A.ASM

tlib my +os_cpu_a+os_cpu_c+pc+ucos_ii+test
tlink /v /s /c c0l,test,test,my+emu.lib+mathl.lib+cl.lib

exeflat TEST.EXE KERNEL.SYS 0x60

上面的步骤,编译源码,生成TEST.EXE文件,用extflat将TEST.EXE转为bin文件并设置内存偏移为0x600,保存为KERNEL.SYS文件

至于设置0x600偏移,参考:深入分析FreeDos – 引导代码

可以利用FreeDos的引导代码将uCOS载入内存,执行main函数,而main函数的地址,可以通过上面编译输出的MAP文件获取,我这里的是06E7:0003

然后就是修改引导代码,读取KERNEL.SYS,放置到内存偏移0x600处,再jmp到main函数即可。

有两个地方需要修改,一个是DS寄存器,设置为0x06E7,还有个是IP寄存器为0x6E73,代码修改如下:

pic

修改好的引导代码: boot.asm

编译:
nasm -dISFAT12 boot.asm  -o boot.bin

最后就是创建个1.44M的虚拟软盘,将boot.bin放到引导扇区中,设置然盘为Fat12文件系统,将KERNEL.SYS存入进去。

嫌麻烦的话,可以用我写好的工具,buildimg.c, 用tcc编译,运行后输出dostest.img

参考深入分析FreeDos – 编译,用x86模拟器运行这个虚拟然盘即可。


上篇: 深入分析FreeDos -- 后续 下篇: uCOS/II -- 利用映射找到最高优先级Task