do_set_pmd
統計參數只會在這里設置:
add_mm_counter(vma->vm_mm, MM_FILEPAGES, HPAGE_PMD_NR);
?但是這貌似都是處理大頁的情況哪,小頁呢?
alloc_set_pte中有函數:inc_mm_couter_fast(vma->vm_mm, mm_couter_file(page))
?其中,mm_counter_file是在include 目錄下設置的,注意一下,這個函數返回的是頁的類型,有兩種類型,一種是:
1446 static inline int mm_counter_file(struct page *page) 1447 { 1448 if (PageSwapBacked(page)) //如果這個頁是被swap出去了,那么這個頁就是MM_SHMEMPAGES, 1449 return MM_SHMEMPAGES; 1450 return MM_FILEPAGES; 1451 } 1452
SHMEMPAGES 感覺和ANON/FILE是兩種不同的考察維度呀,也就是說匿名頁和filebacked的頁都是可以當做SHMEM來用的。好像不對啊,匿名頁就是匿名頁,如果是可以共享的,也就是說MAP_ANONYMOUS? 和 MAP_SHARED 是可以同時設置的?【結論MAP_ANONYMOUS和MAP_SHARED是不可以同時設置的】,
PRIVATE 和 SHARED 都是對于文件來說的,是說多個
[什么叫做共享內存的頁呀: 下面這個patch中加了這個統計項,patch大致思想是:目前共享內存的頁,都和file-backed的文件一起去統計了(實際共享內存后面掛載的設備是/dev/zero,我們沒辦法看到共享內存的頁了,所以這個patch就是解決的就是區分這兩種頁]
eca56ff906bdd0239485e8b47154a6e73dd9a2f3
?那么下面一個問題還是沒有解決,為什么mm_counter_file中統計出來的page只會去統計MM_SHMEM / MM_FILE
?除了匿名頁之外,有兩種頁:共享內存的頁還有文件backed的頁
MAP_ANONYMOUS 是不能單獨出現的
SHMEMPAGES既可以當做
?這一部分好好講講文件系統的mmap file-backed
[ 一個進程所有的頁的類型包括:匿名頁,文件backed的頁,共享內存的頁,swap出去的頁.]
私有的文件映射如果改動的話會發生啥事情
《Linux環境編程》對該部分的解釋有亮點,但是避重就輕,過多地去講在MAP_SHARED的情況下,內存映射是如何完成的,比較難理解的是私有映射是如何完成的:
如果我設置了私有的映射,并且還具有寫權限,這個時候如果發生了寫,操作系統是如何實現的呢?這種情況也分明是存在的!
猜想:這個時候會發生寫時寫時復制機制,不會影響到文件的內容:【測試程序:
https://github.com/honpey/codebox/blob/master/mmap/mmap_file_private.c
】
設置了文件的MAP_PRIVATE 標志之后,我們發現,此時寫入的任何東西都不會保存,所以我們就大膽猜想,初始化時,是做了一個映射,但是第一次訪問之后,發生了缺頁中斷,而這個缺頁中斷的作用是從pagecache中copy一份數據到新的page中,即所謂的寫時復制!這是file-backed mmap類型的寫時復制。
這個
?