2009年1月26日 星期一

Linux Suspend 之記憶體機制

Standard
休眠(Suspend)現在已經是 Laptop 必備的電源管理機制之一,而 Suspend 又分為 s2ram(Suspen to RAM)和 s2disk(Suspend to Disk) 兩種模式。若是啟動 Suspend 的機制,可以看到 Operating System 神奇的被暫停,然後 Resume 叫醒回到之前的工作狀態。如果說想深入瞭解這樣一個機制,可以從 Linux 的休眠實作來著手,swsusp 就提供了這樣一個 User-space 的實作,我們可以研究它的sourcecode。

大體上來說,Suspend 機制不過就是儲存當時系統 Memory 狀態,然後再啟動時還原回去,在實作時,必需先鎖定當時系統下所有的記憶體空間,以確保記憶體內容不再變動,可以分別用 mlockall() 和 munlockall() 來達成這樣的任務。
#include <sys/mman.h>
int mlockall(int flags);
int munlockall(void);

flags 又分成:
  • MCL_CURRENT
    • 鎖定全部現有的記憶體分頁
  • MCL_FUTURE
    • 鎖定未來將被新增的記憶體分頁
此外,swsusp 利用了 /dev/snapshot 來對 User Space Process 和 Swap 的操作,以產生目前 System 的記憶體映像檔,/dev/snapshot 可以用 ioctl() 去控制,其命令:
  • SNAPSHOT_FREEZE
    • 鎖定使 User Space Processes 靜止
  • SNAPSHOT_UNFREEZE
    • 解除 User Space Processes 的鎖定
  • SNAPSHOT_ATOMIC_SNAPSHOT
    • 建立一個系統的記憶體快照映像檔
  • SNAPSHOT_ATOMIC_RESTORE
    • 還原系統記憶體狀態
  • SNAPSHOT_FREE
    • 釋放快照映像檔的記憶體
  • SNAPSHOT_SET_IMAGE_SIZE
    • 設定映像檔最大 Size,如果無法達到指定的 Size,kernel 會盡可能建立最小的 image
  • SNAPSHOT_AVAIL_SWAP
    • 取得可用的 Swap 大小
  • SNAPSHOT_GET_SWAP_PAGE
    • 建立一個 Swap 頁
  • SNAPSHOT_FREE_SWAP_PAGES
    • 釋放所有 SNAPSHOT_GET_SWAP_PAGE 產生的 Swap 頁
  • SNAPSHOT_SET_SWAP_FILE
    • 設定 Swap 的儲存位置
Linux Suspend 所相關的記憶機制大致上如此,當然更細節的部份還有待探討,可以在 source code 中找到更多可以研究的方向。 :P