Kernel Panic 实例解析
看一份Kernel panic log如下
[ 153.449188@2] Unable to handle kernel paging request at virtual address ffffffc1000000b0
[ 153.457286@2] pgd = ffffffc060441000
[ 153.460715@2] [ffffffc1000000b0] *pgd=0000000000000000
[ 153.465803@2] Internal error: Oops: 96000045 [#1] PREEMPT SMP
[ 153.471490@2] Modules linked in: bcmdhd(O) mac80211 cfg80211 dwc3 ddr_window btusb(O) tb_detect(O) mali(O)
[ 153.481076@2] CPU: 2 PID: 1684 Comm: xxxxx_debug Tainted: G O 3.14.29-00029-g5e1b7cc-dirty #103
[ 153.490899@2] task: ffffffc063518000 ti: ffffffc06318c000 task.ti: ffffffc06318c000
[ 153.498501@2] PC is at memset+0x1c/0x60
[ 153.502293@2] LR is at xxxxx_rs232_data_monitor+0xbc/0x260
[ 153.508059@2] pc : [<ffffffc00145492c>] lr : [<ffffffc001939fe4>] pstate: 20000145
[ 153.515558@2] sp : ffffffc06318fc40
[ 153.519009@2] x29: ffffffc0ffffffc0 x28: ffffffc0025e9720
[ 153.524441@2] x27: 0000000000000000 x26: 00000000ffffffff
[ 153.529876@2] x25: ffffffc001f68000 x24: ffffffc001f684b8
[ 153.535308@2] x23: ffffffc0632ff098 x22: ffffffc0025e9000
[ 153.540743@2] x21: ffffffc001f68478 x20: ffffffc001f68218
[ 153.546176@2] x19: ffffffc001c9cbf8 x18: 0000000000000000
[ 153.551609@2] x17: 0000000000000000 x16: ffffffc00120e378
[ 153.557044@2] x15: 00000000000000d5 x14: 0000000000000001
[ 153.562477@2] x13: 0000000000000001 x12: 0000000000040000
[ 153.567911@2] x11: 00000000000182d0 x10: 00000000000007bc
[ 153.573344@2] x9 : 0000000000000000 x8 : ffffffc0013cf87c
[ 153.578778@2] x7 : ffffffc00219de70 x6 : 0000000000000056
[ 153.584211@2] x5 : 0000000000000000 x4 : ffffffc1000000b0
[ 153.589645@2] x3 : 0000000000000000 x2 : 0000000000000078
[ 153.595079@2] x1 : 0000000000000000 x0 : ffffffc1000000b0
[ 153.600516@2]
[ 153.600516@2] PC: 0xffffffc0014548ac:
[ 153.605773@2] 48ac 8b020021 f1002042 540000a4 f85f8c23 f1002042 f81f8c83 54ffffa5 b1001042
[ 153.614053@2] 48cc 54000084 b85fcc23 d1001042 b81fcc83 b1000842 54000084 785fec23 d1000842
[ 153.622333@2] 48ec 781fec83 b1000442 54000064 385ff023 381ff083 d65f03c0 d503201f d503201f
[ 153.630612@2] 490c d503201f aa0003e4 12001c21 2a012021 2a014021 aa018021 f1002042 54000084
[ 153.638893@2] 492c f8008481 f1002042 54ffffc5 b1001042 54000064 d1001042 b8004481 b1000842
[ 153.647173@2] 494c 54000064 d1000842 78002481 b1000442 54000044 39000081 d65f03c0 d503201f
[ 153.655453@2] 496c d503201f 12001c21 38401402 6b01005f 7a5f1044 54ffffa1 d1000400 6b01005f
[ 153.663732@2] 498c 9a9f0000 d65f03c0 d503201f d503201f d503201f d2800003 12001c21 38401402
[ 153.672018@2]
[ 153.672018@2] LR: 0xffffffc001939f64:
[ 153.677273@2] 9f64 91042053 f0003162 a9007c1f 910443a0 91086054 f0003162 9111e055 f0003162
[ 153.685554@2] 9f84 a9007c1f 910483a0 9112e058 a90f7fbf a9007c1f 9104c3a0 a9007c1f 910503a0
[ 153.693834@2] 9fa4 a9007c1f 910543a0 a9007c1f 910583a0 a9007c1f 52806943 9103c3a4 aa1303e2
[ 153.702113@2] 9fc4 aa1403e1 aa1503e0 911c82dc 94094174 d2801002 52800001 9103c3a0 97ec6a4c
[ 153.710394@2] 9fe4 f9400b80 9103c3a1 97fffd68 2a0003fa 2a0003e4 9103c3a5 528069a3 aa1303e2
[ 153.718674@2] a004 aa1403e1 91124320 94094165 6b1f035f 5400016d 71000f5f 5400008d 3943c3a0
[ 153.726953@2] a024 7101041f 540007a0 911c82c0 2a1a03e2 9103c3a1 f9400800 97fffe64 52806e83
[ 153.735234@2] a044 aa1303e2 aa1403e1 9101c3a4 aa1503e0 94094153 9103c3a4 52806ea3 aa1303e2
[ 153.743518@2]
[ 153.743518@2] SP: 0xffffffc06318fbc0:
[ 153.748777@2] fbc0 01f68218 ffffffc0 01f68478 ffffffc0 025e9000 ffffffc0 632ff098 ffffffc0
[ 153.757055@2] fbe0 01f684b8 ffffffc0 01f68000 ffffffc0 ffffffff 00000000 00000000 00000000
[ 153.765335@2] fc00 025e9720 ffffffc0 ffffffc0 ffffffc0 01939fe4 ffffffc0 6318fc40 ffffffc0
[ 153.773616@2] fc20 0145492c ffffffc0 20000145 00000000 00000002 00000000 00000000 00000000
[ 153.781895@2] fc40 ffffffc0 ffffffc0 010c4848 ffffffc0 6339f200 ffffffc0 022999c0 ffffffc0
[ 153.790175@2] fc60 01e44758 ffffffc0 632ff098 ffffffc0 01939f28 ffffffc0 00000000 00000000
[ 153.798455@2] fc80 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 153.806735@2] fca0 01939f28 ffffffc0 00000000 00000000 00000000 00000000 00000000 00000000
[ 153.815022@2]
[ 153.815022@2] X0: 0xffffffc100000030:
[ 153.820276@2] 0030 ******** ******** ******** ******** ******** ******** ******** ********
[ 153.828557@2] 0050 ******** ******** ******** ******** ******** ******** ******** ********
[ 153.836836@2] 0070 ******** ******** ******** ******** ******** ******** ******** ********
[ 153.845117@2] 0090 ******** ******** ******** ******** ******** ******** ******** ********
[ 153.853396@2] 00b0 ******** ******** ******** ******** ******** ******** ******** ********
[ 153.861669@2] 00d0 ******** ******** ******** ******** ******** ******** ******** ********
[ 153.869949@2] 00f0 ******** ******** ******** ******** ******** ******** ******** ********
[ 153.878229@2] 0110 ******** ******** ******** ******** ******** ******** ******** ********
[ 153.886512@2]
[ 153.886512@2] X4: 0xffffffc100000030:
[ 153.891771@2] 0030 ******** ******** ******** ******** ******** ******** ******** ********
[ 153.900050@2] 0050 ******** ******** ******** ******** ******** ******** ******** ********
[ 153.908330@2] 0070 ******** ******** ******** ******** ******** ******** ******** ********
[ 153.916611@2] 0090 ******** ******** ******** ******** ******** ******** ******** ********
[ 153.924890@2] 00b0 ******** ******** ******** ******** ******** ******** ******** ********
[ 153.933170@2] 00d0 ******** ******** ******** ******** ******** ******** ******** ********
[ 153.941450@2] 00f0 ******** ******** ******** ******** ******** ******** ******** ********
[ 153.949730@2] 0110 ******** ******** ******** ******** ******** ******** ******** ********
[ 153.958027@2]
[ 153.958027@2] X7: 0xffffffc00219ddf0:
[ 153.963279@2] ddf0 634e6400 ffffffc0 634e6500 ffffffc0 634e6600 ffffffc0 07300000 00000000
[ 153.971559@2] de10 00100000 00000000 00000000 00000000 00008000 00000000 00004000 00000000
[ 153.979839@2] de30 00001000 00000000 00001000 00000000 00000001 00000000 00000000 00000000
[ 153.988118@2] de50 00000000 0000001f 00000000 00000001 00000001 00000001 00000001 00000000
[ 153.996398@2] de70 00000000 00000000 01e8e900 ffffffc0 09980998 00000000 63540000 ffffffc0
[ 154.004679@2] de90 00008000 00000000 00000001 00000000 0219dea0 ffffffc0 0219dea0 ffffffc0
[ 154.012959@2] deb0 00000000 00000000 00000000 00000000 00000000 00000000 013cf798 ffffffc0
[ 154.021239@2] ded0 00000000 00000000 013d0070 ffffffc0 013cec8c ffffffc0 013cf87c ffffffc0
[ 154.029525@2]
[ 154.029525@2] X8: 0xffffffc0013cf7fc:
[ 154.034780@2] f7fc f94017a1 f94044a2 540000a9 128002a0 f9400bf3 a8c37bfd d65f03c0 d00041c0
[ 154.043060@2] f81c 91386000 38734800 10000063 8b208860 d61f0000 f9400c53 aa1303e0 940004a9
[ 154.051340@2] f83c aa1303e0 940004b4 f9400bf3 52800000 a8c37bfd d65f03c0 f9400853 17fffff7
[ 154.059620@2] f85c f9400453 17fffff5 b9406c40 eb01001f 54fffce9 f9400040 f8617813 17ffffef
[ 154.067900@2] f87c a9bb7bfd 7100081f 910003fd a9025bf5 a90153f3 a90363f7 aa0403f5 53001cb6
[ 154.076180@2] f89c aa0603f4 f94044f3 54000860 71000c1f 54000980 71001c1f 540009c0 35000b00
[ 154.084460@2] f8bc 51000420 7100041f 54000aa8 7100083f 54000a20 7100047f 54000a61 f9400261
[ 154.092740@2] f8dc b4000a21 b9407262 910103a0 f8625837 97f4e4fc 35000860 d29ef9e1 f94027a3
[ 154.101039@2]
[ 154.101039@2] X16: 0xffffffc00120e2f8:
[ 154.106367@2] e2f8 910163a0 93407e73 97fa962e aa1303e0 a94153f3 a9425bf5 a94363f7 a8c67bfd
[ 154.114647@2] e318 d65f03c0 f9400a82 52800280 f9402fa3 aa1403e1 92800073 f904ec43 94091833
[ 154.122927@2] e338 f9400280 3707fe40 900061c0 528011c1 911a6000 97fa487e 17ffffed 928002b3
[ 154.131208@2] e358 17ffffeb 2a1803e3 2a1703e2 aa1603e1 2a1503e0 97fffe91 93407c13 17ffffe4
[ 154.139487@2] e378 a9b97bfd 910003fd a90153f3 a9025bf5 a90363f7 aa0003f5 aa1e03e0 f90027a4
[ 154.147767@2] e398 aa0103f6 aa0203f7 aa0303f8 f90023a5 d503201f f94027a4 b4000724 f94023a5
[ 154.156047@2] e3b8 710020bf 54000681 910003e0 aa0403e5 9272c414 928001b3 f9400686 b10020a5
[ 154.164327@2] e3d8 fa4630a2 9a9f27e0 b4000300 d2800102 aa0403e1 910163a0 9409186c b5000260
[ 154.172619@2]
[ 154.172619@2] X19: 0xffffffc001c9cb78:
[ 154.177957@2] cb78 336d7473 33306632 65735f30 73725f74 5f323332 5f646d63 00746572 00000000
[ 154.186235@2] cb98 5f766564 74697277 00000065 00000000 336d7473 33306632 32695f30 72775f63
[ 154.194515@2] cbb8 00657469 00000000 336d7473 33306632 65735f30 65725f74 61765f67 0065756c
[ 154.202795@2] cbd8 336d7473 33306632 61685f30 656c646e 3273725f 725f3233 00007465 00000000
[ 154.211075@2] cbf8 336d7473 33306632 73725f30 5f323332 61746164 6e6f6d5f 726f7469 00000000
[ 154.219355@2] cc18 336d7473 33306632 32695f30 65725f63 00006461 00000000 336d7473 33306632
[ 154.227635@2] cc38 64615f30 696c5f64 00007473 00000000 69727473 5f73676e 73726170 00000065
[ 154.235916@2] cc58 336d7473 33306632 65735f30 6f705f74 5f726577 65646f6d 00000000 00000000
[ 154.244202@2]
[ 154.244202@2] X20: 0xffffffc001f68198:
[ 154.249544@2] 8198 00000a20 00000000 2f493601 203a7325 29732528 20732520 63637573 0a737365
[ 154.257823@2] 81b8 00000000 00000000 6c696146 74206465 6170206f 20657372 69766564 74206563
[ 154.266102@2] 81d8 0a656572 00000000 35397761 5f623332 75706e69 656b5f74 00000079 00000000
[ 154.274382@2] 81f8 35397761 5f623332 70696863 0064695f 35397761 5f623332 00676572 00000000
[ 154.282663@2] 8218 336d7473 33306632 00000030 00000000 73252f44 7325203a 746e4520 000a7265
[ 154.290943@2] 8238 73252f44 6425203a 705f6720 7265776f 2076355f 000a6425 73252f44 7325203a
[ 154.299218@2] 8258 20702520 25207025 65722070 64253a74 0000000a 00000000 6f686365 61747320
[ 154.307498@2] 8278 3e206574 6d747320 30663233 6c5f3033 000a6465 00000000 74617473 3d303a65
[ 154.315781@2]
[ 154.315781@2] X21: 0xffffffc001f683f8:
[ 154.321126@2] 83f8 6d5f7265 0a65646f 00000000 00000000 6f703a30 20726577 6e617473 20796264
[ 154.329405@2] 8418 6f703a31 20726577 000a6e6f 00000000 2f453301 203a7325 2e732528 20296425
[ 154.337686@2] 8438 6f727265 61642072 74206174 6461206f 6f742064 65757120 00006575 00000000
[ 154.345965@2] 8458 73252f44 7325203a 0a732520 00000000 73252f44 7325203a 20642520 000a7025
[ 154.354245@2] 8478 73252f44 7325203a 20642520 756c6176 70253a65 0000000a 73252f44 7325203a
[ 154.362526@2] 8498 20642520 756c6176 656c5f65 64253a6e 6c617620 253a6575 00000a73 00000000
[ 154.370807@2] 84b8 73252f44 7325203a 73616c20 6d632074 64253a64 69617720 64252074 000a736d
[ 154.379091@2] 84d8 64616552 25783020 73692058 25783020 00000a58 00000000 73252f44 7830203a
[ 154.387382@2]
[ 154.387382@2] X22: 0xffffffc0025e8f80:
[ 154.392718@2] 8f80 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 154.400998@2] 8fa0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 154.409277@2] 8fc0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 154.417558@2] 8fe0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 154.425837@2] 9000 00130a24 151b5152 72dc4ff0 cdd103a7 00000000 00000000 00000000 00000000
[ 154.434118@2] 9020 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 154.442398@2] 9040 00000000 00000000 00000000 00000000 00000000 00000000 62283e00 ffffffc0
[ 154.450678@2] 9060 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000000
[ 154.458957@2]
[ 154.458957@2] X23: 0xffffffc0632ff018:
[ 154.464300@2] f018 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 154.472580@2] f038 00000000 00000000 0234d660 ffffffc0 00000000 00000000 00000000 00000000
[ 154.480860@2] f058 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 154.489141@2] f078 00000000 00000000 6339f280 ffffffc0 6353ed88 ffffffc0 014d93fc ffffffc0
[ 154.497421@2] f098 6353ec00 ffffffc0 00000001 00000000 632ff0a8 ffffffc0 632ff0a8 ffffffc0
[ 154.505700@2] f0b8 00000000 00000000 00000000 00000000 4c807f82 00000000 0f500000 239cddb5
[ 154.513980@2] f0d8 00000000 00000000 632ff0e0 ffffffc0 632ff0e0 ffffffc0 00000000 00000000
[ 154.522260@2] f0f8 00000000 00000000 02180290 ffffffc0 00000000 00000000 00000001 00000001
[ 154.530543@2]
[ 154.530543@2] X24: 0xffffffc001f68438:
[ 154.535888@2] 8438 6f727265 61642072 74206174 6461206f 6f742064 65757120 00006575 00000000
[ 154.544168@2] 8458 73252f44 7325203a 0a732520 00000000 73252f44 7325203a 20642520 000a7025
[ 154.552448@2] 8478 73252f44 7325203a 20642520 756c6176 70253a65 0000000a 73252f44 7325203a
[ 154.560733@2] 8498 20642520 756c6176 656c5f65 64253a6e 6c617620 253a6575 00000a73 00000000
[ 154.569013@2] 84b8 73252f44 7325203a 73616c20 6d632074 64253a64 69617720 64252074 000a736d
[ 154.577294@2] 84d8 64616552 25783020 73692058 25783020 00000a58 00000000 73252f44 7830203a
[ 154.585573@2] 84f8 000a7825 00000000 2f453301 203a7325 2e732528 20296425 6b207325 74727473
[ 154.593853@2] 8518 746e696f 72726520 000a726f 00000000 2f453301 203a7325 2e732528 20296425
[ 154.602132@2]
[ 154.602132@2] X25: 0xffffffc001f67f80:
[ 154.607476@2] 7f80 20717269 67697274 20726567 65707974 2073252d 6564202c 6c756166 50472074
[ 154.615753@2] 7fa0 495f4f49 465f5152 494c4c41 0a20474e 00000000 00000000 2f493601 203a7325
[ 154.624033@2] 7fc0 29732528 74737220 6970675f 64253d6f 71726920 6970675f 64253d6f 71726920
[ 154.632313@2] 7fe0 0a64253d 00000000 5f746573 65726964 6f697463 6f66206e 64702072 2d617461
[ 154.640593@2] 8000 6970673e 73725f6f 61662074 64656c69 0000000a 00000000 2a2a2a2a 6e61632a
[ 154.648873@2] 8020 746f6e20 6d6f6320 696e756d 65746163 74697720 77612068 33323539 00000a62
[ 154.657153@2] 8040 35397761 20623332 6c696166 74206465 6572206f 3a746573 000a6425 00000000
[ 154.665432@2] 8060 2f493601 203a7325 29732528 39776120 62333235 74656720 69686320 64695f70
[ 154.673715@2]
[ 154.673715@2] X28: 0xffffffc0025e96a0:
[ 154.679061@2] 96a0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 154.687340@2] 96c0 00000000 00000000 00000000 00000000 00000000 00000000 62385c18 ffffffc0
[ 154.695620@2] 96e0 00000000 00000000 632fed98 ffffffc0 00000000 00000000 631eb800 ffffffc0
[ 154.703901@2] 9700 6353e600 ffffffc0 00000023 00000000 00000000 00000000 00000000 00000000
[ 154.712181@2] 9720 00000000 00000000 63518000 ffffffc0 63075780 ffffffc0 630757e0 ffffffc0
[ 154.720462@2] 9740 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 154.728740@2] 9760 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 154.737020@2] 9780 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 154.745309@2]
[ 154.745309@2] X29: 0xffffffc0ffffff40:
[ 154.750648@2] ff40 ******** ******** ******** ******** ******** ******** ******** ********
[ 154.758928@2] ff60 ******** ******** ******** ******** ******** ******** ******** ********
[ 154.767210@2] ff80 ******** ******** ******** ******** ******** ******** ******** ********
[ 154.775488@2] ffa0 ******** ******** ******** ******** ******** ******** ******** ********
[ 154.783767@2] ffc0 ******** ******** ******** ******** ******** ******** ******** ********
[ 154.792048@2] ffe0 ******** ******** ******** ******** ******** ******** ******** ********
[ 154.800327@2] 0000 ******** ******** ******** ******** ******** ******** ******** ********
[ 154.808608@2] 0020 ******** ******** ******** ******** ******** ******** ******** ********
[ 154.816900@2] [r30]:ffffffc001939fe4, page: 1939, fun:0xffffffc001080000
[ 154.823530@2] [r29]:ffffffc0ffffffc0, fun:--------
[ 154.828277@2] [r28]:ffffffc0025e9720, page: 25e9, fun:0xffffffc001080000
[ 154.834915@2] [r27]:0000000000000000, fun:--------
[ 154.839658@2] [r26]:00000000ffffffff, fun:--------
[ 154.844404@2] [r25]:ffffffc001f68000, page: 1f68, fun:0xffffffc001080000
[ 154.851046@2] [r24]:ffffffc001f684b8, page: 1f68, fun:0xffffffc001080000
[ 154.857686@2] [r23]:ffffffc0632ff098, page:632ff, fun: (null)
[ 154.864156@2] [r22]:ffffffc0025e9000, page: 25e9, fun:0xffffffc001080000
[ 154.870796@2] [r21]:ffffffc001f68478, page: 1f68, fun:0xffffffc001080000
[ 154.877438@2] [r20]:ffffffc001f68218, page: 1f68, fun:0xffffffc001080000
[ 154.884079@2] [r19]:ffffffc001c9cbf8, page: 1c9c, fun:0xffffffc001080000
[ 154.890718@2] [r18]:0000000000000000, fun:--------
[ 154.895462@2] [r17]:0000000000000000, fun:--------
[ 154.900208@2] [r16]:ffffffc00120e378, page: 120e, fun:0xffffffc001080000
[ 154.906847@2] [r15]:00000000000000d5, fun:--------
[ 154.911590@2] [r14]:0000000000000001, fun:--------
[ 154.916334@2] [r13]:0000000000000001, fun:--------
[ 154.921077@2] [r12]:0000000000040000, fun:--------
[ 154.925821@2] [r11]:00000000000182d0, fun:--------
[ 154.930565@2] [r10]:00000000000007bc, fun:--------
[ 154.935309@2] [r 9]:0000000000000000, fun:--------
[ 154.940055@2] [r 8]:ffffffc0013cf87c, page: 13cf, fun:0xffffffc001080000
[ 154.946697@2] [r 7]:ffffffc00219de70, page: 219d, fun:0xffffffc001080000
[ 154.953336@2] [r 6]:0000000000000056, fun:--------
[ 154.958079@2] [r 5]:0000000000000000, fun:--------
[ 154.962823@2] [r 4]:ffffffc1000000b0, fun:--------
[ 154.967567@2] [r 3]:0000000000000000, fun:--------
[ 154.972310@2] [r 2]:0000000000000078, fun:--------
[ 154.977054@2] [r 1]:0000000000000000, fun:--------
[ 154.981798@2] [r 0]:ffffffc1000000b0, fun:--------
[ 154.986541@2]
[ 154.988182@2] Process xxxxx_debug (pid: 1684, stack limit = 0xffffffc06318c058)
[ 154.995772@2] Stack: (0xffffffc06318fc40 to 0xffffffc063190000)
[ 155.001640@2] fc40: ffffffc0 ffffffc0 010c4848 ffffffc0 6339f200 ffffffc0 022999c0 ffffffc0
[ 155.009919@2] fc60: 01e44758 ffffffc0 632ff098 ffffffc0 01939f28 ffffffc0 00000000 00000000
[ 155.018199@2] fc80: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 155.026479@2] fca0: 01939f28 ffffffc0 00000000 00000000 00000000 00000000 00000000 00000000
[ 155.034759@2] fcc0: 00000000 00000000 00000000 00000000 053cc000 ffffffc0 000000c0 00000000
[ 155.043039@2] fce0: 6318fd50 ffffffc0 01e48d00 ffffffc0 0225e6c1 ffffffc0 001c8000 ffffffc0
[ 155.051320@2] fd00: 00000000 00000000 00000000 00000000 00000003 00000000 00000001 00000000
[ 155.059609@2] fd20: 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 155.067888@2] fd40: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 155.076167@2] fd60: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 155.084448@2] fd80: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 155.092729@2] fda0: 00000000 00000000 00000000 00000000 6318fdd0 ffffffc0 01b96554 ffffffc0
[ 155.101010@2] fdc0: 053e3b28 ffffffc0 01b96254 ffffffc0 6318fe00 ffffffc0 010e80e0 ffffffc0
[ 155.109290@2] fde0: 053e3b28 ffffffc0 010e80b4 ffffffc0 053e3b28 ffffffc0 00000040 00000000
[ 155.117586@2] fe00: 6318fe30 ffffffc0 010c4840 ffffffc0 6339f200 ffffffc0 022999c0 ffffffc0
[ 155.125849@2] fe20: 01e44758 ffffffc0 632ff098 ffffffc0 00000000 00000000 010843c0 ffffffc0
[ 155.134129@2] fe40: 010c476c ffffffc0 6339f200 ffffffc0 00000000 00000000 00000000 00000000
[ 155.142409@2] fe60: 00000000 00000000 6339f200 ffffffc0 00000000 00000000 00000000 00000000
[ 155.150689@2] fe80: 00000000 00000000 632ff098 ffffffc0 00000000 00000000 00000000 ffffffc0
[ 155.158970@2] fea0: 6318fea0 ffffffc0 6318fea0 ffffffc0 00000000 ffffffc0 00000000 ffffffc0
[ 155.167249@2] fec0: 6318fec0 ffffffc0 6318fec0 ffffffc0 00000000 00000000 00000000 00000000
[ 155.175528@2] fee0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 155.183808@2] ff00: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 155.192088@2] ff20: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 155.200368@2] ff40: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 155.208649@2] ff60: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 155.216928@2] ff80: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 155.225222@2] ffa0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 155.233503@2] ffc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000005 00000000
[ 155.241785@2] ffe0: 00000000 00000000 00000000 00000000 e6693265 d3876488 72c7c650 c6115666
这个错误很明显,说的是访问非法地址异常
Unable to handle kernel paging request at virtual address ffffffc1000000b0
为什么这个地址是非法地址呢?
因为这个地址是在4G 以上了
进程内存地址空间分布
按照以前书上,或linux内核2.6 内核的逻辑地址 与 用户空间逻辑地址 (逻辑地址有时也被叫虚拟地址) 都是位于 0x00000000~0xFFFFFFFF 这段虚拟地址空间 ,其中用户空间逻辑地址 位于 逻辑地址 0x00000000~ 0xBFFFFFFF ,共3g , 内核逻辑地址是 0xC0000000~0XFFFFFFFF,共1g。而且这个地址空间对于每个进程来说都是独立的。
这里解释一下独立是什么含义。
看一下这个图
![](https://img.haomeiwen.com/i22668939/df63523ba3732de9.jpg)
每个进程看到的 地址空间都是一样的,比如.text 都是从0x80048000 开始,然后用户栈都是从0xBFFFFFFF 向低地址增长,内核地址空间都是0xC0000000~0xFFFFFFFF。
addr2line & objdump
回到Panic的问题,为什么会访问到非常指针呢?
通过addr2line 定位PC 寄存器函数位置 pc : [<ffffffc00145492c>]
addr2line vmlinux 0xffffffc00145492c
先找出是哪个变量的地址有问题,
奇怪的是看到这个变量声明后别没有修改到它,如下demo中的value,定义后只是作为函数参数作为局部调用,
{
//...
work_thr = kthread_run(_data_monitor, data, "_data_monitor");
//...
}
static int xxxxx_rs232_data_monitor(void *data)
{
u8 value_before[APPO2X_BUFFER_SIZE];
u8 value[APPO2X_BUFFER_SIZE] ={0};
u8 value_after[APPO2X_BUFFER_SIZE];
while (1) {
ret = 0;
value_len = 0;
KLOGD("%s %d value:%p\n", __func__, __LINE__, value);
memset(value, 0x0, APPO2X_BUFFER_SIZE);
value_len = xxxxxx_dequeue_data_lists(iic_data_head, value);
KLOGD("%s %d value_len:%d value:%s\n", __func__, __LINE__, value_len, value);
if (value_len > 0) {
//.....
}
KLOGD("%s %d value:%p\n", __func__, __LINE__, value_before);
KLOGD("%s %d value:%p\n", __func__, __LINE__, value);
KLOGD("%s %d value:%p\n", __func__, __LINE__, value_after);
xxxxxx_handle_rs232_ret(g_rs232_cmd_ret_head, ddata, value);
KLOGD("%s %d value:%p\n", __func__, __LINE__, value_before);
KLOGD("%s %d value:%p\n", __func__, __LINE__, value);
KLOGD("%s %d value:%p\n", __func__, __LINE__, value_after);
schedule_timeout_interruptible(msecs_to_jiffies(5000));
ret = !kthread_should_stop();
}
return 0;
}
通过添加打印确认是
函数调用出栈后, value指针值的被修改了
[ 148.386466@2] D/xxxx: xxxx_rs232_data_monitor 884 value:ffffffc06318fcb0
[ 148.394093@2] D/xxxx: xxxx_rs232_data_monitor 885 value:ffffffc06318fd30
[ 148.401489@2] D/xxxx: xxxx_rs232_data_monitor 886 value:ffffffc06318fdb0
[ 148.408957@2] D/xxxx: xxxx_dequeue_data_lists ffffffc0630757e0 ffffffc04b78b660 ffffffc04fe2de20 ret:18
[ 148.419109@2] D/xxxx: xxxx_handle_rs232_ret 790 ret:18
[ 148.426889@2] D/xxxx: xxxx_handle_rs232_ret 818 ffffffc06318fd30
[ 148.431876@2] D/xxxx: xxxx_rs232_data_monitor 890 value:ffffffc100000030
[ 148.439355@2] D/xxxx: xxxx_rs232_data_monitor 891 value:ffffffc1000000b0
[ 148.446841@2] D/xxxx: xxxx_rs232_data_monitor 892 value:ffffffc100000130
在 ARM64 中,函数的参数是保存在X0-X7(W0-W7)这8个寄存器里面,如果超过8个参数,超过的参数会入栈,保存在栈里面。
x0 : ffffffc1000000b0 这个是对应的就是访问上面Trace中的memset 非法方位的参数的地址值
看看SP寄存器值是的多少 sp : ffffffc06318fc40 , ffffffc0 ffffffc0, 截取上面部分Trace 如下
[ 153.781895@2] fc40 ffffffc0 ffffffc0 010c4848 ffffffc0 6339f200 ffffffc0 022999c0 ffffffc0
通过objdump查看汇编代码
objdump -dSl vmliux > kernel.asm
是将X29寄存器值加上偏移量算出来的值作为vlaue 的指针值
KLOGD("%s %d value:%p\n", __func__, __LINE__, value_before);
ffffffc00193a09c: 9101c3a4 add x4, x29, #0x70
ffffffc00193a0a0: 52806f43 mov w3, #0x37a // #890
ffffffc00193a0a4: aa1303e2 mov x2, x19
ffffffc00193a0a8: aa1403e1 mov x1, x20
ffffffc00193a0ac: aa1503e0 mov x0, x21
ffffffc00193a0b0: 9409413c bl ffffffc001b8a5a0 <printk>
KLOGD("%s %d value:%p\n", __func__, __LINE__, value);
ffffffc00193a0b4: 9103c3a4 add x4, x29, #0xf0
ffffffc00193a0b8: 52806f63 mov w3, #0x37b // #891
ffffffc00193a0bc: aa1303e2 mov x2, x19
ffffffc00193a0c0: aa1403e1 mov x1, x20
ffffffc00193a0c4: aa1503e0 mov x0, x21
ffffffc00193a0c8: 94094136 bl ffffffc001b8a5a0 <printk>
KLOGD("%s %d value:%p\n", __func__, __LINE__, value_after);
ffffffc00193a0cc: 9105c3a4 add x4, x29, #0x170
ffffffc00193a0d0: 52806f83 mov w3, #0x37c // #892
ffffffc00193a0d4: aa1303e2 mov x2, x19
ffffffc00193a0d8: aa1403e1 mov x1, x20
ffffffc00193a0dc: aa1503e0 mov x0, x21
ffffffc00193a0e0: 94094130 bl ffffffc001b8a5a0 <printk>
那么需要继续往调用的函数中是X29 X30 和SP指针中的出栈和压栈
ARM6 汇编——寄存器和指令
- 处理器和寄存器的位数
32位处理器,能同时处理32位的数据,所以对应寄存器为32位的;
64位处理器,能同时处理64位的数据,所以对应寄存器为64位的;
寄存器位数一般会对应处理器位数,两者一般相等,但也有例外8086
- ARM 指令长度
ARM处理器用到的指令集分为 ARM 和 THUMB 两种。ARM指令长度固定为32bit,THUMB指令长度固定为16bit。所以 ARM64指令集的指令长度为32bit
- ARM中字的长度
字(Word):32位系统字长就是32,64位系统字长就是64。stdint.h文件中定义了宏__WORDSIZE表示字的位数:
#if __LP64__
#define __WORDSIZE 64
#else
#define __WORDSIZE 32
#endif
// 注:那么 LP64 是什么意思呢?
在64位机器上,如果int是32位,long是64位,pointer也是64位,那么该机器就是LP64的,其中的L表示Long,P表示Pointer,64表示Long和Pointer都是64位的。
半字(Half-Word):半字永远是字的一半,双字永远是字的2倍大小
字节(Byte):8位
<meta charset="utf-8">
寄存器
ARM64 有34个寄存器,包括31个通用寄存器、SP、PC、CPSR。
寄存器 | 位数 | 描述 |
---|---|---|
x0-x30 | 64bit | 通用寄存器,如果有需要可以当做32bit使用:WO-W30 |
FP(x29) | 64bit | 保存栈帧地址(栈底指针) |
LR(x30) | 64bit | 通常称X30为程序链接寄存器,保存子程序结束后需要执行的下一条指令 |
SP | 64bit | 保存栈指针,使用 SP/WSP来进行对SP寄存器的访问。 |
PC | 64bit | 程序计数器,俗称PC指针,总是指向即将要执行的下一条指令,在arm64中,软件是不能改写PC寄存器的。 |
CPSR | 64bit | 状态寄存器 |
-
x0-x7: 用于子程序调用时的参数传递,X0还用于返回值传递
-
x0 - x30
是31个通用整形寄存器。每个寄存器可以存取一个64位大小的数。 当使用x0 - x30
访问时,它就是一个64位的数。当使用w0 - w30
访问时,访问的是这些寄存器的低32位,如图:image
-
CPSR(状态寄存器)
NZCV是状态寄存器的条件标志位,分别代表运算过程中产生的状态,其中:
- N, negative condition flag,一般代表运算结果是负数
- Z, zero condition flag, 指令结果为0时Z=1,否则Z=0;
- C, carry condition flag, 无符号运算有溢出时,C=1。
- V, oVerflow condition flag 有符号运算有溢出时,V=1。
<meta charset="utf-8">
指令
- ARM64经常用到的汇编指令
MOV X1,X0 ;将寄存器X0的值传送到寄存器X1
ADD X0,X1,X2 ;寄存器X1和X2的值相加后传送到X0
SUB X0,X1,X2 ;寄存器X1和X2的值相减后传送到X0
AND X0,X0,#0xF ; X0的值与0xF相位与后的值传送到X0
ORR X0,X0,#9 ; X0的值与9相位或后的值传送到X0
EOR X0,X0,#0xF ; X0的值与0xF相异或后的值传送到X0
LDR X5,[X6,#0x08] ;ld:load; X6寄存器加0x08的和的地址值内的数据传送到X5
LDP x29, x30, [sp, #0x10] ; ldp :load pair ; 一对寄存器, 从内存读取数据到寄存器
STR X0, [SP, #0x8] ;st:store,str:往内存中写数据(偏移值为正); X0寄存器的数据传送到SP+0x8地址值指向的存储空间
STUR w0, [x29, #-0x8] ;往内存中写数据(偏移值为负)
STP x29, x30, [sp, #0x10] ;store pair,存放一对数据, 入栈指令
CBZ ;比较(Compare),如果结果为零(Zero)就转移(只能跳到后面的指令)
CBNZ ;比较,如果结果非零(Non Zero)就转移(只能跳到后面的指令)
CMP ;比较指令,相当于SUBS,影响程序状态寄存器CPSR
B ;跳转指令,可带条件跳转与cmp配合使用
BL ;带返回的跳转指令, 返回地址保存到LR(X30)
BLR ; 带返回的跳转指令,跳转到指令后边跟随寄存器中保存的地址(例:blr x8 ;跳转到x8保存的地址中去执行)
RET ;子程序返回指令,返回地址默认保存在LR(X30)
其中 MOV
指令只能用于寄存器之间传值,寄存器和内存之间传值通过 LDR
和 STR
-
ARM指令又一个重要特点就是所有指令都是带有条件的,就是说汇编中就需要根据状态寄存器中的一些状态来控制分支的执行。例如:
image
图中指令
b
是跳转指令,后边跟着跳转的条件eq
,那么这个eq
是什么意思呢? -
ARM指令的结构
image
上图列出了不同种类ARM指令的编码格式,文章开头讲过ARM指令长度固定为 32bit即图中的0-31位。
28-31位是条件码,21-24为操作码,12-19为寄存器编号
上边提到的跳转条件eq
实际就是28-31位对应的条件码,但是28-31位都是二进制数据不好记,所以就对二进制的条件码取了好记的助记符,例如 eq
。
eq
英文单词equal
的意思,注意这里equal
并不是c语言当中==
的意思,这里根据状态寄存器的条件标志位Z
来判断,如果Z = 1
则eq
成立,如果Z = 0
则eq
不成立,就是NE
。
- ARM指令包含4位的条件码列表:
操作码 | 条件码助记符 | 标志 | 含义 |
---|---|---|---|
0000 | EQ | Z=1 | 相等 |
0001 | NE(Not Equal) | Z=0 | 不相等 |
0010 | CS/HS(Carry Set/High or Same) | C=1 | 无符号数大于或等于 |
0011 | CC/LO(Carry Clear/LOwer) | C=0 | 无符号数小于 |
0100 | MI(MInus) | N=1 | 负数 |
0101 | PL(PLus) | N=0 | 正数或零 |
0110 | VS(oVerflow set) | V=1 | 溢出 |
0111 | VC(oVerflow clear) | V=0 | 没有溢出 |
1000 | HI(HIgh) | C=1,Z=0 | 无符号数大于 |
1001 | LS(Lower or Same) | C=0,Z=1 | 无符号数小于或等于 |
1010 | GE(Greater or Equal) | N=V | 有符号数大于或等于 |
1011 | LT(Less Than) | N!=V | 有符号数小于 |
1100 | GT(Greater Than) | Z=0,N=V | 有符号数大于 |
1101 | LE(Less or Equal) | Z=1,N!=V | 有符号数小于或等于 |
1110 | AL | 任何 | 无条件执行(默认) |
1111 | NV | 任何 | 从不执行 |
ARM指令所有指令都是带有条件的,默认是AL
即无条件执行,当指令带有默认条件时不需要明确写出。
- 后续添加:
adrp是计算指定的符号地址到run time PC值的相对偏移
- STR Wt, addr
Store Register: stores word from Wt to memory addressed by
addr.
- STR Xt, addr
Store Register (extended): stores doubleword from Xt to
memory addressed by addr.
- STUR Wt, [base,#simm9]
Store (Unscaled) Register: stores word from Wt to memory addressed by base+simm9.
- STUR Xt, [base,#simm9]
Store (Unscaled) Register (extended): stores doubleword
from Xt to memory addressed by base+simm9.
- SCVTF Sm, Ro
Converts an integer value to a floating-point value.
- FCVTSty Rn, Sm
Converts a floating-point value to an integer value (ty specifies type of rounding).
- FMUL Sd, Sn, Sm
Multiplies two values.
- LDRSB Wt, addr
Load Signed Byte: loads a byte from memory addressed by
addr, then sign-extends it into Wt.
- CBZ Wn, label
Compare and Branch Zero: conditionally jumps to label if
Wn is equal to zero.
MOVZ 、MOVK 和MOVN
MOVZ 赋值一个16位的立即数到寄存器中,该寄存器中除了立即数占用到的位之外的其他位都设为0,立即数可以设置向左移位0、16、32或者48(lsl:向左移位):
instruction value of x0
movz x0, #0x1234 | 0x1234
movz x0, #0x1234, lsl #16 | 0x12340000
MOVK 赋值一个立即数到寄存器,保持立即数没用到的位保持不变。
instruction value of x0
mov x0, xzr | 0x0000000000000000
movk x0, #0x0123, lsl #48 | 0x0123000000000000
movk x0, #0x4567, lsl #32 | 0x0123456700000000
movk x0, #0x89ab, lsl #16 | 0x0123456789ab0000
movk x0, #0xcdef | 0x0123456789abcdef
MOVN 用于赋值立即数的位掩码,例如想要将0xffffffff0000ffff赋值给x0,只需要使用MOVN将向左移位16的0xffff赋值位寄存器就可以实现,会自动求移位后的立即数位掩码然后赋值:
instruction value of x0
MOVN x0, 0xFFFF, lsl 16 | 0xffffffff0000ffff
寄存器和函数本质
推荐这几篇文章
https://www.jianshu.com/p/ed3b0d3309ee
https://www.jianshu.com/p/cf29fb303bdc
https://blog.csdn.net/softee/article/details/51019329
栈
栈是一种具有特殊访问方式的存储空间(特性:先进后出 - First In Last Out,后进先出 - Last In First Out)
![](https://img.haomeiwen.com/i1955642/16e27cd122950db3.png)
函数调用会开辟一段内存空间(栈空间)用于函数的局部变量、参数和寄存器的保护
sub sp, sp,#0x20 ;拉伸栈空间
函数调用完毕之后也需要释放空间
add sp, sp, #0x20 ;栈平衡
补充:sp拉伸空间的大小是根据什么?
函数的参数和局部变量的内存空间大小 + x29、x30的内存空间大小
拉伸空间的大小最少为16字节,并且必须是16字节的倍数
sp 和 fp 寄存器
- sp寄存器在任意时刻会保存栈顶的地址
- fp寄存器也称为x29寄存器属于通用寄存器,但是在某些时刻我们利用它保存栈底的地址
注意:
1.ARM64 开始就取消了32位的 LDM,STM,PUSH,POP指令,取而代之的是str\stp、ldr\ldp
2.ARM64 里面对栈的操作是16字节对齐
内存读写指令
注意:读/写数据都是往高地址读/写
str(store register)指令
将数据从寄存器中读出来,存到内存中
ldr(load register)指令
将数据从内存中读出来,存到寄存器中
此 ldr 和 str 的变种 ldp 和 stp 还可以操作2个寄存器
<meta charset="utf-8">
<article class="_2rhmJa">
函数的本质
函数的参数
在 ARM64 中,函数的参数是保存在X0-X7(W0-W7)这8个寄存器里面,如果超过8个参数,超过的参数会入栈,保存在栈里面。
调用函数一:(这种情况是参数个数不超过8)
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int sum1(int a, int b) {
return a + b;
}
int main(int argc, char * argv[]) {
sum1(10, 20);
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
- 未调用函数时的汇编代码
![](https://img.haomeiwen.com/i1955642/2a29b98b24657fdd.png)
- 进入函数后的汇编代码
![](https://img.haomeiwen.com/i1955642/0a1eb99e00bd9f55.png)
调用函数二:(这种情况是参数个数超过8)
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int sum2(int a, int b, int c, int d, int e, int f, int g, int h, int i) {
int sum = a + b + c + d + e + f + g + h + i;
return sum;
}
int main(int argc, char * argv[]) {
sum2(1, 2, 3, 4, 5, 6, 7, 8, 9);
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
- 未调用函数时的汇编代码
![](https://img.haomeiwen.com/i1955642/adbb3b7205d1058b.png)
- 进入函数后的汇编代码
![](https://img.haomeiwen.com/i1955642/694f163fcb6fc1f5.png)
函数的局部变量
在 ARM64 中,函数的局部变量保存在栈里面。
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int sum3() {
int a = 10;
int b = 20;
return a + b;
}
int main(int argc, char * argv[]) {
sum3();
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
- 未调用函数时的汇编代码
![](https://img.haomeiwen.com/i1955642/c6cda6ec560da94f.png)
- 进入函数后的汇编代码
![](https://img.haomeiwen.com/i1955642/84067fab865b334f.png)
通过调用函数的前后汇编代码可以发现函数的局部变量保存在栈里面,当函数调用完之后,保持栈平衡,就是我们所谓的释放内存空间,其实真正意义上是此数据仍在内存中,只是此时没法直接访问到,等待下一次其他数据的覆盖。
函数的返回值
在 ARM64 中,函数的返回值保存在 x0寄存器
函数的嵌套调用
注意事项:
1.当此函数为叶子函数时,就不需要在对 x29 和 x30 寄存器的保护。
叶子函数:函数里面不再调用其他函数。
2.当函数中的参数还有其他函数的引用时,需要对参数入栈,进行保护,以防引起数据错误。
叶子函数
//叶子函数
int funcA(int a, int b) {
return a+b;
}
//非叶子函数
void funcB() {
printf("haha"); //调用 printf 函数
}
![](https://img.haomeiwen.com/i1955642/23b229bf6bd35184.png)
![](https://img.haomeiwen.com/i1955642/f11205ed72cf4907.png)
明显可以发现叶子函数并没有做任何对 x29 和 x30 寄存器的保护。
函数嵌套
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int funcA(int a, int b) {
return a+b;
}
int funcC(int a, int b) {
int c = funcA(a, b);
int d = funcA(a, b);
return c+d;
}
int main(int argc, char * argv[]) {
funcC(10, 20);
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
![](https://img.haomeiwen.com/i1955642/5212166c29dbc7a7.png)
网友评论