2017-03-01 4 views
1

add_to_swapを使用して特定のページを交換しています。しかし、成功()を返すこの関数を呼び出した後でも、ページテーブルエントリpte_tがまだ存在することを示すシステムが存在します。 add_to_swapはページをスワップするための適切な関数ですか、あるいは私が見なければならないLINUXカーネルの他の関数がありますか? 私はKSWAPDモジュールを見てきましたが、特定のページを交換するためにどの機能が使用されているのかわかりませんでした。LINUX KERNELで特定のページを交換する

答えて

1

add_to_swapはスペースを割り当てるだけで、ページをスワップしません。 try_to_unmapとだから、スワップのスペースを割り当てた後、ページはプロセスのVM(仮想メモリ)にすべてのマッピングのためにチェックされている

http://lxr.free-electrons.com/source/mm/vmscan.c?v=4.4#L1043

903   while (!list_empty(page_list)) { 
1043     /* 
1044     * Anonymous process memory has backing store? 
1045     * Try to allocate it some swap space here. 
1046     */ 
1047     if (PageAnon(page) && !PageSwapCache(page)) { 
1050       if (!add_to_swap(page, page_list)) 
1051         goto activate_locked; 
1052       may_enter_fs = 1; 
1054       /* Adding to swap updated mapping */ 
1055       mapping = page_mapping(page); 
1056     } 
1058     /* 
1059     * The page is mapped into the page tables of one or more 
1060     * processes. Try to unmap it here. 
1061     */ 
1062     if (page_mapped(page) && mapping) { 
1063       switch (try_to_unmap(page, 
1064           ttu_flags|TTU_BATCH_FLUSH)) 
1076     if (PageDirty(page)) { 
1078       * Only kswapd can writeback filesystem pages to 
1109       try_to_unmap_flush_dirty(); 
1110       switch (pageout(page, mapping, sc)) { 
1136     * If the page has buffers, try to free the buffer mappings 
1177     if (!mapping || !__remove_mapping(mapping, page, true)) 
1178       goto keep_locked; 
1180     /* 
1181     * At this point, we have no other references and there is 
1182     * no way to pick any more up (removed from LRU, removed 
1183     * from pagecache). Can use non-atomic bitops now (and 
1184     * we obviously don't have to worry about waking up a process 
1185     * waiting on the page lock, because there are no references. 
1186     */ 
1187     __clear_page_locked(page); 

、マップされていない:機能、which calls add_to_swapmm/vmscan.cshrink_page_listをチェック書き戻し(ダーティページ、アプリケーションによって変更されたページ、まだFSに保存されていないページ)をチェックし、バッファーをチェックし、再度マッピングをチェックしました...スワップアウトしようとしているページのタイプは?スワップするページの実際の書込みがどこで行われているのかわからない...恐らくpageoutmappingwritepageメソッドを呼び出すためです。のみ変更された(あるいは汚れ)ページがスワップファイルに保存されている - http://www.tldp.org/LDP/tlk/mm/memory.html

スワップキャッシュ:pageoutのソースはhttp://lxr.free-electrons.com/source/mm/vmscan.c?v=4.4#L530

531 * pageout is called by shrink_page_list() for each dirty page. 
532 * Calls ->writepage(). 
534 static pageout_t pageout(struct page *page, struct address_space *mapping, 
535       struct scan_control *sc) 
574   if (clear_page_dirty_for_io(page)) { 
584     SetPageReclaim(page); 
585     res = mapping->a_ops->writepage(page, &wbc); 
597     trace_mm_vmscan_writepage(page, trace_reclaim_flags(page)); 
598     inc_zone_page_state(page, NR_VMSCAN_WRITE); 

は、我々はまた、スワップおよびLinuxミリメートルが何であるかを理解する必要がありますと言います。

彼らはその後、スワップファイルにページがページとしてスワップファイルにそれを書く必要が ありませんスワップアウトされ、次回の に書き込まれた後に、これらのページが変更されない限りは、すでにあります スワップファイル。その代わりに、ページを単に破棄することができます。 のスワップシステムでは、多くの不要な高価なディスク 操作が節約されます。

はまた、 "3.8スワップアウトと廃棄ページの" http://www.tldp.org/LDP/tlk/mm/memory.html

のセクションをチェック
関連する問題