Linux缓存机制之页缓存

发表于:2012-2-29 10:24

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:bullbat    来源:51Testing软件测试网采编

  下图为地址空间与内核其他部分的关联。

  内核采用一种通用的地址空间方案,来建立缓存数据与其来源之间的关联。

  1)内存中的页分配到每个地址空间。这些页的内容可以由用户进程或内核本身使用各式各样的方法操作。这些数据表示了缓存中的内容;

  2)后备存储器structbacking_dev_info指定了填充地址空间中页的数据的来源。地址空间关联到处理器的虚拟地址空间,是由处理器在虚拟内存中管理的一个区域到设备device上对应位置之间的一个映射。

  如果访问了虚拟内存中的某个位置,该位置没有关联到物理内存页,内核可根据地址空间结构来找到读取数据的来源。

  为支持数据传输,每个地址空间都提供了一组操作,以容许地址空间所涉及双方面的交互。

  地址空间是内核中最关键的数据结构之一,对该数据结构的管理,已经演变为内核面对的最关键的问题之一。页缓存的任务在于,获得一些物理内存页,以加速在块设备上按页为单位执行的操作。

  内核使用了基数树来管理与一个地址空间相关的所有页,以便尽可能降低开销。对于基数树的理解在这里就不分析了,后面有空的时候再做分析。

  地址空间操作

  1. struct address_space_operations {  
  2.     /*将地址空间的一页或多页写回到底层设备 
  3.     这是通过向块层发出一个相应的请求来完成的*/  
  4.     int (*writepage)(struct page *page, struct writeback_control *wbc);  
  5.     /*从后备存储器将一页或多个连续的页读入页帧*/  
  6.     int (*readpage)(struct file *, struct page *);  
  7.     /*对尚未回写到后备存储器的数据进行同步*/  
  8.     void (*sync_page)(struct page *);  
  9.   
  10.     /* Write back some dirty pages from this mapping. */  
  11.     int (*writepages)(struct address_space *, struct writeback_control *);  
  12.   
  13.     /* Set a page dirty.  Return true if this dirtied it */  
  14.     int (*set_page_dirty)(struct page *page);  
  15.   
  16.     int (*readpages)(struct file *filp, struct address_space *mapping,  
  17.             struct list_head *pages, unsigned nr_pages);  
  18.     /*执行由write系统调用触发的写操作*/  
  19.     int (*write_begin)(struct file *, struct address_space *mapping,  
  20.                 loff_t pos, unsigned len, unsigned flags,  
  21.                 struct page **pagep, void **fsdata);  
  22.     int (*write_end)(struct file *, struct address_space *mapping,  
  23.                 loff_t pos, unsigned len, unsigned copied,  
  24.                 struct page *page, void *fsdata);  
  25.   
  26.     /* Unfortunately this kludge is needed for FIBMAP. Don't use it */  
  27.     sector_t (*bmap)(struct address_space *, sector_t);  
  28.     void (*invalidatepage) (struct page *, unsigned long);  
  29.     int (*releasepage) (struct page *, gfp_t);  
  30.     ssize_t (*direct_IO)(intstruct kiocb *, const struct iovec *iov,  
  31.             loff_t offset, unsigned long nr_segs);  
  32.     int (*get_xip_mem)(struct address_space *, pgoff_t, int,  
  33.                         void **, unsigned long *);  
  34.     /* migrate the contents of a page to the specified target */  
  35.     int (*migratepage) (struct address_space *,  
  36.             struct page *, struct page *);  
  37.     int (*launder_page) (struct page *);  
  38.     int (*is_partially_uptodate) (struct page *, read_descriptor_t *,  
  39.                     unsigned long);  
  40.     int (*error_remove_page)(struct address_space *, struct page *);  
  41. };

32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号