HIT软件学院第五次OS实验

继之前的实验的各种衰,今天终于把实验五搞得略懂略懂。

 

本次实验的基本内容是:

1.用Bochs调试工具跟踪Linux 0.11的地址翻译(地址映射)过程,了解IA-32和Linux 0.11的内存管理机制;

2.在Ubuntu上编写多进程的生产者—消费者程序,用共享内存做缓冲区;

3.在信号量实验的基础上,为Linux 0.11增加共享内存功能,并将生产者—消费者程序移植到Linux 0.11。

 

实验指导书书上有说,第一个实验内容不需要耗费太多的脑细胞,其实还是要消耗一些的,你要记住这些过程,最好知道这些过程是干什么的。

 

第一个实验内容指导书的表述顺序不是很合理,很容易把人搞蒙,下面我简要介绍一下第一个实验内容的操作顺序以及基本原理。

 

通过在Bochs中的输出,我们可以看到变量i的逻辑地址是0x3004,这一结果也可以从ubuntu下的终端中看到,详细一点是:ds:0x3004,ds表明这个地址属于ds段。根据linux0.11内存的分段管理机制,我们知道ds寄存器中的内容就是ds段的段选择符(段选择子),通过sreg命令看到ds的内容是0x0017,根据段选择子每位的定义,我们可以知道TI=1.也即我们要查找当前进程的LDT表而不是直接查找系统的GDT表(GDT与LDT,建议大家好好研读一下这篇文章,对理解后面的实验过程很有帮助),而且索引值为2(十进制),表示要查找LDT的第3个段描述符。

 

那么接下来的问题是,我们说查找LDT,到哪里去找LDT呢?我们可以通过sreg命令看到ldtr的值,这个值就是LDT在GDT中的描述符的索引。GDT的位置已经由gdtr明确给出,可以通过命令查看。这样,知道了GDT的位置和我们要找的LDT描述符在GDT中的索引值,就可以找到我们要找的LDT在GDT中的描述符了,在根据GDT中描述符每位的含义,就能根据这个描述符知道我们要找的LDT表的物理地址(就是该描述符某几位数字的组合),找到了LDT表的物理地址,就可以通过命令查看LDT表的内容了。

 

上文说到,我们要找LDT的第三个段描述符,而且刚才也介绍了怎样查看LDT的内容,这不就行了么!赶紧看看LDT第3个描述符(每个段描述符64位)是什么鸟东西(如何查看详见指导书),查看后发现是这货:0x00003fff 0x10c0f300,通过段描述符每位的含义,我们终于知道了ds段的在线性空间的基地址是:0x10000000(实际上也是段描述符某些位的组合)。这样,段基址+段内偏移,就是变量i的线性地址了:0x10000000 + 0x3004 = 0x10003004。

 

接下来要做的事情从32位线性地址中分析出物理地址。我们从32位线性地址中可以得到页目录号、页表号和页内偏移,它们分别对应了32位线性地址的10位+10位+12位,所以0x10003004的页目录号是64,页号是3,页内偏移是4。

 

IA-32下,页目录表的位置由CR3寄存器指引。creg命令可以看到CR3寄存器的内容,从而找到页目录表的物理地址(是页目录表的物理基地址,或者说是首地址),知道了页目录的首地址,赶紧看看页目录里第65项(从0开始)存的页目录项是什么吧!通过命令查看(详见指导书)了第65个页目录项的内容,再根据页目录项内容是什么含义就能知道我们要找的页表的起始地址了。知道了我们要找的页表的起始地址,我们赶紧看看这个页表第4个页表项(从0开始)是什么!通过命令查看(详见指导书)后,我们得到了这个页表的第4项:0x00faa00c : 0x00fa7067。页表项中某些位的组合就是它对应的那页内存的物理起始地址,上文已经说到页内偏移是4,这样,我们得到了变量i的物理地址:0x00fa7004,这就是地址映射的全部过程,个人感觉指导书上的叙述顺序不容易让人理解,本文才是正常的顺序。

 

后面的内存共享,要用到两个很重要的函数:put_page( )和get_free_page( )。在编写相应的系统调用之前建议大家先研读赵炯博士的书,了解一下一个进程在内存中是如何存放的,会很有帮助。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值