<?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_0015%3A_Freescale_8360e_Gadget_%E6%8F%92%E7%94%B5%E5%BC%95%E8%B5%B7_Kernel_panic</id>
		<title>捉虫日记 0015: Freescale 8360e Gadget 插电引起 Kernel panic - 版本历史</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_0015%3A_Freescale_8360e_Gadget_%E6%8F%92%E7%94%B5%E5%BC%95%E8%B5%B7_Kernel_panic"/>
		<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_0015:_Freescale_8360e_Gadget_%E6%8F%92%E7%94%B5%E5%BC%95%E8%B5%B7_Kernel_panic&amp;action=history"/>
		<updated>2026-09-11T05:20:21Z</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_0015:_Freescale_8360e_Gadget_%E6%8F%92%E7%94%B5%E5%BC%95%E8%B5%B7_Kernel_panic&amp;diff=18578&amp;oldid=prev</id>
		<title>Comcat：/* Analysis */</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_0015:_Freescale_8360e_Gadget_%E6%8F%92%E7%94%B5%E5%BC%95%E8%B5%B7_Kernel_panic&amp;diff=18578&amp;oldid=prev"/>
				<updated>2025-12-04T03:42:53Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Analysis&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日 (四) 03:42的版本&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第130行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第130行：&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;&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_0015:_Freescale_8360e_Gadget_%E6%8F%92%E7%94%B5%E5%BC%95%E8%B5%B7_Kernel_panic&amp;diff=2297&amp;oldid=prev</id>
		<title>Comcat：以“== Phenomenon ==  环境：  * Freescale 8360e  * Linux 2.6.34.6  产品内核版本从 2.6.27 升级到 2.6.34.6，内核启动后手动加载 Gadget Ether 模块 g...”为内容创建页面</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_0015:_Freescale_8360e_Gadget_%E6%8F%92%E7%94%B5%E5%BC%95%E8%B5%B7_Kernel_panic&amp;diff=2297&amp;oldid=prev"/>
				<updated>2014-05-19T08:59:49Z</updated>
		
		<summary type="html">&lt;p&gt;以“== Phenomenon ==  环境：  * Freescale 8360e  * Linux 2.6.34.6  产品内核版本从 2.6.27 升级到 2.6.34.6，内核启动后手动加载 Gadget Ether 模块 g...”为内容创建页面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Phenomenon ==&lt;br /&gt;
&lt;br /&gt;
环境：&lt;br /&gt;
&lt;br /&gt;
* Freescale 8360e&lt;br /&gt;
&lt;br /&gt;
* Linux 2.6.34.6&lt;br /&gt;
&lt;br /&gt;
产品内核版本从 2.6.27 升级到 2.6.34.6，内核启动后手动加载 Gadget Ether 模块 g_ether.ko，成功后显示：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ dmesg | tail&lt;br /&gt;
&lt;br /&gt;
g_ether gadget: using random self ethernet address&lt;br /&gt;
g_ether gadget: using random host ethernet address&lt;br /&gt;
usb0: MAC 8a:13:2e:1b:03:4f&lt;br /&gt;
usb0: HOST MAC 4a:25:7f:fd:8f:c4&lt;br /&gt;
g_ether gadget: Ethernet Gadget, version: Memorial Day 2008&lt;br /&gt;
g_ether gadget: g_ether ready&lt;br /&gt;
fsl_qe_udc e01006c0.usb: fsl_qe_udc bind to driver g_ether &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
但一插 USB 电缆到 PC，内核立刻 panic:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Unable to handle kernel paging request for data at address 0x00000000&lt;br /&gt;
Faulting instruction address: 0xc02a0d04&lt;br /&gt;
Oops: Kernel access of bad area, sig: 11 [#1]&lt;br /&gt;
NIP: c02a0d04LR: c02a0cd8 CTR: c029976c&lt;br /&gt;
REGS: c051bcc0 TRAP: 0300   Not tainted  (2.6.34.6-WR4.0.0.0_standard)&lt;br /&gt;
MSR: 00001032 &amp;lt;ME,IR,DR&amp;gt;  CR: 22008042  XER: 20000000&lt;br /&gt;
DAR: 00000000, DSISR: 20000000&lt;br /&gt;
TASK = c04ee450[0] 'swapper' THREAD: c051a000&lt;br /&gt;
GPR00: 00000003 c051bd70 c04ee450 0000003f 000022f5 ffffffff c0260f98 0000000&lt;br /&gt;
GPR08: 00000000 cf9679c0 00000000 c051a000 22008044 9a6c7e8a 00000001 2000000&lt;br /&gt;
GPR16: 40000000 00800000 00400000 cf98c0f0 0c000000 cf98c0d8 00000000 0000000&lt;br /&gt;
GPR24: c050d560 00000000 cf98c000 00000000 c050d560 cf98c000 cf9785c0 cf97860&lt;br /&gt;
NIP [c02a0d04] composite_setup+0xa68/0xb58&lt;br /&gt;
LR [c02a0cd8] composite_setup+0xa3c/0xb58&lt;br /&gt;
Call Trace:&lt;br /&gt;
[c051bd70] [c02a0cd8] composite_setup+0xa3c/0xb58 (unreliable)&lt;br /&gt;
[c051bdb0] [c029d23c] qe_udc_irq+0xbbc/0xe10&lt;br /&gt;
[c051be20] [c0092e48] handle_IRQ_event+0xb8/0x30c&lt;br /&gt;
[c051be70] [c0095f7c] handle_level_irq+0xb8/0x184&lt;br /&gt;
[c051be90] [c0030138] qe_ic_cascade_low_ipic+0x3c/0x50&lt;br /&gt;
[c051bea0] [c00064e4] native_do_IRQ+0x98/0xb4&lt;br /&gt;
[c051bec0] [c0005164] do_IRQ+0x10/0x20&lt;br /&gt;
[c051bed0] [c0015bb4] ret_from_except+0x0/0x14&lt;br /&gt;
--- Exception: 501 at cpu_idle+0x88/0xec&lt;br /&gt;
    LR = cpu_idle+0x88/0xec&lt;br /&gt;
[c051bf90] [c0009b78] cpu_idle+0xe8/0xec (unreliable)&lt;br /&gt;
[c051bfb0] [c0003e90] rest_init+0xb0/0xe0&lt;br /&gt;
[c051bfc0] [c04b3890] start_kernel+0x304/0x318&lt;br /&gt;
[c051bff0] [00003438] 0x3438&lt;br /&gt;
Instruction dump:&lt;br /&gt;
4812b041 939e000c 3ac00000 3b200000 3ae00001 81380034 2f890000 419e00c4&lt;br /&gt;
801a0010 2f800003 419e00a0 81090008 &amp;lt;81680000&amp;gt; 3949003c 2f8b0000 419e0040&lt;br /&gt;
Kernel panic - not syncing: Fatal exception in interrupt&lt;br /&gt;
Call Trace:&lt;br /&gt;
[c051bc00] [c00089b0] show_stack+0x50/0x160 (unreliable)&lt;br /&gt;
[c051bc30] [c03cbc94] panic+0x128/0x1a8&lt;br /&gt;
[c051bc80] [c0012eb8] die+0x168/0x224&lt;br /&gt;
[c051bca0] [c0018fb0] bad_page_fault+0x90/0xc8&lt;br /&gt;
[c051bcb0] [c00159b8] handle_page_fault+0x7c/0x80&lt;br /&gt;
--- Exception: 300 at composite_setup+0xa68/0xb58&lt;br /&gt;
    LR = composite_setup+0xa3c/0xb58&lt;br /&gt;
[c051bdb0] [c029d23c] qe_udc_irq+0xbbc/0xe10&lt;br /&gt;
[c051be20] [c0092e48] handle_IRQ_event+0xb8/0x30c&lt;br /&gt;
[c051be70] [c0095f7c] handle_level_irq+0xb8/0x184&lt;br /&gt;
[c051be90] [c0030138] qe_ic_cascade_low_ipic+0x3c/0x50&lt;br /&gt;
[c051bea0] [c00064e4] native_do_IRQ+0x98/0xb4&lt;br /&gt;
[c051bec0] [c0005164] do_IRQ+0x10/0x20&lt;br /&gt;
[c051bed0] [c0015bb4] ret_from_except+0x0/0x14&lt;br /&gt;
--- Exception: 501 at cpu_idle+0x88/0xec&lt;br /&gt;
    LR = cpu_idle+0x88/0xec&lt;br /&gt;
[c051bf90] [c0009b78] cpu_idle+0xe8/0xec (unreliable)&lt;br /&gt;
[c051bfb0] [c0003e90] rest_init+0xb0/0xe0&lt;br /&gt;
[c051bfc0] [c04b3890] start_kernel+0x304/0x318&lt;br /&gt;
[c051bff0] [00003438] 0x3438&lt;br /&gt;
Rebooting in 180 seconds..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
显然这是一个访问空指针的错误。根据 NIP 的值，定位到出错指令地址为 0xc02a0d04&lt;br /&gt;
&lt;br /&gt;
反汇编内核，找到这个指令的所在：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
c02a0cfc:       41 9e 00 a0     beq-    cr7,c02a0d9c &amp;lt;composite_setup+0xb00&amp;gt;&lt;br /&gt;
c02a0d00:       81 09 00 08     lwz     r8,8(r9)&lt;br /&gt;
c02a0d04:      81 68 00 00     lwz     r11,0(r8)&lt;br /&gt;
c02a0d08:       39 49 00 3c     addi    r10,r9,60&lt;br /&gt;
&lt;br /&gt;
c02a0d0c:       2f 8b 00 00     cmpwi   cr7,r11,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
位于 composite_setup()，查看 drivers/usb/gadget/composite.c，函数体比较大，很难定位到具体出错 C 语句。再一次 objdump -S -d 反汇编 g_ether.o 文件（-S 表示让 objdump 在输出中穿插原始的 C 源码，因为整个内核的源码很大，所以我们只针对一个小文件即可）得到：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                if (gadget-&amp;gt;speed == USB_SPEED_HIGH)&lt;br /&gt;
    3800:       80 1a 00 10     lwz     r0,16(r26)&lt;br /&gt;
    3804:       2f 80 00 03     cmpwi   cr7,r0,3&lt;br /&gt;
    3808:       41 9e 00 a0     beq-    cr7,38a8 &amp;lt;composite_setup+0xb00&amp;gt;&lt;br /&gt;
                        descriptors = f-&amp;gt;hs_descriptors;&lt;br /&gt;
                else&lt;br /&gt;
                        descriptors = f-&amp;gt;descriptors;&lt;br /&gt;
    380c:       81 09 00 08     lwz     r8,8(r9)&lt;br /&gt;
&lt;br /&gt;
                for (; *descriptors; ++descriptors) {&lt;br /&gt;
    3810:      81 68 00 00     lwz     r11,0(r8)&lt;br /&gt;
                                continue;&lt;br /&gt;
&lt;br /&gt;
                        ep = (struct usb_endpoint_descriptor *)*descriptors;&lt;br /&gt;
                        addr = ((ep-&amp;gt;bEndpointAddress &amp;amp; 0x80) &amp;gt;&amp;gt; 3)&lt;br /&gt;
                             |  (ep-&amp;gt;bEndpointAddress &amp;amp; 0x0f);&lt;br /&gt;
&lt;br /&gt;
                        set_bit(addr, f-&amp;gt;endpoints);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
g_ether.o 无绝对地址，因此只能通过指令编码去对应，找到出错源码行是 'for (; *descriptors; ++descriptors) '，一看就知道是 *descriptors 出错，则往上找 descriptors 为何没有被赋值。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
加了几条 printk，很快发现是 gadget-&amp;gt;speed 的模式设置有误，导致 descriptors 拿错了值，其值应该是 f-&amp;gt;descriptors 而不是 f-&amp;gt;hs_descriptors&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;/div&gt;</summary>
		<author><name>Comcat</name></author>	</entry>

	</feed>