# Day 27 Page Migration (二)

文件

核心中使用 migrate_pages()
=========================

1. 将分页从 LRU 串列中移除

   要被迁移的分页串列们是透过扫描各个分页,
   并将之移动到串列中而产生。
   这是由呼叫 isolate_lru_page() 来达成。
   呼叫 isolate_lru_page 增加对分页的引用数量,
   所以便在分页迁移发生时它不会消失。
   它还可以防止 swapper 或其他扫描遇到该分页。

2. 我们需要一个 new_page_t 类型的函数,
   可以被传递给 migrate_pages()。
   这个函数需要知道,在给定一个旧的分页下,
   如何正确地分配一个新的分页。

3. 呼叫 migrate_pages() 函数来尝试做迁移。
   它会呼叫函数来为每个有被考虑要做迁移的分页分配新的分页。

migrate_pages() 是如何运作
=========================

migrate_pages() 会对其分页串列进行多次的处理。
如果对该分页的引用在某时刻是可以移除的,则该分页就会被移动。
该分页已经透过 isolate_lru_page() 从 LRU 串列中被移除,
且该分页的引用数目已增加,使得该分页不会在分页迁移的过程中被释放。

步骤:

1. 将要被迁移的分页上锁。

2. 确认已经完成写回(writeback)。

3. 将要迁移到的新分页上锁。
   该分页已被上锁,所以对它的存取 (尚未更新)
   会马上锁住,而迁移正在进行。

4. 所有对该分页的分页表引用都转换为迁移项。
   这会减少分页面的 mapcount 。
   如果减少後的 mapcount 不为零,那麽我们不迁移页面。
   所有尝试去存取该分页的使用者空间程序,
   现在将会在获取分页锁上等待解锁。
   尝试访问页面的进程现在将等待页面锁定。
   
5. i_pages 锁已被持有。
   这会使得所有尝试透过映射去存取该分页的程序,
   在 spinlock 中阻塞。

6. 分页的索引数目会被检视。
   如果有残存数目那麽我们就罢手,
   否则我们会知道我们正是唯一正在所引这个分页的使用者。
   
7. radix tree 会被检视,而若该 tree 并为包含指向本分页的指标,
   那们我们罢手,因为有人有修改过这个 tree。

8. 新分页已被设置了旧分页的设定,
   以使新分页的存取能有正确的设定。

9. radix tree 被修改程指向新的分页。

10. 旧分页的引用计数会被弃置,
    因为定址空间的索引已消失。
    建立对新分页的引用,
    因为该新页面被定址空间所引用。

11. i_pages 的锁被弃置。
    当可以在映射中寻找时,
    程序会从在锁上 spinning 变成在上锁的新分页上睡。
    
12. 分页内容被复制到新的分页。

13. 剩余的分页旗标会被复制到新的分页。

14. 旧分页的旗标被清除以表示该分页不再提供任何资讯。

15. 在新分页上,将 writeback 排进队列这件事情被触发。

16. 如果迁移项目是分页的话,将他们带换成实际的 ptes。
    如此的操作可以使得,
    没有在等待分页锁的使用者空间的程序可以进行存取。

19. 新旧分页的分页锁都被移除。
    在分页锁上等待的程序,会重新执行他们的分页错误流程
    并且抵达到新的分页。

20. 新的分页被移动到 LRU 串列,且可已被 swapper 等等所扫瞄。

我的理解

  • migrate_pages() does several passes over its list of pages. 这里的 pass 和 compiler 会做几次 pass 来产生出结果的 pass 应该是一样意思,表示会经过多次的处理。
  • page cache 使用的 data structure 是 radix tree
  • 文件开始描述一些我并不是很熟悉的细节了!XD

参考资料

延伸阅读


<<:  [Day26] 制作测试场景

>>:  RISC-V: R-type 算术指令

Day30 - 铁人赛总回顾

没想到居然从第一天慢慢坚持到最後一天了! 这三十天中,我们快速学习了Java的语法,包含基本型态、型...

在Windows 10中更改Windows应用商店下载的位置

大多数应用程序都可以安装在非系统磁碟机上。但是,某些应用程序无法安装或移至系统磁碟机以外的磁碟机。因...

Day13 - 物理模拟篇 - 弹跳球世界IV - 成为Canvas Ninja ~ 理解2D渲染的精髓

终於来到弹跳球的最後一部分~ 这篇我们主要就是要讲解倾斜面存在的状况下,程序的撰写方法! 老实说我原...

【Day11】Git 版本控制 - git clone & git pull

已经讲解完「如何将档案在本地数据库与 GitHub 进行版本控制」後,接下来,我们来讲讲 git c...

身体惯性-螃蟹改不了横行

早起运动Day8 - 身体习惯​ ​ 不假思索的起床,做第一件事情以後就会带到第二件事情。​ 就像看...