- 论坛徽章:
- 0
|
本帖最后由 omycle 于 2011-08-26 15:13 编辑
回复 3# bsd_fan
我信啊。你可以看看代码:-
- 702 * shrink_page_list() returns the number of reclaimed pages
- 703 */
- 704 static unsigned long shrink_page_list(struct list_head *page_list,
- 705 struct zone *zone,
- 706 struct scan_control *sc)
- 707 {
- 。。。。。。
- 796 if (page_mapped(page) && mapping) {
- 797 switch (try_to_unmap(page, TTU_UNMAP)) {
- 。。。。。。
- 1444 int try_to_unmap(struct page *page, enum ttu_flags flags)
- 1445 {
- 1446 int ret;
- 1447
- 1448 BUG_ON(!PageLocked(page));
- 1449 VM_BUG_ON(!PageHuge(page) && PageTransHuge(page));
- 1450
- 1451 if (unlikely(PageKsm(page)))
- 1452 ret = try_to_unmap_ksm(page, flags);
- 1453 else if (PageAnon(page))
- 1454 ret = try_to_unmap_anon(page, flags);
- 1455 else
- 1456 ret = try_to_unmap_file(page, flags);
- 1457 if (ret != SWAP_MLOCK && !page_mapped(page))
- 1458 ret = SWAP_SUCCESS;
- 1459 return ret;
- 1460 }
- 1461
- 。。。。
- 1281 static int try_to_unmap_anon(struct page *page, enum ttu_flags flags)
- 1282 {
- 1283 struct anon_vma *anon_vma;
- 1284 struct anon_vma_chain *avc;
- 1285 int ret = SWAP_AGAIN;
- 1286
- 1287 anon_vma = page_lock_anon_vma(page);
- 1288 if (!anon_vma)
- 1289 return ret;
- 1290 //这里,利用反向映射,。。。。。
- 1291 list_for_each_entry(avc, &anon_vma->head, same_anon_vma) {
- 1292 struct vm_area_struct *vma = avc->vma;
- 1293 unsigned long address;
复制代码 欢迎指正。 |
|