1660_MIT 6.828 JOS初始化boot_alloc的初步实现

文章介绍了对Unix操作系统中页目录和用户虚拟页表的理解,以及分页管理机制的细节。作者讨论了如何为pages页表分配存储空间,并聚焦于boot_alloc函数的实现,这是一个用于内存分配的函数。文中给出的代码实现是内核初始化时的存储分配策略,确保不覆盖内核区域,并避免存储溢出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)

         这一次的小结有一点没底气,因为感觉实现的过于简单,可能跟正确的结果有一定的差距。但是,临时没有找到功能测试的方法,因此暂时先整理一下。另一个必须要做一部分整理的原因是,如果继续扩展当前的思考区域,那么这个洞就越挖越深了,我怕扩展太大之后收起来很难。因此,先做一个简单的小结,如果后续发现错了重新按照争取的方式整理。

         这一行代码其实还是容易理解的,kern_pgdir数组是内核的页目录。PDX(UVPT)是一个获取页目录索引的方式,而处理的对象UVPT是用户虚拟页表,一个用户只读的用户页表。

         关于上面的UVPT在整个OS存储中的分配位置可以参考上面的这个存储分布说明。那么,这一行代码实现了一个什么功能呢?这一行代码让分页管理的机制处理kern_pgdir虚拟地址的时候,把kern_pgdir的地址映射到kern_pgdir的物理地址上。也就是说,处理这个页目录表的时候会直接去物理存储上去操作这个页目录信息。

         接下来,给pages页表分配存储空间。Pages是用来管理整个物理存储的一个页状态数组。而npages则是当前的系统中物理存储的大小,单位是page。这些,可以从上面的代码注释中获知。

         那么,应该给这个数组信息分配多大的空间呢?肯定是一个物理页分配一个状态信息,如此大小就可以计算出来。

         之后,我们这一次处理的一个关键问题来了:如何实现boot_alloc()函数?

         代码中的这个函数是一个半成品,或者说只是一个框架。这里说明了改实现什么效果。如果传入的参数n大于0,那么分配指定的存储,按照page大小对齐。如果n为0,那么返回下一个可用的page的地址。分配完的存储,不要进行初始化。如果存储超限了,需要panic。接下来,先按照我自己的思路梳理第一次的实现尝试。

         这一段代码其实还是很容易理解的,end其实是链接文件中定义的,这个数值其实是内核所占用的存储的最后的地址。现在,在初始化的时候通过对齐取整的方式来保证内核所在的page不会被分配。真正被分配的区域也就是内核结束后的一个page开始。

 

         这是我根据注释的要求,临时做的一个代码实现。Panic的地址范围判断应该是KERNBASE空间之后的超过总的物理存储区的时候。因为,在内核设计的时候,存储应该是进行了重新映射的。

         再次回顾一下这个存储的分布设计,这样就能够更加明确一些。之前,我还在考虑是否是需要考虑两部分存储的连续性,是否需要考虑跳过IO映射区域。后来想了一下,应该是不需要,因为两块区域都是按照page对齐的。因此,能够完成到这个虚拟地址的映射。

         这是修改之后JOS启动的效果,这里面已经有了对boot_alloc()接口的调用。但是,至少可以看到没有出现存储溢出。这并不是一个完整合理的测试,但是目前来说暂且看到这样的效果就结束了。这个接口的设计是否合理,或许还得继续往后调试其他功能才能够体会到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值