GreyZhang/g_unix: some basic learning about unix operating system. (github.com)

         继续往下分析JOS的启动,上一次解决了check_page_free_list()中遇到的一些问题。继续往下,会是一个分配的检查。

1663_MIT 6.828 JOS页面的分配与回收_linux

         这部分执行的时候会出现panic。

1663_MIT 6.828 JOS页面的分配与回收_unix_02

         以上是运行时候的错误提示。

1663_MIT 6.828 JOS页面的分配与回收_MIT_03

         其实,看到这里就很清楚为什么出错了,因为page分配的接口没有实现。

1663_MIT 6.828 JOS页面的分配与回收_JOS_04

         关于这个函数接口的实现其实还是容易的,因为这个动作的定义比较具体。在动作上,只是分配一个页面,而传入的参数是存储初始化属性的指定。更重要的一点,这里还给出来了用到的接口。有了这些信息之后,完成这个接口其实就跟做一个拼图差不多了。

1663_MIT 6.828 JOS页面的分配与回收_unix_05

1663_MIT 6.828 JOS页面的分配与回收_unix_06

         这一次的运行效果结合代码信息可以看得出来,至少是前面的测试是通过了。接下来,再去理顺其他的接口。

1663_MIT 6.828 JOS页面的分配与回收_unix_07

         单纯的一个页面的释放占用还是很容易实现的,不过按照这里的提示这里加了一个panic防止出现占用中的存储被释放的情况。而存储的释放过程其实很简单,就是把相应的page插入到page_free_list链表之上。

1663_MIT 6.828 JOS页面的分配与回收_linux_08

         继续看这个页面分配的检查接口,在检查完了页面的分配以及回收之后,进一步检查了对于分配的存储的写入操作。除此之外,分配时候的清零操作等特殊的处理也做了测试。一切测试结束后,恢复之前的page_free_list。

1663_MIT 6.828 JOS页面的分配与回收_unix_09

         最后,释放当前获取到的page,检查了链表中page的数目。这个链表的元素数目在最开始的时候进行了一个统计,这里通过统计一个丢弃一个的方式完成了“蜕壳”处理。最后出入的信息应该是对等的。

1663_MIT 6.828 JOS页面的分配与回收_MIT_10

         这是最初的处理,尤其值得注意的是这里的操作是在链表出现变化之前的操作。

1663_MIT 6.828 JOS页面的分配与回收_MIT_11

         处理完之后的测试,从测试的结果看到存储分配以及回收部分的测试现在是通过了。当然,这里又看到了一个异常问题。这个问题的解决,这个留待下一次探索了。