自己动手增加一个新进程
如果用户想自己动手增加一个新的进程,如名为task4的进程,须在kernel.asm程序中做如下几处修改:
1.将MAXTASKS的值定义为4。
2.在程序中增加一个入口地址为task4的一段代码,功能上应为一段无限循环的、有动态信息输出的程序,如一个字符在屏幕的某行上反复滚动显示。程序不要用iret指令,否则会破坏调度程序为该进程在其堆栈内设定的调度信息。
3.在task3初始化之后,调用taskinit过程,为增加的新进程初始化,此时应将task4的入口偏移量送入ax, 即mov ax, task4。
4.将修改后的程序编译运行。
编译及安装运行
这两个程序在Linux 下采用nasm进行编译,编译为纯二进制文件,即内存映像程序,编译方法如下:
1.编译boot.asm 为boot.o
2.编译kernel.asm 为kernel.o
3.将boot.o写入软盘引导扇区
4.将kernel.o写入软盘0头0道2扇区
5.用该软盘引导机器
屏幕上将依次显示如下信息:
清屏后,在屏幕左侧有3个动态的计数器在不断显示,它们分别由kernel所调度的3个进程产生。若敲击键盘则屏幕上将显示键盘键入的字符。
此程序在以Intel Celeron 433 为CPU的PC机调试成功。在调试时需要在DOS环境下检查一下机器的定时器中断的入口地址是否为0xF000:0xFEA5,若不是,则需要修改kernel.asm中的scheduler内的call 0xF000:0xFEA5这条调用指令,使调用的入口地址为机器的实际定时器中断的入口地址。
这个实验性的操作系统模型功能较为简单,但已经具备了操作系统进程切换的完整功能,具备了多进程并行运行的特点,感兴趣的读者可以在此基础上进一步开发,使其功能进一步完善。
如果用户想自己动手增加一个新的进程,如名为task4的进程,须在kernel.asm程序中做如下几处修改:
1.将MAXTASKS的值定义为4。
2.在程序中增加一个入口地址为task4的一段代码,功能上应为一段无限循环的、有动态信息输出的程序,如一个字符在屏幕的某行上反复滚动显示。程序不要用iret指令,否则会破坏调度程序为该进程在其堆栈内设定的调度信息。
3.在task3初始化之后,调用taskinit过程,为增加的新进程初始化,此时应将task4的入口偏移量送入ax, 即mov ax, task4。
4.将修改后的程序编译运行。
这两个程序在Linux 下采用nasm进行编译,编译为纯二进制文件,即内存映像程序,编译方法如下:
1.编译boot.asm 为boot.o
# nasm boot.asm -o boot.o -f bin |
2.编译kernel.asm 为kernel.o
# nasm kernel.asm -o kernel.o -f bin |
3.将boot.o写入软盘引导扇区
# dd if=./boot.o of=/dev/fd0 bs=512 count=1 |
4.将kernel.o写入软盘0头0道2扇区
# dd if=./kernel.o of=/dev/fd0 bs=512 count=2 seek=1 |
5.用该软盘引导机器
屏幕上将依次显示如下信息:
System bootup ... Loading kernel ... |
清屏后,在屏幕左侧有3个动态的计数器在不断显示,它们分别由kernel所调度的3个进程产生。若敲击键盘则屏幕上将显示键盘键入的字符。
此程序在以Intel Celeron 433 为CPU的PC机调试成功。在调试时需要在DOS环境下检查一下机器的定时器中断的入口地址是否为0xF000:0xFEA5,若不是,则需要修改kernel.asm中的scheduler内的call 0xF000:0xFEA5这条调用指令,使调用的入口地址为机器的实际定时器中断的入口地址。
这个实验性的操作系统模型功能较为简单,但已经具备了操作系统进程切换的完整功能,具备了多进程并行运行的特点,感兴趣的读者可以在此基础上进一步开发,使其功能进一步完善。