自己动手写操作系统P121 对SelectorFlatRW和SelectorFlatC的描述

事实上,在pmtest7.asm中我们用两个段分别存放页目录表和页表(LABEL_DESC_PAGE_DIR存放页目录表,LABEL_DESC_PAGE_TBL存放页表)是为了让读者阅读时更加直观和形象。在pmtest8.asm中,我们把它们放到同一个段中,同时把增加的一套页目录和页表也放到这个段中。

为了操作方便,我们新增加一个段FLAT,其线性地址空间为0-4GB。由于分页机制启动之前线性地址等同与物理地址,所以通过这个段可以方便地存取特定的物理地址。此段的定义如下:

LABEL_DESC_FLAT_C:   Descriptor 0,0fffffh,DA_CR|DA_32|DA_LIMIT_4K

LABEL_DESC_FLAT_RW:Descriptor 0,0fffffh,DA_DRW|DA_LIMIT_4K

SelectorFlatC    equ    LABEL_DESC_FLAT_C----LABEL_GDT

SelectorFlatRW equ    LABEL_DESC_FLAT_RW----LABEL_GDT

我们之所以用了两个描述符来描述这个段,是因为我们不仅仅要读写这段内存,而且要执行其中的代码,而这对描述符的属性要求是不一样的。这两个段的段基址都是0,长度都是4GB。

我们原来并没有把页表个数保存起来,而现在我们不只有一个页目录和页表,为了初始化另外的页表时方便起见,在这里增加了一个变量PageTable Number,页表的个数就存在里面

在整个初始化页目录和页表的过程中,es始终为SelectorFlatRW。这样,想存取物理地址的时候,只需将地址赋值给edi,那么es:edi指向的就是相应的物理地址。

设计一个Flat段,尽管他的基址为0,这样做的好处是逻辑很清楚,只要用到这个段名,他们涉及到的代码和数据就都在这个段里。这样就不会混乱。

posted on 2011-05-09 15:04  wanghj_dz  阅读(467)  评论(0编辑  收藏  举报

导航