博文

目前显示的是 三月, 2013的博文

How to deal with VIPT alias? – Page colour

为获得更好的阅读体验,请移步: http://tek-life.github.io/blog/how-to-deal-with-vipt-alias-page-color/ Agenda Introduction Cache aliases issue for VIPT How to solve alias Implement in Linux Introduction VIPT是Cache的一种Policy。如果 Cache_Size/numbers_of_way > Page_Size/Cache_Line_Size 就会产生alias问题。 Cache aliases issue for VIPT 何谓alias If the same PA is mapped into the different VAs, they could have different virtual indexes and certainly has the same physical tags, so multiple cacheline might have data for the single PA. Reference From: http://mail-index.netbsd.org/port-sh3/2006/09/07/0000.html alias会造成什么问题 由于相同的物理页在Cache中有多份拷贝,那么某一份拷贝更改而没有及时刷( clean )到Memory中,其他的Cache拷贝就不能获知其更改,而造成错误。 How to solve alias issue 解决alias问题的方法有以下三种 1. 存在多VA映射的物理页的PTE(page table entry)中的属性全部设置为 uncacheable. 2. flush cache 3. 多VA映射相同的物理页,如果能让VA在索引Cache的时候,都索引到相同的Cache sets中,那就不会产生alias问题了(因为在Cache set中识别Cache是否命中是用Physical Address Tag)。 第一种uncacheable的方法让memory不进Cache缓存的方式不可取,因为会导致系统的性能急剧下降。

Cache Behaviour in Linux -- Cache Policy识别情景分析

Linux在boot的过程中判断cache policy的入口是cacheid_init(). 297 static void __init cacheid_init( void ) 298 { 299 unsigned int cachetype = read_cpuid_cachetype(); 300 unsigned int arch = cpu_architecture(); 301 302 if (arch >= CPU_ARCH_ARMv6) { 303 if ((cachetype & ( 7 << 29 )) == 4 << 29 ) { 304 /* ARMv7 register format */ 305 arch = CPU_ARCH_ARMv7; 306 cacheid = CACHEID_VIPT_NONALIASING; 307 switch (cachetype & ( 3 << 14 )) { 308 case ( 1 << 14 ): 309 cacheid |= CACHEID_ASID_TAGGED; 310 break ; 311 case ( 3 << 14 ): 312 cacheid |= CACHEID_PIPT; 313 break ; 314 } 315

认识Linux物理内存回收机制

图片
Agenda 1.     All channels for page freeing 2.     Overview for page frame reclaiming 3.     Sync. Reclaiming 4.     Async. Reclaiming Introduction 本文所讲的物理页面回收是指动态的回收:即,空闲的内存不够用的时候,系统采取相应的方法将正在使用的内存释放,补充空闲内存,以满足内存的分配。 Text 1. All channels for page freeing 。首先先简单看一下系统中的内存释放的三种渠道。 1-1>. 在用户进程退出的时候,释放内存。当用户进程退出的时候,会调用 do_exit. do_exit 最终会调用 free_pagetables 函数。该函数的作用是:遍历 vma ,根据 vma 中的虚拟地址找到实际的物理页,将其释放。在之前讲过,对于用户进程的虚拟地址区间,是以红黑树组织的。 1-2>. 手动的释放。在驱动中,分配内存使用 alloc_pages() ,释放内存用 free_pages( 这一点,类似于 c 语言中的 malloc 和 free) 。必须配对使用。否则会造成内存泄漏。 1-3>. 按需求调用内存回收例程来释放内存。这个区别于前两种的最大不同:它是动态的,按需的。当内存不够的时候,系统会自动按照一定的方式,将某些正在使用的内存释放掉,放进 buddy system 中再利用。 2.   Overview for page frame reclaiming 。 2-1>. 先来看一下内存将会回收哪些页面 用户进程的页面都是通过 page fault 进行分配的。通过 page fault 进行分配的页面都是可以进行回收的。 这些页面总体可以划分为两种,分别是文件页 (file cache) 和匿名页 (anonymous cache). 文件页,顾名思义,它是和外部存储设备上的某个文件相对应。匿名页,其内容不来自于外部存储设备,例如用户进程中的堆栈。这两种页面是内存回收的目标页面。 2-2>. 内存回收采用的主要算法是近似于 LRU 的算法。位于 LRU 链表前面的页是

page frame reclaiming 两个链表的总结

Agenda 1. Introduction 2. lru_rotate_pvecs链表的作用。 3. lru_deactive_pvecs链表的作用。 Text 1. Introduction 在swap.c文件中,定义了几个链表:  39 static DEFINE_PER_CPU(struct pagevec[NR_LRU_LISTS], lru_add_pvecs);  40 static DEFINE_PER_CPU(struct pagevec, lru_rotate_pvecs);  41 static DEFINE_PER_CPU(struct pagevec, lru_deactivate_pvecs); lru_add_pvecs这个链表的作用很清除。加入到zone中对应链表的时候,需要它来进行中转过渡。其余的两个链表是在" 902aaed0d983dfd459fcb "这个patch中加入的。 2. lru_rotate_pvecs这个链表的作用: 对于正在writeback的页,如果被回收,那么需要把该页移到inactive链表的尾部。等待再次被回收。使用该链表的函数是:rotate_reclaimable_page(). 调用该函数的上层函数是: end_page_writeback(). 与end_page_writeback()配对的是set_page_writeback(). 当一个页要写出到外部存储设备的时候,先设置set_page_writeback, 然后将该页的写指令提交到通用块设备队列中。当写完后(unlock_page()成功返回),调用end_page_writeback().  end_page_writeback所做的工作是:  598 /**  599  * end_page_writeback - end writeback against a page  600  * @page: the page  601  */  602 void end_page_writeback(struct page *page)  603 {  604         if (TestCl