最近一直在看《Orange's一个操作系统的实现》第二版,这是一本很有意思的书,完全从实验的方法展示一个简单操作系统的启动、进程管理、内存管理等方面。随书光盘可以在这里下载
前天读到第三章《保护模式(Protect Mode)》的3.3节《页式存储》,在实验3.3.6小节《克勤克俭用内存》的程序的时候,遇到了问题。代码见这里
安装程序设计的流程,程序为一个COM,先获得内存的e820图,初始化一些描述符,然后跳到保护模式,显示获得的内存图,接着初始化页目录和页表,启用分页,最后退出分页和保护模式,退出到DOS。
我从头到尾手工敲入了源代码,可是在执行这个程序的时候,总是在“初始化页目录和页表,启用分页”的时候bochs自动重启。
后来发现,是我的bochsrc配置文件中内存设置超过了32M,于是在写入页表的时候,超出了描述符的限长,导致出错。调试的过程中还发现DispInt会修改eax的值,需要在开始的时候将eax压栈,并在结束的时候弹出。郁闷阿,我是一行一行注释代码才找出问题的——不会用debug调试com——花了我两天的时间哪!
LABEL_DESC_PAGE_TBL Descriptor PageTblBase, 4096 * 8 - 1, DA_DRW ; 注意那个8,当bochsrc中的megs超过8*4(M)时,初始化页目录就会超过这个描述符的限长,导致出错。由于没有保护模式下的中断处理程序,所以bochs就直接重启了。
3.3.7《进一步体会分页机制》使用平坦内存而不是分段内存方式,所以就没有这个问题了。