<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.jackslab.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-cn">
		<id>http://wiki.jackslab.org/index.php?action=history&amp;feed=atom&amp;title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0003%3A_MIPS_Cache_%E6%93%8D%E4%BD%9C%E6%97%B6%E7%9A%84%E5%A5%87%E6%80%AA%E7%8E%B0%E8%B1%A1</id>
		<title>捉虫日记 0003: MIPS Cache 操作时的奇怪现象 - 版本历史</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.jackslab.org/index.php?action=history&amp;feed=atom&amp;title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0003%3A_MIPS_Cache_%E6%93%8D%E4%BD%9C%E6%97%B6%E7%9A%84%E5%A5%87%E6%80%AA%E7%8E%B0%E8%B1%A1"/>
		<link rel="alternate" type="text/html" href="http://wiki.jackslab.org/index.php?title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0003:_MIPS_Cache_%E6%93%8D%E4%BD%9C%E6%97%B6%E7%9A%84%E5%A5%87%E6%80%AA%E7%8E%B0%E8%B1%A1&amp;action=history"/>
		<updated>2026-09-11T05:21:30Z</updated>
		<subtitle>本wiki的该页面的版本历史</subtitle>
		<generator>MediaWiki 1.19.2</generator>

	<entry>
		<id>http://wiki.jackslab.org/index.php?title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0003:_MIPS_Cache_%E6%93%8D%E4%BD%9C%E6%97%B6%E7%9A%84%E5%A5%87%E6%80%AA%E7%8E%B0%E8%B1%A1&amp;diff=18554&amp;oldid=prev</id>
		<title>Comcat：/* 现象 */</title>
		<link rel="alternate" type="text/html" href="http://wiki.jackslab.org/index.php?title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0003:_MIPS_Cache_%E6%93%8D%E4%BD%9C%E6%97%B6%E7%9A%84%E5%A5%87%E6%80%AA%E7%8E%B0%E8%B1%A1&amp;diff=18554&amp;oldid=prev"/>
				<updated>2025-12-04T02:49:27Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;现象&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;←上一版本&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;2025年12月4日 (四) 02:49的版本&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第299行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第299行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;== Reference ==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;* [[GNU/Linux 内核移植捉虫笔记 (Linux Kernel Debug Notes)]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Comcat</name></author>	</entry>

	<entry>
		<id>http://wiki.jackslab.org/index.php?title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0003:_MIPS_Cache_%E6%93%8D%E4%BD%9C%E6%97%B6%E7%9A%84%E5%A5%87%E6%80%AA%E7%8E%B0%E8%B1%A1&amp;diff=2284&amp;oldid=prev</id>
		<title>Comcat：以“== 现象 ==  本意想用如下的函数人为地将 Cache 的某个组的所有行的Tag 强制写为相同的值，然后访问一个索引到这个组的地址...”为内容创建页面</title>
		<link rel="alternate" type="text/html" href="http://wiki.jackslab.org/index.php?title=%E6%8D%89%E8%99%AB%E6%97%A5%E8%AE%B0_0003:_MIPS_Cache_%E6%93%8D%E4%BD%9C%E6%97%B6%E7%9A%84%E5%A5%87%E6%80%AA%E7%8E%B0%E8%B1%A1&amp;diff=2284&amp;oldid=prev"/>
				<updated>2014-05-19T08:10:43Z</updated>
		
		<summary type="html">&lt;p&gt;以“== 现象 ==  本意想用如下的函数人为地将 Cache 的某个组的所有行的Tag 强制写为相同的值，然后访问一个索引到这个组的地址...”为内容创建页面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 现象 ==&lt;br /&gt;
&lt;br /&gt;
本意想用如下的函数人为地将 Cache 的某个组的所有行的Tag 强制写为相同的值，然后访问一个索引到这个组的地址，人造一个多命中的情况 ;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
static void sysrq_handle_comcat(int key, struct tty_struct *tty)&lt;br /&gt;
{&lt;br /&gt;
    const u32 addr_cool = 0x80400000;&lt;br /&gt;
    const u32 ws_inc = 1UL &amp;lt;&amp;lt; current_cpu_data.dcache.waybit;&lt;br /&gt;
    const u32 ws_end = current_cpu_data.dcache.ways &amp;lt;&amp;lt; current_cpu_data.dcache.waybit;&lt;br /&gt;
&lt;br /&gt;
    int i = 0;&lt;br /&gt;
    u32 taglo = 0;&lt;br /&gt;
&lt;br /&gt;
    /* dump all line's tag in set 0*/&lt;br /&gt;
    printk(&amp;quot;&amp;lt;0&amp;gt;----------------------- Before invalidated ---------------------- \n&amp;quot;);&lt;br /&gt;
    do {&lt;br /&gt;
        asm (&lt;br /&gt;
            &amp;quot;lui    $3, 0x8040\n\t&amp;quot;&lt;br /&gt;
            &amp;quot;addu    $8, $3, %1\n\t&amp;quot;    &lt;br /&gt;
            &amp;quot;cache    0x05, 0($8)\n\t&amp;quot;&lt;br /&gt;
            &amp;quot;mfc0    %0, $28, 2\n\t&amp;quot;&lt;br /&gt;
            : &amp;quot;=r&amp;quot;(taglo)&lt;br /&gt;
            : &amp;quot;r&amp;quot;(i)&lt;br /&gt;
            : &amp;quot;$8&amp;quot;, &amp;quot;$3&amp;quot;&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        printk(&amp;quot;&amp;lt;0&amp;gt; taglo_%d = 0x%08x\n&amp;quot;, i/ws_inc, taglo);&lt;br /&gt;
        i += ws_inc;&lt;br /&gt;
&lt;br /&gt;
    } while (i &amp;lt; ws_end);&lt;br /&gt;
&lt;br /&gt;
    printk(&amp;quot;&amp;lt;0&amp;gt; -------------- Invalidated all lines in set_0 ------------------ \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    asm (&amp;quot;mtc0    $0, $28, 2\n\t&amp;quot;);    // set TagLo to zero&lt;br /&gt;
    /* clear all line's tag in set 0 */&lt;br /&gt;
    do {&lt;br /&gt;
        asm (&lt;br /&gt;
            &amp;quot;lui    $8, 0x8040\n\t&amp;quot;&lt;br /&gt;
            &amp;quot;mtc0    $0, $28, 2\n\t&amp;quot;&lt;br /&gt;
            &amp;quot;addu    $3, $8, %0\n\t&amp;quot;    &lt;br /&gt;
            //&amp;quot;cache 0x01, 0($3)\n\t&amp;quot;        /* invalidate write-back a line */&lt;br /&gt;
            &amp;quot;cache 0x09, 0($3)\n\t&amp;quot;        /* clear this line's tag to zero */&lt;br /&gt;
            :&lt;br /&gt;
            : &amp;quot;r&amp;quot;(i)&lt;br /&gt;
            : &amp;quot;$8&amp;quot;, &amp;quot;$3&amp;quot;&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        i += ws_inc;&lt;br /&gt;
&lt;br /&gt;
    } while (i &amp;lt; ws_end);&lt;br /&gt;
&lt;br /&gt;
    /* dump all line's tag in set 0*/&lt;br /&gt;
    i = 0;&lt;br /&gt;
    do {&lt;br /&gt;
        asm (&lt;br /&gt;
            &amp;quot;lui    $3, 0x8040\n\t&amp;quot;&lt;br /&gt;
            &amp;quot;addu    $8, $3, %1\n\t&amp;quot;    &lt;br /&gt;
            &amp;quot;cache    0x05, 0($8)\n\t&amp;quot;&lt;br /&gt;
            &amp;quot;mfc0    %0, $28, 2\n\t&amp;quot;&lt;br /&gt;
            : &amp;quot;=r&amp;quot;(taglo)&lt;br /&gt;
            : &amp;quot;r&amp;quot;(i)&lt;br /&gt;
            : &amp;quot;$8&amp;quot;, &amp;quot;$3&amp;quot;&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        printk(&amp;quot;&amp;lt;0&amp;gt; taglo_%d = 0x%08x\n&amp;quot;, i/ws_inc, taglo);&lt;br /&gt;
        i += ws_inc;&lt;br /&gt;
&lt;br /&gt;
    } while (i &amp;lt; ws_end);&lt;br /&gt;
&lt;br /&gt;
    printk(&amp;quot;&amp;lt;0&amp;gt; ----------------- Cache a line into set 0 ---------------------- \n&amp;quot;);&lt;br /&gt;
   &lt;br /&gt;
    /* cache a line into set 0 */&lt;br /&gt;
    u32 tmp = *(u32 *) addr_cool;&lt;br /&gt;
    printk(&amp;quot;&amp;lt;0&amp;gt; *(u32 *)0x%08x = 0x%08x\n&amp;quot;, addr_cool, tmp);&lt;br /&gt;
&lt;br /&gt;
    /* dump all line's tag in set 0*/&lt;br /&gt;
    i = 0;&lt;br /&gt;
    do {&lt;br /&gt;
        asm (&lt;br /&gt;
            &amp;quot;lui    $3, 0x8040\n\t&amp;quot;&lt;br /&gt;
            &amp;quot;addu    $8, $3, %1\n\t&amp;quot;    &lt;br /&gt;
            &amp;quot;cache    0x05, 0($8)\n\t&amp;quot;&lt;br /&gt;
            &amp;quot;mfc0    %0, $28, 2\n\t&amp;quot;&lt;br /&gt;
            : &amp;quot;=r&amp;quot;(taglo)&lt;br /&gt;
            : &amp;quot;r&amp;quot;(i)&lt;br /&gt;
            : &amp;quot;$8&amp;quot;, &amp;quot;$3&amp;quot;&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        printk(&amp;quot;&amp;lt;0&amp;gt; taglo_%d = 0x%08x\n&amp;quot;, i/ws_inc, taglo);&lt;br /&gt;
        i += ws_inc;&lt;br /&gt;
&lt;br /&gt;
    } while (i &amp;lt; ws_end);&lt;br /&gt;
&lt;br /&gt;
    printk(&amp;quot;&amp;lt;0&amp;gt; -- Get a validated line, read its Tag, write it to all lines -- \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    /* find a validated line, read its tag */&lt;br /&gt;
    i = 0;&lt;br /&gt;
    do {&lt;br /&gt;
        asm (&lt;br /&gt;
            &amp;quot;lui    $3, 0x8040\n\t&amp;quot;&lt;br /&gt;
            &amp;quot;addu    $8, $3, %1\n\t&amp;quot;    &lt;br /&gt;
            &amp;quot;cache    0x05, 0($8)\n\t&amp;quot;&lt;br /&gt;
            &amp;quot;mfc0    %0, $28, 2\n\t&amp;quot;&lt;br /&gt;
            : &amp;quot;=r&amp;quot;(taglo)&lt;br /&gt;
            : &amp;quot;r&amp;quot;(i)&lt;br /&gt;
            : &amp;quot;$8&amp;quot;, &amp;quot;$3&amp;quot;&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        printk(&amp;quot;&amp;lt;0&amp;gt; taglo = 0x%08x\n&amp;quot;, taglo);&lt;br /&gt;
        i += ws_inc;&lt;br /&gt;
&lt;br /&gt;
    } while ((((taglo &amp;gt;&amp;gt; 6) &amp;amp; 3) == 0) &amp;amp;&amp;amp; i &amp;lt; ws_end);    /* cache line is invalide */&lt;br /&gt;
&lt;br /&gt;
    /* set all other line's tag to the validated line's tag */&lt;br /&gt;
    do {&lt;br /&gt;
        asm (&lt;br /&gt;
            &amp;quot;lui    $8, 0x8040\n\t&amp;quot;&lt;br /&gt;
            &amp;quot;addu    $3, $8, %0\n\t&amp;quot;    &lt;br /&gt;
            &amp;quot;cache 0x09, 0($3)\n\t&amp;quot;        /* store tag */&lt;br /&gt;
            :&lt;br /&gt;
            : &amp;quot;r&amp;quot; (i)&lt;br /&gt;
            : &amp;quot;$8&amp;quot;, &amp;quot;$3&amp;quot;&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        i += ws_inc;&lt;br /&gt;
&lt;br /&gt;
    } while (i &amp;lt; ws_end);&lt;br /&gt;
&lt;br /&gt;
    /* dump all line's tag in set 0*/&lt;br /&gt;
    i = 0;&lt;br /&gt;
    do {&lt;br /&gt;
        asm (&lt;br /&gt;
            &amp;quot;lui    $3, 0x8040\n\t&amp;quot;&lt;br /&gt;
            &amp;quot;addu    $8, $3, %1\n\t&amp;quot;    &lt;br /&gt;
            &amp;quot;cache    0x05, 0($8)\n\t&amp;quot;&lt;br /&gt;
            &amp;quot;mfc0    %0, $28, 2\n\t&amp;quot;&lt;br /&gt;
            : &amp;quot;=r&amp;quot;(taglo)&lt;br /&gt;
            : &amp;quot;r&amp;quot;(i)&lt;br /&gt;
            : &amp;quot;$8&amp;quot;, &amp;quot;$3&amp;quot;&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        printk(&amp;quot;&amp;lt;0&amp;gt; taglo_%d = 0x%08x\n&amp;quot;, i/ws_inc, taglo);&lt;br /&gt;
        i += ws_inc;&lt;br /&gt;
&lt;br /&gt;
    } while (i &amp;lt; ws_end);&lt;br /&gt;
&lt;br /&gt;
    /* multi-hit cache line */&lt;br /&gt;
    printk(&amp;quot;&amp;lt;0&amp;gt; --------------------- Multi-Hit cache line --------------------- \n&amp;quot;);&lt;br /&gt;
    tmp = *(u32 *) addr_cool;&lt;br /&gt;
    printk(&amp;quot;&amp;lt;0&amp;gt; *(u32 *)0x%08x = 0x%08x\n\n&amp;quot;, addr_cool, tmp);&lt;br /&gt;
&lt;br /&gt;
    printk(&amp;quot;&amp;lt;0&amp;gt; ------------------------ After Multi-Hit ----------------------- \n&amp;quot;);&lt;br /&gt;
    /* dump all line's tag in set 0*/&lt;br /&gt;
    i = 0;&lt;br /&gt;
    do {&lt;br /&gt;
        asm (&lt;br /&gt;
            &amp;quot;lui    $3, 0x8040\n\t&amp;quot;&lt;br /&gt;
            &amp;quot;addu    $8, $3, %1\n\t&amp;quot;    &lt;br /&gt;
            &amp;quot;cache    0x05, 0($8)\n\t&amp;quot;&lt;br /&gt;
            &amp;quot;mfc0    %0, $28, 2\n\t&amp;quot;&lt;br /&gt;
            : &amp;quot;=r&amp;quot;(taglo)&lt;br /&gt;
            : &amp;quot;r&amp;quot;(i)&lt;br /&gt;
            : &amp;quot;$8&amp;quot;, &amp;quot;$3&amp;quot;&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        printk(&amp;quot;&amp;lt;0&amp;gt; taglo_%d = 0x%08x\n&amp;quot;, i/ws_inc, taglo);&lt;br /&gt;
        i += ws_inc;&lt;br /&gt;
&lt;br /&gt;
    } while (i &amp;lt; ws_end);&lt;br /&gt;
    printk(&amp;quot;&amp;lt;0&amp;gt; ---------------------------------------------------------------- \n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static struct sysrq_key_op sysrq_jack_op = {&lt;br /&gt;
    .handler    = sysrq_handle_jack,&lt;br /&gt;
    .help_msg    = &amp;quot;Jack's Debug&amp;quot;,&lt;br /&gt;
    .action_msg    = &amp;quot;Jack's Debug&amp;quot;,&lt;br /&gt;
    .enable_mask    = SYSRQ_ENABLE_DUMP,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
将这个函数映射到 sysrq 的 j 键方便操作。&lt;br /&gt;
&lt;br /&gt;
哪知在多个 MIPS 平台上，第二步将组内所用行的 Tag 置为 0 的操作总是有一行不为所动 :( ，一下是一些 log:&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
4KEc 平台，8KB, 2-way, linesize 16 bytes L1 DCache:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
telnet&amp;gt; send brk&lt;br /&gt;
SysRq : Jack's Debug&lt;br /&gt;
----------------------- Before invalidated ----------------------&lt;br /&gt;
taglo_0 = 0x003260c0&lt;br /&gt;
taglo_1 = 0x002b4080&lt;br /&gt;
&lt;br /&gt;
-------------- Invalidated all lines in set_0 ------------------&lt;br /&gt;
taglo_0 = 0x00000000&lt;br /&gt;
taglo_1 = 0x002b4080&lt;br /&gt;
&lt;br /&gt;
----------------- Cache a line into set 0 ----------------------&lt;br /&gt;
*(u32 *)0x80000000 = 0x3c1b802f&lt;br /&gt;
taglo_0 = 0x00000080&lt;br /&gt;
taglo_1 = 0x002b4080&lt;br /&gt;
&lt;br /&gt;
-- Get a validated line, read its Tag, write it to all lines --&lt;br /&gt;
taglo = 0x00000080&lt;br /&gt;
taglo_0 = 0x00000080&lt;br /&gt;
taglo_1 = 0x00000080&lt;br /&gt;
&lt;br /&gt;
--------------------- Multi-Hit cache line ---------------------&lt;br /&gt;
*(u32 *)0x80000000 = 0x802b6188&lt;br /&gt;
&lt;br /&gt;
------------------------ After Multi-Hit -----------------------&lt;br /&gt;
taglo_0 = 0x002b4080&lt;br /&gt;
taglo_1 = 0x00000080&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
下面的这次，因为残留的一行有效，且在目标行的前面，所以这次造多命中失败了:(&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
telnet&amp;gt; send brk&lt;br /&gt;
SysRq : Jack's Debug&lt;br /&gt;
----------------------- Before invalidated ----------------------&lt;br /&gt;
taglo_0 = 0x002b4080&lt;br /&gt;
taglo_1 = 0x003260c0&lt;br /&gt;
&lt;br /&gt;
-------------- Invalidated all lines in set_0 ------------------&lt;br /&gt;
taglo_0 = 0x00000000&lt;br /&gt;
taglo_1 = 0x003260c0&lt;br /&gt;
&lt;br /&gt;
----------------- Cache a line into set 0 ----------------------&lt;br /&gt;
*(u32 *)0x80000000 = 0x3c1b802f&lt;br /&gt;
taglo_0 = 0x002b4080&lt;br /&gt;
taglo_1 = 0x00000080&lt;br /&gt;
&lt;br /&gt;
-- Get a validated line, read its Tag, write it to all lines --&lt;br /&gt;
taglo = 0x002b4080&lt;br /&gt;
taglo_0 = 0x002b4080&lt;br /&gt;
taglo_1 = 0x002b4080&lt;br /&gt;
&lt;br /&gt;
--------------------- Multi-Hit cache line ---------------------&lt;br /&gt;
*(u32 *)0x80000000 = 0x3c1b802f&lt;br /&gt;
&lt;br /&gt;
------------------------ After Multi-Hit -----------------------&lt;br /&gt;
taglo_0 = 0x002b4080&lt;br /&gt;
taglo_1 = 0x00000080&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
VR5500 平台，64kB, 4-way, linesize 32 bytes L1 DCache:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
----------------------- Before invalidated ----------------------&lt;br /&gt;
taglo_0 = 0x000458c0&lt;br /&gt;
taglo_1 = 0x0004a481&lt;br /&gt;
taglo_2 = 0x0004e8c1&lt;br /&gt;
taglo_3 = 0x0014dcc1&lt;br /&gt;
-------------- Invalidated all lines in set_0 ------------------&lt;br /&gt;
taglo_0 = 0x00000000&lt;br /&gt;
taglo_1 = 0x00000000&lt;br /&gt;
taglo_2 = 0x00000000&lt;br /&gt;
taglo_3 = 0x000458c0&lt;br /&gt;
&lt;br /&gt;
----------------- Cache a line into set 0 ----------------------&lt;br /&gt;
*(u32 *)0x80000000 = 0x3c1b804b&lt;br /&gt;
taglo_0 = 0x00000000&lt;br /&gt;
taglo_1 = 0x00000000&lt;br /&gt;
taglo_2 = 0x00000081&lt;br /&gt;
taglo_3 = 0x000458c0&lt;br /&gt;
&lt;br /&gt;
-- Get a validated line, read its Tag, write it to all lines --&lt;br /&gt;
taglo = 0x00000000&lt;br /&gt;
taglo = 0x00000000&lt;br /&gt;
taglo = 0x00000081&lt;br /&gt;
&lt;br /&gt;
taglo_0 = 0x00000081&lt;br /&gt;
taglo_1 = 0x000458c0&lt;br /&gt;
taglo_2 = 0x00000081&lt;br /&gt;
taglo_3 = 0x00000081&lt;br /&gt;
&lt;br /&gt;
--------------------- Multi-Hit cache line ---------------------&lt;br /&gt;
*(u32 *)0x80000000 = 0x8045a188&lt;br /&gt;
&lt;br /&gt;
------------------------ After Multi-Hit -----------------------&lt;br /&gt;
taglo_0 = 0x00000081&lt;br /&gt;
taglo_1 = 0x000458c0&lt;br /&gt;
taglo_2 = 0x00000081&lt;br /&gt;
taglo_3 = 0x00000081&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
多次测试表明，似乎每次顽强生存着的 Tag 值皆一样，但位置可能会改变。这真是个诡异的现象，不知是不是 Cache lock 的原因。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Comcat</name></author>	</entry>

	</feed>