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

本文介绍了一种使用分页机制管理内存的方法,通过设置页目录表和页表来实现内存的有效利用。文中详细解释了如何通过定义Flat段简化对物理地址的操作,并介绍了用于描述此段的两个描述符。

事实上,在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,这样做的好处是逻辑很清楚,只要用到这个段名,他们涉及到的代码和数据就都在这个段里。这样就不会混乱。

转载于:https://www.cnblogs.com/wanghj-dz/archive/2011/05/09/2041178.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值