几年前,当我还是个纯粹的码农,那个时候的想法还很纯粹---弄一个自己的操作系统出来。额。。但是几个月以后,因为其他的事情,哎。不得不放弃TC操作系统。那个时候最后达到的效果,也就只是将CPU从保护模式切换到实模式,并且能够在屏幕上显示类似黑客帝国一样一个简单动画。以后有机会我还是想把我的TC操作系统完成,至少能够达到内存地址的映射管理和任务的调度切换。
1.准备知识:
汇编:汇编是必须的,特别是再前期启动时候,我当时做的时候,尝试过绕考汇编,后来发现。。呵呵。我这里使用的汇编是AT&T格式的。包括内嵌汇编。
X86的系统构架:x86系统的系统的基本硬件体系构架也是必须要掌握的。否则完全就不能做,这里我推荐看下intel的官方手册。能够让你全面了解,x86的所有寄存器作用,实模式和保护模式的切换,其硬件上的内存地址映射过程和原理,任务的切换和中断实现。
bochsrc: bochsrc是一个虚拟机,它的优势在于,可以单步调试并且小巧精干,我个人是比较喜欢用的,特别是它的单步调试,前期帮了我很大的忙。
编译:编译和连接基本都是用的GCC和Makefile完成。
好嘛,不P话了。。上图上真相。
图1 TCOS效果图1 图2 TCOS效果图2简单流程:
1.MBR启动调用int 0x02号中断,将后面的程序读取到内存0x0000:0x9000处,然后通过jump跳转到0x0000:0x9000。这个是在bootsec.asm中
2.这个步骤比较关键,很多细节需要了解X86体系才能更好的理解,说起来比较简单,设置GDT表,设置IDT表,并且将CPU从保护模式切换到实模式。最后跳转到设置好的GDT。实际上,这里要讲的话,很多,后面有专门的专题说明。这个实现是在head.asm
3.设置相应的寄存器,call main,注意,这个已经都到了实模式和,所以寻址方式和以前的保护模式完全不一样了哦。。
4.后面的流程就是大家熟悉的C语言搞的了。。需要说明的是。有些部分是用的内嵌汇编实现了。
具体的实现细节再后面详细说明。本来想法所有的工程文件上传上来的。结果没有发现有地方上传,就贴两个相对独立的文件嘛:
1.bochsrc的配置。
###############################################################
# bochsrc.bxrc file for Tinix.
###############################################################
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file=$BXSHARE/BIOS-bochs-latest
#vgaromimage: $BXSHARE/VGABIOS-elpin-2.40
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
# what disk images will be used
#floppya: 1_44=floppy.img, status=inserted
# choose the boot disk.
boot: disk
# where do we send log messages?
log: bochsout.txt
# disable the mouse, since Tinix is text only
mouse: enabled=0
# enable key mapping, using US layout as default.
# keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-us.map
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, mode=flat, path=TerryCheng.img
网友评论