编写自己的操作系统

 NGOS是Not Good OS的缩写。虽然我为它想出很多名字,比如tinyOS或者zealOS等等,但是很不幸,我google一下发现已经有这些个名字了。索性就把自己的OS叫做NG...NGOS是保护模式下的OS,因为是学习linux0.11的引导代码写的,所以从它的引导和加载过程,可以看出linux的影子。不过与NGOS有自己的loader,并能够在FAT32文件系统下引导运行。这是仿照windows的引导原理做的。

先谈谈实模式和保护模式。

在Intel的较早的CPU中,如8086,8088等,都只支持实模式。实模式下,参与寻址的地址线有20根,但是参与寻址的寄存器是16位的,用一个字长不能表示全部地址空间。因此,采用“段地址:偏移量”(Segment:Offset)的寻址方式,称为分段模式。
现在Intel 32位处理器的地址线一般有32根。为了保持向下兼容,就出现了A20地址线开关。A20开关关闭时,只能使用低20根地址线寻址,而且,地址会出现回卷(Address Wrap):大于FFFFFh的地址,处理器只取低20位,例如10F0FFh,寻址时,实际地址是0F0FFh。当打开A20地址开关之后,其余的地址线也能参与寻址。但是,“段地址+偏移量”所能表示的最大地址,只有FFFF0h+FFFFh = 10FFEFh。所以,即使打开了A20地址线,实模式最多可以访问的空间也只有1MB多一点。而那高于1M处的内存,被叫做高端内存区HMA(High Membory Area)。如果想要访问更多的内存,需要切换到保护模式。

 

在实模式下,没有任何保护措施,任何程序都可以通过分段机制,来访问全局内存。这样,如果一个应用程序出现错误,可能会意外修改其他程序的数据,甚至破坏操作系统的数据,系统的稳定性无法保证。保护模式的出现是为了提高多任务系统的稳定性和可靠性。保护模式提供了建立在特权级上的各种保护机制,包括段保护、页保护等存储保护,以及I/O保护等。

GDT(Global Descriptor Table),即全局描述符表,是保护模式下分段机制使用的数据结构。GDT中的表项称为段描述符(Segment Descriptor),长度为64位,它包含了段的起始地址、长度限制、类型、权限等信息。保护模式下给段寄存器赋的值,已经不是真正的段地址,而是段描述符在GDT中的字节偏移,称作“段选择子”(Segment Selector),段选择子也包含了特权信息。将段选择子赋值给段寄存器,这个动作将会使处理器访问GDT,并在权限检查通过后,加载对应的段描述符,段描述符里有真正的段基址。
IDT(Interrupt Descriptor Table),即中断描述符表,与实模式下的中断向量表很相似,它提供了中断处理程序的入口地址,称为中断门(Interrupt Gate),中断门包含了权限信息等。IDT中也包含了任务内特权级改变和任务间切换需要的数据,例如调用门(Call Gate)、任务门(Task Gate)等等。
嗯,保护模式呢,IA32参考手册里面说得很详细了。这里一句半句也说不清楚。。。。

 

NGOS是仿照Minix2.0的微内核,将内核功能独立到进程中去。目前有TTY进程和HDD任务进程,时钟任务进程等等。还有FS和MM两个高级进程(低特权级)。其中HDD并没有真正实现,只是检测的硬盘设备。FS也只支持读写TTY。。。。。还有,MM感觉问题比较大,因为也采用了minix2的内存管理模式,对线性地址的支持并不好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值