一个panic bug的分析过程1

2023-10-30

  一个panic bug的分析过程(一)  2012-05-15 14:57:06

分类: LINUX

一个工作中遇到的bug的问题,分析一下流程,顺便把panic这种类似的bug流程做一些分析:
环境: linux 3.0, arm 芯片平台
首先看出问题时的backtrace 如下:
<6>[ 10.298767] regulator_init_complete: disabling vrfref 
<6>[ 10.299163] regulator_init_complete: disabling vrf2 
<1>[ 10.300750] Unable to handle kernel paging request at virtual address fc4ba1c0 
<1>[ 10.300781] pgd = c0004000 
<1>[ 10.300781] [fc4ba1c0] *pgd=00000000 
<0>[ 10.300811] Internal error: Oops: 5 [#1] PREEMPT SMP 
<0>[ 10.300842] last sysfs file: 
<4>[ 10.300842] Modules linked in: 
<4>[ 10.300872] CPU: 0 Tainted: G W (2.6.35.7-eng-gddc8274 #1) 
<4>[ 10.300933] PC is at strcmp+0x4/0x34 
<4>[ 10.300964] LR is at platform_match+0x5c/0x68 
<4>[ 10.300994] pc : [<c0284da8>] lr : [<c032d6e0>] psr: 60000013 
<4>[ 10.301025] sp : dc455f30 ip : 00000070 fp : 00000000 
<4>[ 10.301055] r10: 000000a0 r9 : 00000000 r8 : c032ac98 
<4>[ 10.301055] r7 : 00000000 r6 : c093a020 r5 : dc4a62a8 r4 : 00000000 
<4>[ 10.301086] r3 : 00000000 r2 : 00000001 r1 : c07c29fa r0 : fc4ba1c0 
<4>[ 10.301116] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel 
<4>[ 10.301147] Control: 10c53c7f Table: 8000404a DAC: 00000015 
<4>[ 10.301177] 
<4>[ 10.301177] PC: 0xc0284d28: 
<4>[ 10.301208] 4d28 e2822001 e5d23000 e3530000 1afffffb e7d1c003 e35c0000 e7c2c003 e2833001 
<4>[ 10.301239] 4d48 1afffffa e12fff1e e3520000 e92d4010 11a0c000 1a000001 e8bd8010 e28cc001 
<4>[ 10.301300] 4d68 e5dc3000 e3530000 1afffffb ea000004 e1520003 1a000002 e3a03000 e7cc3002 
<4>[ 10.301361] 4d88 e8bd8010 e7d14003 e3540000 e7cc4003 e2833001 1afffff5 e8bd8010 e3a03000 
<4>[ 10.301391] 4da8 e7d02003 e7d1c003 e2833001 e152000c 0a000002 23a00001 33e00000 e12fff1e 
<4>[ 10.301452] 4dc8 e3520000 1afffff5 e1a00002 e12fff1e e92d4010 e3a03000 ea000009 e7d0c003 
<4>[ 10.301483] 4de8 e7d14003 e2833001 e15c0004 0a000002 23a00001 33e00000 e8bd8010 e35c0000 
<4>[ 10.301544] 4e08 0a000002 e3520000 e2422001 1afffff2 e3a00000 e8bd8010 e6ef2072 e3a03000 
<4>[ 10.301605] 
<4>[ 10.301605] LR: 0xc032d660: 
<4>[ 10.301635] d660 e3530000 05103008 e1a00001 e59f100c ebfd4f2b e3a00000 e8bd8010 c082324e 
<4>[ 10.301666] d680 c0823240 e92d4070 e5914038 e2405008 e3540000 1a000006 ea00000d e5950000 
<4>[ 10.301727] d6a0 ebfd5dbf e3500000 05854168 0a000005 e2844018 e5d43000 e1a01004 e3530000 
<4>[ 10.301757] d6c0 1afffff5 e1a04003 e2540000 13a00001 e8bd8070 e5100008 e5911000 ebfd5db0 
<4>[ 10.301818] d6e0 e2700001 33a00000 e8bd8070 e92d47f0 e3a04000 e1a05000 e1a06001 e1a0a002 
<4>[ 10.301879] d700 e1a08004 ea00000a e5957164 e0877004 e284401c e597300c e2033c1f e1560003 
<4>[ 10.301910] d720 1a000003 e5970008 ebfd5d9d e3500000 0a000005 e5953160 e1a0100a e1580003 
<4>[ 10.301971] d740 e2888001 3affffef e3a07000 e1a00007 e8bd87f0 e1a02001 e3a01b01 e92d4010 
<4>[ 10.302032] 
<4>[ 10.302032] SP: 0xdc455eb0: 
<4>[ 10.302032] 5eb0 00000000 c01a5e98 dc455ee8 dbbfb608 dc455ee0 dbbfc7e0 00000001 dc4209b0 
<4>[ 10.302093] 5ed0 ffffffff dc455f1c c093a020 00000000 c032ac98 c0671eec fc4ba1c0 c07c29fa 
<4>[ 10.302124] 5ef0 00000001 00000000 00000000 dc4a62a8 c093a020 00000000 c032ac98 00000000 
<4>[ 10.302185] 5f10 000000a0 00000000 00000070 dc455f30 c032d6e0 c0284da8 60000013 ffffffff 
<4>[ 10.302246] 5f30 dc4a62b0 dc455f50 c093a020 c032c280 c093a020 dc455f50 c032c260 c032b5a8 
<4>[ 10.302276] 5f50 dc447940 dc4a4378 c093a020 c093a020 dbbfc7e0 c093a6c8 00000000 c032adbc 
<4>[ 10.302337] 5f70 c07c29fa c07c29fa c093a020 c004be14 00000001 00000002 00000000 00000000 
<4>[ 10.302368] 5f90 00000000 c032c5ac c0031b64 c004be14 00000001 00000002 00000000 c0057598 
<4>[ 10.302429] 
<4>[ 10.302429] R0: 0xfc4ba140: 
<4>[ 10.302459] a140 ******** ******** ******** ******** ******** ******** ******** ******** 
<4>[ 10.302520] a160 ******** ******** ******** ******** ******** ******** ******** ******** 
<4>[ 10.302551] a180 ******** ******** ******** ******** ******** ******** ******** ******** 
<4>[ 10.302612] a1a0 ******** ******** ******** ******** ******** ******** ******** ******** 
<4>[ 10.302673] a1c0 ******** ******** ******** ******** ******** ******** ******** ******** 
<4>[ 10.302734] a1e0 ******** ******** ******** ******** ******** ******** ******** ******** 
<4>[ 10.302764] a200 ******** ******** ******** ******** ******** ******** ******** ******** 
<4>[ 10.302825] a220 ******** ******** ******** ******** ******** ******** ******** ******** 
<4>[ 10.302886] 
<4>[ 10.302886] R1: 0xc07c297a: 
<4>[ 10.302917] 2978 32332d70 79732d6b 742d636e 72656d69 696d6400 6f632d63 00636564 70616d6f 
<4>[ 10.302947] 2998 6562612d 6961642d 616d6f00 62612d70 78762d65 2d636572 00696164 70616d6f 
<4>[ 10.303009] 29b8 62636d2d 642d7073 6f006961 2d70616d 2d6d6370 69647561 6d6f006f 2d327061 
<4>[ 10.303039] 29d8 6c69616d 00786f62 70616d6f 756f765f 6d6f0074 775f7061 6d6f0062 666c7061 
<4>[ 10.303100] 29f8 76700062 76727372 6f006d6b 6470616d 68007373 00696d64 0064636c 3c007525 
<4>[ 10.303161] 2a18 73253e33 3a732520 656c7320 745f7065 6f656d69 735f7475 65726f74 6e49203a 
<4>[ 10.303192] 2a38 696c6176 61762064 0a65756c 0a752500 6f6c2f00 726c6163 2f6f7065 7162636d 
<4>[ 10.303253] 2a58 772f3338 736b726f 65636170 616c702f 726f6674 656b2f6d 6c656e72 616d6f2f 
<4>[ 10.303314] 2a78 612f3470 2f686372 2f6d7261 6863616d 616d6f2d 732f3270 61697265 00632e6c 
<4>[ 10.303344] 
<4>[ 10.303344] R5: 0xdc4a6228: 
<4>[ 10.303375] 6228 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
<4>[ 10.303405] 6248 00000000 00000000 00000000 00000000 00000000 00000000 165f8171 57515555 
<4>[ 10.303466] 6268 5d555755 06055d55 635688c0 d84156c5 c755d51d c008eacc 564d4157 577de515 
<4>[ 10.303527] 6288 d415d35d 4d254555 75861555 5755d977 635688c0 d84156c5 f00dcafe 00000000 
<4>[ 10.303558] 62a8 fc4ba1c0 00000002 c093a570 dc4a4340 dc4ba160 1c4a607c dc4a64fc c093a578 
<4>[ 10.303619] 62c8 dc437e40 c093a3f0 dc4aabf0 00000005 00000007 00000000 00000000 00000001 
<4>[ 10.303649] 62e8 00000000 00000000 dc4a62f0 dc4a62f0 00000000 00000000 dc4a62e4 c093a6c8 
<4>[ 10.303710] 6308 c097ebec dc4a9f80 00000000 00000000 00000001 dc4a60dc dc4a655c 7fffffff 
<4>[ 10.303771] 
<4>[ 10.303771] R6: 0xc0939fa0: 
<4>[ 10.303771] 9fa0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
<4>[ 10.303833] 9fc0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
<4>[ 10.303863] 9fe0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
<4>[ 10.303924] a000 00000000 00000000 00000000 c02f92a0 c02f9264 c02f9050 c02f9024 c02f8ff8 
<4>[ 10.303985] a020 c07c29fa c093a6c8 00000000 00000000 00000000 00000000 c032d450 c032d474 
<4>[ 10.304016] a040 c032d490 00000000 00000000 00000000 00000000 dbbfc7e0 00000000 c093a05c 
<4>[ 10.304077] a060 c093a05c c02fc340 c02f95ec 00000001 c02fc368 c02fc348 c02fcb68 00000000 
<4>[ 10.304107] a080 c02fc544 c02fce68 c029fdc8 c02fc744 c02e3418 c02e4348 00000000 c02e2fc4 
<4>[ 10.304168] 
<4>[ 10.304168] R8: 0xc032ac18: 
<4>[ 10.304199] ac18 e5940030 e3500000 0a000001 e2800010 ebfd56fa e1a00004 e8bd8010 e92d47f3 
<4>[ 10.304229] ac38 e1a04000 e5900004 ebfffff1 e2506000 03e07015 0a0000ad e59f32cc e3a01401 
<4>[ 10.304290] ac58 e1c380d0 e0093001 e3530000 0a00000b e59f32b8 e3a01000 e3a00008 e1c380d0 
<4>[ 10.304321] ac78 e0082000 e0093001 e1921003 0a000003 e59f329c e5d33047 e3530000 1a00009d 
<4>[ 10.304382] ac98 e59f3290 e30810d0 e5937014 e1a00007 ebf88563 e59f8280 e1a05000 e1a00007 
<4>[ 10.304443] acb8 ebf87aee e59f2274 e5d23004 e3530000 e1a0a000 0a00001e e1a0100d e3c13d7f 
<4>[ 10.304473] acd8 e3c3303f e5931004 e2811001 e5831004 e5927010 e3570000 0a00000b e30890d0 
<4>[ 10.304534] acf8 e58da000 e3a03054 e58d9004 e1a01008 e5970004 e1a02005 e1a0e00f e597f000 
<0>[ 10.304595] Process swapper (pid: 1, stack limit = 0xdc4542f8) 
<0>[ 10.304626] Stack: (0xdc455f30 to 0xdc456000) 
<0>[ 10.304656] 5f20: dc4a62b0 dc455f50 c093a020 c032c280 
<0>[ 10.304687] 5f40: c093a020 dc455f50 c032c260 c032b5a8 dc447940 dc4a4378 c093a020 c093a020 
<0>[ 10.304718] 5f60: dbbfc7e0 c093a6c8 00000000 c032adbc c07c29fa c07c29fa c093a020 c004be14 
<0>[ 10.304779] 5f80: 00000001 00000002 00000000 00000000 00000000 c032c5ac c0031b64 c004be14 
<0>[ 10.304809] 5fa0: 00000001 00000002 00000000 c0057598 c07dd98d 00000170 c09220d8 c09f553c 
<0>[ 10.304840] 5fc0: 00000002 c004bdd0 c004be14 c09f553c 00000002 00000000 00000000 c000859c 
<0>[ 10.304901] 5fe0: 00000000 c000843c c005873c 00000013 00000000 c005873c 74545575 55575d54 
<4>[ 10.304962] [<c0284da8>] (strcmp+0x4/0x34) from [<c032d6e0>] (platform_match+0x5c/0x68) 
<4>[ 10.305023] [<c032d6e0>] (platform_match+0x5c/0x68) from [<c032c280>] (__driver_attach+0x20/0x84) 
<4>[ 10.305084] [<c032c280>] (__driver_attach+0x20/0x84) from [<c032b5a8>] (bus_for_each_dev+0x48/0x84) 
<4>[ 10.305114] [<c032b5a8>] (bus_for_each_dev+0x48/0x84) from [<c032adbc>] (bus_add_driver+0x188/0x330) 
<4>[ 10.305175] [<c032adbc>] (bus_add_driver+0x188/0x330) from [<c032c5ac>] (driver_register+0xa8/0x134) 
<4>[ 10.305236] [<c032c5ac>] (driver_register+0xa8/0x134) from [<c0057598>] (do_one_initcall+0x5c/0x1b8) 
<4>[ 10.305297] [<c0057598>] (do_one_initcall+0x5c/0x1b8) from [<c000859c>] (kernel_init+0x160/0x22c) 
<4>[ 10.305328] unwind: Unknown symbol address c000859c 
<4>[ 10.305328] unwind: Index not found c000859c 
<0>[ 10.305358] Code: e2833001 1afffff5 e8bd8010 e3a03000 (e7d02003) 
<4>[ 10.305450] ---[ end trace 1b75b31a2719ed25 ]--- 
<0>[ 10.305511] Kernel panic - not syncing: Attempted to kill init! 
<0>[ 10.305541] Die id:59ae000600000001 
<3>[ 10.305572] mbm_version=0x00000a6c 
<3>[ 10.305572] mbm_loader_version=0x00000a6c 
<0>[ 10.477203] Timestamp = 10.796 
<0>[ 10.477233] Current Time = 01-01 00:00:10.796, Uptime = 10.971 seconds
首先看panic时的现场如下: 
<1>[ 10.300750] Unable to handle kernel paging request at virtual address fc4ba1c0 
<1>[ 10.300781] pgd = c0004000 
<1>[ 10.300781] [fc4ba1c0] *pgd=00000000 
<0>[ 10.300811] Internal error: Oops: 5 [#1] PREEMPT SMP 
<0>[ 10.300842] last sysfs file: 
<4>[ 10.300842] Modules linked in: 
<4>[ 10.300872] CPU: 0 Tainted: G W (2.6.35.7-eng-gddc8274 #1) 
<4>[ 10.300933] PC is at strcmp+0x4/0x34 
<4>[ 10.300964] LR is at platform_match+0x5c/0x68 
<4>[ 10.300994] pc : [<c0284da8>] lr : [<c032d6e0>] psr: 60000013 

<4>[ 10.301025] sp : dc455f30 ip : 00000070 fp : 00000000 
<4>[ 10.301055] r10: 000000a0 r9 : 00000000 r8 : c032ac98 
<4>[ 10.301055] r7 : 00000000 r6 : c093a020 r5 : dc4a62a8 r4 : 00000000 
<4>[ 10.301086] r3 : 00000000 r2 : 00000001 r1 : c07c29fa r0 : fc4ba1c0 
<4>[ 10.301116] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel 
注意看PC 和 LR, 也就是说kernel 在调用 platform_match函数中的strcmp出现了panic,这时通过objdump(至于怎么dump,首先根据你panic时的commit,找到回应的source code,然后build相应的vmlinx,然后用objdump反汇编)将C和汇编的code 
dump出来,我截取了片段如下:
c0284da4 <strcmp>:
int strcmp(const char *cs, const char *ct)
{
        unsigned char c1, c2;
        while (1) {
                c1 = *cs++;
c0284da4:       e3a03000        mov     r3, #0  ; 0x0
c0284da8:       e7d02003        ldrb    r2, [r0, r3]       <<== panic时pc为 c0284da8, 此时 寄存器r3的值为0, r0为fc4ba1c0,访问fc4ba1c0这个虚拟地址出错,这也跟上面的提示出错的信息相吻合(Unable to handle kernel paging request at virtual address fc4ba1c0 )。
                c2 = *ct++;
c0284dac:       e7d1c003        ldrb    ip, [r1, r3]   
                if (c1 != c2)
因为我们知道lr是platform_match,所以可以找到对应的C code 如下(driver/base/platform.c):
static int platform_match(struct device *dev, struct device_driver *drv) 
{
struct platform_device *pdev = to_platform_device(dev);
struct platform_driver *pdrv = to_platform_driver(drv);
/* Attempt an OF style match first */
if (of_driver_match_device(dev, drv))
return 1;
/* Then try to match against the id table */
if (pdrv->id_table)
return platform_match_id(pdrv->id_table, pdev) != NULL;
/* fall-back to driver name match */
return (strcmp(pdev->name, drv->name) == 0);  <<===panic 在这里,通过上面的汇编看得出来r0是入口参数 const char *cs,  对应这里的实参是pdev->name,   说明pdev->name是一个无效的地址,所以trigger panic
}
依然如此,就有这样的疑问,因为pdev是平台数据的结构体,是pdev这个结构体本身就错了呢?还是pdev这个结构里面的一些成员变量的内存值变了呢?看下面的分析:
列出调用platform_match到strcmp之间的汇编和C的对照代码如下:
static int platform_match(struct device *dev, struct device_driver *drv)
{
c032d684:       e92d4070        push    {r4, r5, r6, lr}
        struct platform_device *pdev = to_platform_device(dev);
        struct platform_driver *pdrv = to_platform_driver(drv);
        /* match against the id table first */
        if (pdrv->id_table)
c032d688:       e5914038        ldr     r4, [r1, #56]
 * and compare it against the name of the driver. Return whether they match
 * or not.
 */
static int platform_match(struct device *dev, struct device_driver *drv)
{
        struct platform_device *pdev = to_platform_device(dev);
c032d68c:       e2405008        sub     r5, r0, #8      ; 0x8   <==通过上面的的汇编看到r0实际上是platform_match的入口参数,这里通过,to-platform_device这个函数将dev下面存的平台数据取出来,然后送给r5,此时r5就是pdev的机构体,因为panic的前一刻r5的值没有被变过,所以我们可以在stack里面找出其值来。
        struct platform_driver *pdrv = to_platform_driver(drv);
        /* match against the id table first */
        if (pdrv->id_table)
c032d690:       e3540000        cmp     r4, #0  ; 0x0
c032d694:       1a000006        bne     c032d6b4 <platform_match+0x30>
c032d698:       ea00000d        b       c032d6d4 <platform_match+0x50>
static const struct platform_device_id *platform_match_id(
                        const struct platform_device_id *id,
                        struct platform_device *pdev)
{
        while (id->name[0]) {
                if (strcmp(pdev->name, id->name) == 0) {
c032d69c:       e5950000        ldr     r0, [r5] <==注意看这里将r5的值取出来给r0,实际上也是pdev->name,所以通过这里看来第一次这里用到了这个内存单元的值是正确的,因为假设整个结构出问题的话,那么code运行到这里就应该出错了,所以排除第一种可能。
c032d6a0:       ebfd5dbf        bl      c0284da4 <strcmp>
c032d6a4:       e3500000        cmp     r0, #0  ; 0x0
                        pdev->id_entry = id;
c032d6a8:       05854168        streq   r4, [r5, #360]
c032d6ac:       0a000005        beq     c032d6c8 <platform_match+0x44>
                        return id;
                }
                id++;
c032d6b0:       e2844018        add     r4, r4, #24     ; 0x18
static const struct platform_device_id *platform_match_id(
                        const struct platform_device_id *id,
                        struct platform_device *pdev)
{
        while (id->name[0]) {
c032d6b4:       e5d43000        ldrb    r3, [r4]
                if (strcmp(pdev->name, id->name) == 0) {
c032d6b8:       e1a01004        mov     r1, r4
static const struct platform_device_id *platform_match_id(
                        const struct platform_device_id *id,
                        struct platform_device *pdev)
{
        while (id->name[0]) {
c032d6bc:       e3530000        cmp     r3, #0  ; 0x0
c032d6c0:       1afffff5        bne     c032d69c <platform_match+0x18>
                        pdev->id_entry = id;
                        return id;
                }
                id++;
        }
        return NULL;
c032d6c4:       e1a04003        mov     r4, r3
        struct platform_device *pdev = to_platform_device(dev);
        struct platform_driver *pdrv = to_platform_driver(drv);
        /* match against the id table first */
        if (pdrv->id_table)
                return platform_match_id(pdrv->id_table, pdev) != NULL;
c032d6c8:       e2540000        subs    r0, r4, #0      ; 0x0
c032d6cc:       13a00001        movne   r0, #1  ; 0x1
c032d6d0:       e8bd8070        pop     {r4, r5, r6, pc}
        /* fall-back to driver name match */
        return (strcmp(pdev->name, drv->name) == 0);
c032d6d4:       e5100008        ldr     r0, [r0, #-8] <==这里是将 r0-8位置的内存的值取出来(一个pdev结构的指针)放到r0寄存器中,这里实际是在给strcmp 准备实参, 我们可以看下pdev这个结构体如下,name是结构体的第一个成员变量,那么pdev的指针实际上就是指向pdev->name, 那么通过这里看出pdev结构体来自r0-8的位置,因为我们上面有两种假设:一是pdev这个结构本身就出问题了,另外一个就是pdev里面的一个成员错了,继续往上推。
struct platform_device {
const char * name;
int id;
struct device dev;
u32 num_resources;
struct resource * resource;
..........
};
c032d6d8:       e5911000        ldr     r1, [r1]
c032d6dc:       ebfd5db0        bl      c0284da4 <strcmp> <==这里将跳转到strcmp执行相应的code
c032d6e0:       e2700001        rsbs    r0, r0, #1      ; 0x1  <==实际上c032d6e0就是panic时的LR
c032d6e4:       33a00000        movcc   r0, #0  ; 0x0
我们根据r5的值找到panic时内存中r5寄存器对应的内存单元的值如下:
R5: 0xdc4a6228: 
6228 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
6248 00000000 00000000 00000000 00000000 00000000 00000000 165f8171 57515555 
6268 5d555755 06055d55 635688c0 d84156c5 c755d51d c008eacc 564d4157 577de515 
6288 d415d35d 4d254555 75861555 5755d977 635688c0 d84156c5 f00dcafe 00000000 
62a8 fc4ba1c0 00000002 c093a570 dc4a4340 dc4ba160 1c4a607c dc4a64fc c093a578 
62c8 dc437e40 c093a3f0 dc4aabf0 00000005 00000007 00000000 00000000 00000001 
62e8 00000000 00000000 dc4a62f0 dc4a62f0 00000000 00000000 dc4a62e4 c093a6c8 
6308 c097ebec dc4a9f80 00000000 00000000 00000001 dc4a60dc dc4a655c 7fffffff 
panic时r5的值是0xdc4a62a8,那么panic时对应的pdev的结构体就是
fc4ba1c0 00000002 c093a570 dc4a4340 dc4ba160 1c4a607c dc4a64fc c093a578 
根据上面的结构体层次关系,所以第一个fc4ba1c0就是pdev->name, 第二个是 pdev->id = 00000002,  第三个是结构体 device
struct device{ struct device *parent; struct device_private *p; struct kobject kobj; ... } struct kobject { const char *name; .... }
第三个是pdev->dev->parent = c093a570, 第四个是pdev->dev->p = dc4a4340, 第五个是 pdev->dev->kobj->name = dc4ba160,  实际上这个name原则上说应该跟第一个是相等的, 注意如果细心的观察下fc4ba1c0与dc4ba160转换为二进制,仅仅差2位,
通常这种情况最大的可能是硬件出现问题,这个bug只重现了一次,根据经验这很大可能是硬件造成的bug,所以最后分析到这里就打住了,但是分析方法和步骤,以及怎么结合内存dump去check相应的bug还是挺有借鉴意思的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个panic bug的分析过程1 的相关文章

  • 自动持有自旋锁时返回是否不安全?

    受人尊敬的书说 The flags参数传递给spin unlock irqrestore必须与传递给的变量相同spin lock irqsave 您还必须致电spin lock irqsave and spin unlock irqrest
  • Linux用户空间线程、内核线程、轻量级进程

    我对所有这些实体以及它们在 Linux 中如何互连感到有点困惑 Unix 内部原理 一书指出lightweight process LWP 是内核支持的用户线程 并且该内核看不到进程内的线程 对于 Linux 来说仍然如此吗 据我了解 用户
  • dmesg 和 /var/log/kern.log 之间的区别

    我正在修改kvm模块 并在内核代码中添加了printk语句 运行虚拟机后 printk为我提供了错误地址和有关客户操作系统的其他信息 我需要根据此信息生成统计信息 当我使用 dmesg 时 我只能看到错误地址 在内核空间中 即它们的地址高于
  • x86 平台中的 KVM 影子页表处理

    据我了解 在没有硬件支持来宾虚拟到主机物理地址转换的处理器上 KVM 使用影子页表 当来宾操作系统修改其页表时 会构建和更新影子页表 硬件中有没有专门的指令 以x86为参考 来修改页表 除非有特殊说明 否则不会对VMM 造成陷阱 Linux
  • 如何在 Linux 内核空间使用 ioctl()?

    可以打电话吗ioctl来自 Linux 内核模块 谁能提供一个如何使用它的例子吗 您可以尝试拨打电话sys ioctl 如果内核是用以下命令编译的 则它会被导出CONFIG COMPAT 或者 如果您有设备驱动程序struct file o
  • 使用Linux虚拟鼠标驱动

    我正在尝试实施一个虚拟鼠标驱动程序根据基本 Linux 设备驱动程序书 有一个用户空间应用程序 它生成坐标以及内核模块 See 虚拟鼠标驱动程序和用户空间应用程序代码 http www embeddedlinux org cn Essent
  • vm.dirty_ratio 和 vm.dirty_background_ratio 之间的区别?

    我目前正在试验中找到的内核参数 proc sys vm 尤其dirty ratio and dirty background ratio 内核文档对两者都有以下解释 脏背景比例 包含 以包含空闲页面的总可用内存的百分比表示 和可回收页 后台
  • 无法访问打开的/arch/x86/syscalls/syscall_32.tbl

    当我在切换到内核后编写此命令时 当我编译它时 它没有显示任何列表 是否有其他命令可以打开列表 open arch x86 syscalls syscall 32 tbl Bug 先删除 文件路径中的字符 应该是relative http e
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • 在网络处理中使用自旋变体

    我编写了一个与网络过滤器挂钩交互的内核模块 网络过滤器挂钩在 Softirq 上下文中运行 我正在访问全局数据结构 哈希表 来自软中断上下文以及进程上下文 进程上下文访问是由于sysctl文件用于修改哈希表的内容 我正在使用 spinloc
  • 使用sk_buff添加以太网帧头

    我有一个捕获传出互联网流量的内核模块 Netfilter hook LOCAL OUT 在此挂钩处 仍然没有以太网标头 我构建了以太网头并且可以使用了 但是如何将其连接到skb这样我就可以将整个 skb 结构发送到dev queue xmi
  • 内核makefile中的$(call cmd,tags)这里的cmd指的是什么?

    在内核 Makefile 中我发现如下代码 ctags CTAGS CSCOPE HEADERS SOURCES ETAGS ETAGSFALGS HEADERS SOURCES call cmd ctags 另外 在哪里可以找到宏或函数
  • 在ubuntu内核中启用cgroup cpu实时运行时

    我正在尝试在 Ubuntu 18 04 上运行的 docker 容器中使用实时调度 我已经按照给定的方法安装了实时内核here https stackoverflow com questions 51669724 install rt li
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • C 标准库函数与系统调用。哪个是“open()”?

    I know fopen 在C标准库中 所以我绝对可以调用fopen C 程序中的函数 我感到困惑的是为什么我可以打电话给open 功能也一样 open 应该是系统调用 所以它不是标准库中的C函数 因为我能够成功地调用open 函数 我调用
  • /proc/kmsg 和 dmsg 有什么区别?

    我们通常这样做cat proc kmsg or dmesg从用户空间查看内核日志 我明白了dmesg是一个循环缓冲区 它从kmsg 但是kmsg也不是循环缓冲区 它们之间有什么区别和联系呢 宽松地说 dmesg 是一个转储 proc kms
  • 未找到 DEADLINE 调度策略

    我想在 C 中实现 DEADLINE 调度策略 我知道该功能已实现Linux 3 14 10我正在使用 Ubuntu 14 04Linux 3 17 0 031700 lowlatency 201410060605 SMP PREEMPT这
  • 在 Linux 内核中使用断言

    我有一个问题assert 在Linux中 我可以在内核中使用它吗 如果不是 例如 如果我不想输入 NULL 指针 您通常会使用什么技术 对应的内核宏是BUG ON and WARN ON 前者适用于当您想让内核恐慌并使系统崩溃 即不可恢复的
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组

随机推荐

  • 【云原生之K8S】Yaml文件详解

    目录 一 K8S支持的文件格式 1 1 yaml和json的主要区别 二 YAML 2 1 查看API资源版本标签 2 2 编写资源配置清单 编写nginx test yaml资源配置清单 创建资源对象 查看创建的pod资源 2 3 创建s
  • C++中的适配器

    C primer中关于适配器的定义 适配器 adaptor 是使一种事物的行为类似于另外一事物的行为的一种机制 这个定义初学时觉得好抽象 为了理解C 中的适配器 不妨先了解物理上的适配器 物理上的适配器就是一个接口转换器 它可以是一个独立的
  • 我如何搞懂Javascript系列之原型和原型链

    理解原型 JavaScript 常被描述为一种基于原型的语言 每个对象拥有一个原型对象 对象以其原型为模板 从原型继承方法和属性 原型对象也可能拥有原型 并从中继承方法和属性 一层一层 以此类推 这种关系常被称为原型链 构造函数创建对象 J
  • JS常用方法

    1 删除数组中指定对象指定元素 let arr name xiaowang id 1 name xiaozhang id 2 createDate xiaoli id 3 删除id为1的对象 其中i为index 1可选择性填写 含义为删除当
  • 传递颜色

    由于颜色在片元着色器中 故不能用attribute 用uniform得到并传递 11
  • python中国古代数学问题——二鼠打洞

    任务描述 九章算术 的 盈不足篇 里有一个很有意思的老鼠打洞问题 原文是这么说的 今有垣厚十尺 两鼠对穿 大鼠日一尺 小鼠亦一尺 大鼠日自倍 小鼠日自半 问 何日相逢 各穿几何
  • 剑指 Offer 10- I. 斐波那契数列(java+python)

    写一个函数 输入 n 求斐波那契 Fibonacci 数列的第 n 项 即 F N 斐波那契数列的定义如下 F 0 0 F 1 1 F N F N 1 F N 2 其中 N gt 1 斐波那契数列由 0 和 1 开始 之后的斐波那契数就是由
  • C/C++语言 从日期格式字符串中提取年月日时分秒

    系列文章目录 文章目录 系列文章目录 前言 一 日期格式字符串 二 strftime函数 1 描述 2 声明 3 形参 4 返回值 三 strptime函数 1 形参 2 示例 3 函数封装 总结 前言 上一篇文章 C C 语言 获取系统时
  • MES管理系统如何帮助制造企业打造透明化工厂

    在制造型企业的运营中 车间现场管理至关重要 然而 面临着信息传递速度慢 跨部门协作困难 生产进度无法及时掌握 制造品质不良 设备故障不能及时处理等困境 企业需要寻求有效的解决方案 MES生产管理系统作为针对制造企业车间生产过程控制和管理的解
  • 如何在使用中文输入法的时候打出英文字符

    解决方法很简单 只需要按CTRL 就可以实现中英文字符切换 这样在按字母的时候还是会显示拼音 但输入字符时都是英文字符了 避免了频繁的shift切换
  • 【Qt学习】07:绘图与绘图设备

    OVERVIEW 绘图与绘图设备 一 QPainter 二 QPainterDevice 1 QPixmap 2 QBitmap 3 QImage 4 QPicture 绘图与绘图设备 一 QPainter Qt 的绘图系统允许使用API在
  • unsigned int用法

    注意使用unsigned int 无符号常数 正如我们所知道的 编程语句都有很多的基本数据类型 如char inf float等等 而在C和C 中还有一个特殊的类型就是无符号数 它由unsigned修饰 如unsigned int等 大家有
  • visible.sync 的作用

    我们在前端开发中经常看到 visible sync这种修饰符 很多人不知道这是干什么的 特别是在使用ElementUI的时候 里面有个弹窗el dialog组件的时候会有用到 visible sync
  • VUE项目中的全局格式化时间过滤器

    1 全局过滤器 https blog csdn net weixin 45054614 article details 105368776 全局时间格式化 对名称进行定义 提供一个function函数 originVal 为形参 Vue f
  • Chapter1 ROS概述与环境搭建

    一 序言 学习一个新的知识模块时 要先了解模块的相关概念 安装官方软件包 搭建其集成的开发环境 这些完成后 继续开始开创新领域的大门 二 ROS简介 2 1 ROS的概念 一个比喻 机器人的控制集成硬件设计 嵌入式软件设计 上层软件设计 l
  • Echart 之 timeline 时间组件 基本用法

    此处是基础版 大神请绕路 官方给的timeline组件太过于复杂 对于不熟悉的朋友 只是看逻辑就浪费很多时间 以下是基础版的示例 div style height 100 div
  • Altium AD20删除机械层MECH

    1 滥用MECH机械层导致的PCB过孔错误 前两天打样PCB时犯了个大毛病 导致送打样回来发现有多处网络对GND短路 更可气的是 这是在手贴了两块样板后才发现的 赔进去一下午时间和一堆元件 亏死 刚开始百思不得其解 因为在AD20中规则检查
  • 2021/9/29 TX POWER 蓝牙发射功率

    1 觉得挺奇葩 如果不是扩展包的话 就是TX power 设定 没法通过hci 下发 就是 在controller 设定好 也没法中途去变化 扩展包 有这个选项 能够改变 可以通过HCI 下发指令来更改 2 AD9361 设置发射功率 要注
  • (转)如何选择合适的射频模块

    要选择合适的射频模块 以下几个问题我们都需要搞搞清楚 无线设备该通多远 该用多大的功率 如何扩大通信距离 天线是否该重视 该选什么样的模块 初学者如何选择仪器 如何确定通信状况等等 无线设备该通多远 谈到这个话题 有必要想一想当年了 比如1
  • 一个panic bug的分析过程1

    一个panic bug的分析过程 一 2012 05 15 14 57 06 分类 LINUX 一个工作中遇到的bug的问题 分析一下流程 顺便把panic这种类似的bug流程做一些分析 环境 linux 3 0 arm 芯片平台 首先看出