当前位置: 首页 > news >正文

crash工具分析dma设备内存踩踏(一)

背景介绍

我们的客户在利用我们提供的SDK参考方案开发相关产品时,在产品方案上进行一些基础老化测试时,极低概率出现kernel随机panic问题,由于场景复杂,无法单独针对特定模块或功能进行拆解来进行实验排查,只能基于已有的log和复现抓kdump进行相关分析和定位。本文记录相关分析过程,以作后续参考和学习!

问题log分析

首次抓到现场的关键log如下所示:

[  153.081557] Unable to handle kernel paging request at virtual address 1800180018000
[  153.089255] Mem abort info:
[  153.092058]   Exception class = DABT (current EL), IL = 32 bits
[  153.097997]   SET = 0, FnV = 0
[  153.101068]   EA = 0, S1PTW = 0
[  153.104208] Data abort info:
[  153.107098]   ISV = 0, ISS = 0x00000004
[  153.110938]   CM = 0, WnR = 0
[  153.113916] [0001800180018000] address between user and kernel address ranges
[  153.121058] Internal error: Oops: 96000004 [#1] PREEMPT SMP
[  153.126630] Modules linked in: bcmdhd hci_uart bluetooth ecdh_generic crypto_engine pvrsrvkm
[  153.135082] CPU: 3 PID: 2723 Comm: MessageThread Tainted: G           O    4.14.61-00009-gc2eae318e529-dirty #14
[  153.151001] task: ffff800178125400 task.stack: ffff00000ad78000
[  153.156928] PC is at test_and_set_bit+0x18/0x38
[  153.161461] LR is at zs_page_migrate+0x104/0x560
[  153.166077] pc : [<ffff000008cf69a8>] lr : [<ffff00000828c814>] pstate: 40400145
[  153.173471] sp : ffff00000ad7b610
[  153.176784] x29: ffff00000ad7b6a0 x28: ffff8000eb502060 
[  153.182096] x27: 00000000000008e0 x26: ffff80005d715000 
[  153.187409] x25: ffff800178125400 x24: ffff8000eb502088 
[  153.192721] x23: ffff7e000175c550 x22: ffff7e0004615680 
[  153.198033] x21: ffff7e000175c540 x20: ffff800158629b00 
[  153.203345] x19: 00000000000008e0 x18: 0000000000000000 
[  153.208657] x17: 0000000000000001 x16: ffff80017ff16b00 
[  153.213969] x15: 0001182270000000 x14: ffff0000091d2018 
[  153.219280] x13: 00000000000000c1 x12: 0000000000000000 
[  153.224592] x11: 0000000000000140 x10: 0000000000000000 
[  153.229904] x9 : 0000000000000005 x8 : 8001800180018001 
[  153.235215] x7 : 8000800080008000 x6 : ffff8000d8228000 
[  153.240527] x5 : 0000000000000000 x4 : 0000000000000001 
[  153.245839] x3 : 0000000000000000 x2 : 0000000000000001 
[  153.251150] x1 : 8001800180018000 x0 : 0000000000000000 
[  153.256465] 
[  153.256465] X6: 0xffff8000d8227f80:
[  153.261428] 7f80  331c2a00 01200207 580e2a00 1120020c 80000000 80008000 80008000 80008000
[  153.269614] 7fa0  80008000 80008000 80008000 80008000 80008000 80008000 80008000 80008000
[  153.277797] 7fc0  80008000 80008000 80008000 80008000 80008000 80008000 80008000 80008000
[  153.285982] 7fe0  80008000 80008000 80008000 80008000 80008000 80008000 80008000 80008000
[  153.294166] 8000  e2c56740 0000e7c5 f804ae40 0000e7c5 0000000f 00000000 00000000 00000000
[  153.302351] 8020  00000000 00000000 00000000 408f4000 00000008 00000000 7375732a 646e6570
[  153.310535] 8040  6c6c6120 73696820 72676f74 00006d61 00000040 00000000 00000008 00000000
[  153.318719] 8060  00000010 00000000 e3e91c00 0000e7c5 e3e91c84 0000e7c5 e3e91d00 0000e7c5
[  153.326906] 
[  153.326906] X16: 0xffff80017ff16a80:
[  153.331956] 6a80  00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[  153.340139] 6aa0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[  153.348323] 6ac0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[  153.356507] 6ae0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[  153.364690] 6b00  0481b7e0 ffff7e00 03801ae0 ffff7e00 0357f8e0 ffff7e00 0357f8e0 ffff7e00
[  153.372875] 6b20  03b9fc60 ffff7e00 037034a0 ffff7e00 7ff16b30 ffff8001 7ff16b30 ffff8001
[  153.381059] 6b40  7ff16b40 ffff8001 7ff16b40 ffff8001 7ff16b50 ffff8001 7ff16b50 ffff8001
[  153.389243] 6b60  0000003c 00000000 03801a20 ffff7e00 03804520 ffff7e00 041091a0 ffff7e00
[  153.397428] 
[  153.397428] X20: 0xffff800158629a80:
[  153.402477] 9a80  000008ab 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[  153.410660] 9aa0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[  153.418843] 9ac0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[  153.425337] saf775x saf775d_ioctl The process is "Binder:3409_2" (pid 3456)
[  153.425340] radio cmd:SAF775D_RADIO_GETLEVEL 
[  153.425928] lllevel = -7 
[  153.440955] 9ae0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[  153.449138] 9b00  054c054a 00000000 58629b08 ffff8001 58629b08 ffff8001 20753e28 ffff8001
[  153.457322] 9b20  234698e8 ffff8000 01499a68 ffff8001 cd9bb408 ffff8000 236ba9a8 ffff8000
[  153.465507] 9b40  4d7b3e58 ffff8000 000006d0 00000007 00000003 0000006b 00000000 00000000
[  153.473691] 9b60  00000003 00000000 00000003 00000000 00000092 00000000 0000042f 00000000
[  153.481877] 
[  153.481877] X24: 0xffff8000eb502008:
[  153.486927] 2008  00000007 00000000 0175c380 ffff7e00 eb502018 ffff8000 eb502018 ffff8000
[  153.495111] 2028  00000000 00000000 001609fb 00000002 ffffffff 00000000 0175c480 ffff7e00
[  153.503296] 2048  eb502048 ffff8000 eb502048 ffff8000 00000000 00000000 001619af 00000007
[  153.511480] 2068  00000007 00000000 0175c4c0 ffff7e00 eb502078 ffff8000 eb502078 ffff8000
[  153.519663] 2088  80000000 00000000 001601fb 00000002 ffffffff 00000000 036089c0 ffff7e00
[  153.527847] 20a8  eb5020d8 ffff8000 31ac4be8 ffff8000 00000000 00000000 001601fb 00000002
[  153.536031] 20c8  ffffffff 00000000 03608300 ffff7e00 f272daf8 ffff8000 eb5020a8 ffff8000
[  153.544215] 20e8  00000000 00000000 001603fb 00000001 ffffffff 00000000 048ce700 ffff7e00
[  153.552399] 
[  153.552399] X25: 0xffff800178125380:
[  153.557449] 5380  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[  153.565632] 53a0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[  153.573816] 53c0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[  153.582000] 53e0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[  153.590183] 5400  0000002a 00000000 ffffffff ffffffff 00000006 00000000 00000000 00000000
[  153.598367] 5420  0ad78000 ffff0000 00000003 00c04040 00000000 00000000 00000000 00000000
[  153.606552] 5440  00000001 00000003 0000001a 00000000 ffff7081 00000000 77402a00 ffff8001
[  153.614735] 5460  00000003 00000001 00000070 00000070 00000070 00000000 08d40d68 ffff0000
[  153.622920] 
[  153.622920] X26: 0xffff80005d714f80:
[  153.627970] 4f80  80018001 80018001 80018001 80018001 80018001 80018001 80018001 80018001
[  153.636154] 4fa0  80018001 80018001 80018001 80018001 80018001 80018001 80018001 80018001
[  153.644338] 4fc0  80018001 80018001 80018001 80018001 80018001 80018001 80018001 80018001
[  153.652523] 4fe0  80018001 80018001 80018001 80018001 80018001 80018001 80018001 80018001
[  153.660707] 5000  80018001 80018001 80018001 80018001 80018001 80018001 80018001 80018001
[  153.668890] 5020  80018001 80018001 80018001 80018001 80018001 80018001 80018001 80018001
[  153.677074] 5040  80018001 80018001 80018001 80018001 80018001 80018001 80018001 80018001
[  153.685259] 5060  80018001 80018001 80018001 80018001 80018001 80018001 80018001 80018001
[  153.693443] 
[  153.693443] X28: 0xffff8000eb501fe0:
[  153.698492] 1fe0  eb5e5018 ffff8000 00000000 00000000 00000000 00000000 00000000 00000000
[  153.706676] 2000  00162243 00000007 00000007 00000000 0175c380 ffff7e00 eb502018 ffff8000
[  153.714860] 2020  eb502018 ffff8000 00000000 00000000 001609fb 00000002 ffffffff 00000000
[  153.723044] 2040  0175c480 ffff7e00 eb502048 ffff8000 eb502048 ffff8000 00000000 00000000
[  153.731228] 2060  001619af 00000007 00000007 00000000 0175c4c0 ffff7e00 eb502078 ffff8000
[  153.739412] 2080  eb502078 ffff8000 80000000 00000000 001601fb 00000002 ffffffff 00000000
[  153.747596] 20a0  036089c0 ffff7e00 eb5020d8 ffff8000 31ac4be8 ffff8000 00000000 00000000
[  153.755780] 20c0  001601fb 00000002 ffffffff 00000000 03608300 ffff7e00 f272daf8 ffff8000
[  153.763965] 
[  153.765455] Process MessageThread (pid: 2723, stack limit = 0xffff00000ad78000)
[  153.772762] Call trace:
[  153.775208] Exception stack(0xffff00000ad7b4d0 to 0xffff00000ad7b610)
[  153.781649] b4c0:                                   0000000000000000 8001800180018000
[  153.789479] b4e0: 0000000000000001 0000000000000000 0000000000000001 0000000000000000
[  153.797309] b500: ffff8000d8228000 8000800080008000 8001800180018001 0000000000000005
[  153.805139] b520: 0000000000000000 0000000000000140 0000000000000000 00000000000000c1
[  153.812969] b540: ffff0000091d2018 0001182270000000 ffff80017ff16b00 0000000000000001
[  153.820798] b560: 0000000000000000 00000000000008e0 ffff800158629b00 ffff7e000175c540
[  153.828629] b580: ffff7e0004615680 ffff7e000175c550 ffff8000eb502088 ffff800178125400
[  153.836459] b5a0: ffff80005d715000 00000000000008e0 ffff8000eb502060 ffff00000ad7b6a0
[  153.844289] b5c0: ffff00000828c814 ffff00000ad7b610 ffff000008cf69a8 0000000040400145
[  153.852118] b5e0: ffff7e000175c300 0000000000000001 0000ffffffffffff ffff00000ad7b6e8
[  153.859947] b600: ffff00000ad7b6a0 ffff000008cf69a8
[  153.864825] [<ffff000008cf69a8>] test_and_set_bit+0x18/0x38
[  153.870399] [<ffff0000082770b4>] move_to_new_page+0x2bc/0x2e0
[  153.876145] [<ffff0000082755ec>] migrate_pages+0x62c/0x928
[  153.881632] [<ffff000008208400>] alloc_contig_range+0x194/0x4ac
[  153.887553] [<ffff00000828e4a4>] cma_alloc+0x144/0x2f4
[  153.892693] [<ffff0000086d5c04>] dma_alloc_from_contiguous+0x2c/0x34
[  153.899048] [<ffff00000809ea08>] __dma_alloc+0x150/0x298
[  153.904362] [<ffff00000893253c>] vb2_dc_alloc+0x104/0x164
[  153.909759] [<ffff00000892c798>] __vb2_queue_alloc+0x184/0x494
[  153.915592] [<ffff00000892bc6c>] vb2_core_reqbufs+0x264/0x42c
[  153.921337] [<ffff000008931294>] vb2_ioctl_reqbufs+0x6c/0x94
[  153.926997] [<ffff0000089174ec>] v4l_reqbufs+0x48/0x58
[  153.932135] [<ffff000008914f1c>] __video_do_ioctl+0x130/0x26c
[  153.937880] [<ffff000008914b00>] video_usercopy+0x2f0/0x5c0
[  153.943453] [<ffff000008914de4>] video_ioctl2+0x14/0x1c
[  153.948678] [<ffff0000089142e4>] v4l2_ioctl+0x9c/0xc4
[  153.953730] [<ffff0000082a913c>] do_vfs_ioctl+0x554/0x810
[  153.959129] [<ffff0000082a9564>] SyS_ioctl+0x88/0x94
[  153.964092] Exception stack(0xffff00000ad7bec0 to 0xffff00000ad7c000)
[  153.970532] bec0: 0000000000000009 00000000c0145608 0000f168e12bcab8 0000000000000003
[  153.978363] bee0: 0000000000000000 0000000000000018 fefff067e02aceff 7f7fff7fff7fff7f
[  153.986193] bf00: 000000000000001d 0000f168e12bc9b8 0000f168e12bc980 0000f168e12bc9b8
[  153.994023] bf20: 0000f168e12bca00 ffffffffffffffff 0000000000000004 ffffffffffffffff
[  154.001853] bf40: 0000f168e1328f18 0000f168e2890308 0000f168df8c8000 0000f168e12bd020
[  154.009682] bf60: 0000f168e2051000 0000000000000000 0000f168e12bca70 0000f168e12bd020
[  154.017512] bf80: 0000f168e12bcd50 0000f168e12bcd50 0000f168e12bd020 0000f168e3585020
[  154.025342] bfa0: 0000f168e1313708 0000f168e12bc9f0 0000f168e2890390 0000f168e12bc900
[  154.033172] bfc0: 0000f168e28d2888 00000000a0000000 0000000000000009 000000000000001d
[  154.041002] bfe0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
[  154.048832] [<ffff000008083ac0>] el0_svc_naked+0x34/0x38
[  154.054144] Code: d2800022 8b400c21 f9800031 9ac32044 (c85f7c22) 
[  154.060244] SMP: stopping secondary CPUs
[  154.064172] ---[ end trace d3ae0601ebdf78fc ]---
[  154.071764] Kernel panic - not syncing: Fatal exception
[  154.076996] SMP: stopping secondary CPUs
[  155.080920] SMP: failed to stop secondary CPUs 0-3

结合现场和对应kernel版本的vmlinux分析,可以推算出在test_and_set_bit()函数里出现了访问非法地址的行为,触发了data abort异常,对应汇编信息如下:

ffff000008cf6990 <test_and_set_bit>:
ffff000008cf6990:        12001403         and        w3, w0, #0x3f  //x3 = x0 & 0x3f          
ffff000008cf6994:        4a030000         eor        w0, w0, w3    //x0 = x0^x3
ffff000008cf6998:        d2800022         mov        x2, #0x1      // #1
ffff000008cf699c:        8b400c21         add        x1, x1, x0, lsr #3    //x1 = x1 + (x0 >> 3)
ffff000008cf69a0:        f9800031         prfm        pstl1strm, [x1]
ffff000008cf69a4:        9ac32044         lsl        x4, x2, x3
ffff000008cf69a8:        c85f7c22         ldxr        x2, [x1]  //panic, x1=0x8001800180018000, x0=0
ffff000008cf69ac:        9ac32440         lsr        x0, x2, x3
ffff000008cf69b0:        aa040042         orr        x2, x2, x4
ffff000008cf69b4:        c805fc22         stlxr        w5, x2, [x1]
ffff000008cf69b8:        35ffff85         cbnz        w5, ffff000008cf69a8 <test_and_set_bit+0x18>
ffff000008cf69bc:        d5033bbf         dmb        ish
ffff000008cf69c0:        92400000         and        x0, x0, #0x1
ffff000008cf69c4:        d65f03c0         ret

函数的调用路径及实现如下:

zs_page_migrate(struct address_space *mapping, struct page *newpage, struct page *page, enum migrate_mode mode)trypin_tag(unsigned long handle)bit_spin_trylock(int bitnum, unsigned long *addr)
static inline int trypin_tag(unsigned long handle)
{return bit_spin_trylock(HANDLE_PIN_BIT, (unsigned long *)handle);
}
...
static int zs_page_migrate(struct address_space *mapping, struct page *newpage,struct page *page, enum migrate_mode mode)
{struct zs_pool *pool;struct size_class *class;int class_idx;enum fullness_group fullness;struct zspage *zspage;struct page *dummy;void *s_addr, *d_addr, *addr;int offset, pos;unsigned long handle, head;unsigned long old_obj, new_obj;unsigned int obj_idx;int ret = -EAGAIN;/** We cannot support the _NO_COPY case here, because copy needs to* happen under the zs lock, which does not work with* MIGRATE_SYNC_NO_COPY workflow.*/if (mode == MIGRATE_SYNC_NO_COPY)return -EINVAL;VM_BUG_ON_PAGE(!PageMovable(page), page);VM_BUG_ON_PAGE(!PageIsolated(page), page);zspage = get_zspage(page);/* Concurrent compactor cannot migrate any subpage in zspage */migrate_write_lock(zspage);get_zspage_mapping(zspage, &class_idx, &fullness);pool = mapping->private_data;class = pool->size_class[class_idx];offset = get_first_obj_offset(page);spin_lock(&class->lock);if (!get_zspage_inuse(zspage)) {/** Set "offset" to end of the page so that every loops* skips unnecessary object scanning.*/offset = PAGE_SIZE;}pos = offset;s_addr = kmap_atomic(page);while (pos < PAGE_SIZE) {head = obj_to_head(page, s_addr + pos);if (head & OBJ_ALLOCATED_TAG) {handle = head & ~OBJ_ALLOCATED_TAG;if (!trypin_tag(handle))goto unpin_objects;}pos += class->size;}/** Here, any user cannot access all objects in the zspage so let's move.*/d_addr = kmap_atomic(newpage);memcpy(d_addr, s_addr, PAGE_SIZE);kunmap_atomic(d_addr);for (addr = s_addr + offset; addr < s_addr + pos;addr += class->size) {head = obj_to_head(page, addr);if (head & OBJ_ALLOCATED_TAG) {handle = head & ~OBJ_ALLOCATED_TAG;if (!testpin_tag(handle))BUG();old_obj = handle_to_obj(handle);obj_to_location(old_obj, &dummy, &obj_idx);new_obj = (unsigned long)location_to_obj(newpage,obj_idx);new_obj |= BIT(HANDLE_PIN_BIT);record_obj(handle, new_obj);}}replace_sub_page(class, zspage, newpage, page);get_page(newpage);dec_zspage_isolation(zspage);/** Page migration is done so let's putback isolated zspage to* the list if @page is final isolated subpage in the zspage.*/if (!is_zspage_isolated(zspage)) {/** We cannot race with zs_destroy_pool() here because we wait* for isolation to hit zero before we start destroying.* Also, we ensure that everyone can see pool->destroying before* we start waiting.*/putback_zspage_deferred(pool, class, zspage);zs_pool_dec_isolated(pool);}if (page_zone(newpage) != page_zone(page)) {dec_zone_page_state(page, NR_ZSPAGES);inc_zone_page_state(newpage, NR_ZSPAGES);}reset_page(page);put_page(page);page = newpage;ret = MIGRATEPAGE_SUCCESS;
unpin_objects:for (addr = s_addr + offset; addr < s_addr + pos;addr += class->size) {head = obj_to_head(page, addr);if (head & OBJ_ALLOCATED_TAG) {handle = head & ~OBJ_ALLOCATED_TAG;if (!testpin_tag(handle))BUG();unpin_tag(handle);}}kunmap_atomic(s_addr);spin_unlock(&class->lock);migrate_write_unlock(zspage);return ret;
}

结合源码分析,可以确认是handler这个变量出现问题了,从现场寄存器信息来看,x1=8001800180018000,与panic时log提示的现场一致

分析上下文,因为在zs_page_migrate()函数中直接调用了test_and_set_bit(),所以通过zs_page_migrate()的汇编代码看看是否可以获取handler的值,从汇编信息看,zs_page_migrate()中调用了test_and_set_bit()的汇编如下所示:

...
ffff00000828c7e0:        910042b7         add        x23, x21, #0x10
ffff00000828c7e4:        f94002a8         ldr        x8, [x21]
ffff00000828c7e8:        8b1b0349         add        x9, x26, x27
ffff00000828c7ec:        f277011f         tst        x8, #0x200
ffff00000828c7f0:        9a970128         csel        x8, x9, x23, eq  // eq = none
ffff00000828c7f4:        f9400108         ldr        x8, [x8]
ffff00000828c7f8:        36000108         tbz        w8, #0, ffff00000828c818 <zs_page_migrate+0x108>
ffff00000828c7fc:        b9401329         ldr        w9, [x25, #16]
ffff00000828c800:        927ff901         and        x1, x8, #0xfffffffffffffffe
ffff00000828c804:        2a1f03e0         mov        w0, wzr
ffff00000828c808:        11000529         add        w9, w9, #0x1
ffff00000828c80c:        b9001329         str        w9, [x25, #16]
ffff00000828c810:        9429a860         bl        ffff000008cf6990 <test_and_set_bit>
ffff00000828c814:        350009c0         cbnz        w0, ffff00000828c94c <zs_page_migrate+0x23c>
ffff00000828c818:        b9404a88         ldr        w8, [x20, #72]
ffff00000828c81c:        0b130113         add        w19, w8, w19
ffff00000828c820:        7140067f         cmp        w19, #0x1, lsl #12
ffff00000828c824:        93407e7b         sxtw        x27, w19
ffff00000828c828:        54fffde3         b.cc        ffff00000828c7e4 <zs_page_migrate+0xd4>
...

因为test_and_set_bit()只有两个参数,x0和x1,从汇编分析,x0是0,x1 = x8 & 0xfffffffffffffffe, x8 = 0x8001800180018001, 所以x1 = 0x8001800180018000,因此,出现问题时,在zs_page_migrate()取到的x8的值就有问题,且x8表示head这个变量,0xfffffffffffffffe刚好是OBJ_ALLOCATED_TAG这个宏的取反,所有说明获取到的head变量已经出现不正确了,继续分析这个head变量的获取,源码如下:

static unsigned long obj_to_head(struct page *page, void *obj)
{if (unlikely(PageHugeObject(page))) {VM_BUG_ON_PAGE(!is_first_page(page), page);return page->index;} elsereturn *(unsigned long *)obj;
}

结合源码,在zs_page_migrate()函数中,通过obj_to_head()函数返回到对应的head,结合汇编分析,可以看出x23表示page->index,x9是obj,obj参数是在zs_page_migrate()计算出来的,该函数返回page->index或者返回obj这个指针指向的内存数据。

结合源码,可以推算出,x26表示s_addr这个变量,x26=0xffff80005d715000, x27表示pos这个变量,x27=0x00000000000008e0,因此obj这个指针的值是0xffff80005d7158e0,page这个指针的值是page = 0xffff7e000175c540,而handler就是从这两块内存地址获取到的。

从panic现场打印的数据信息看,head的值大概率应该是从x26这块内存获取到的,就是返回了obj这个指针指向的内存数据,因为现场没有打印出page这个指针指向的内存数据,只能从数据上进行猜测,但从x26这块内存数据看,这一块内存的数据都被填充成0x80018001,大概率是dma设备发生了内存踩踏导致,需要分析数据规律来进一步定位。

[  153.622920] X26: 0xffff80005d714f80:
[  153.627970] 4f80  80018001 80018001 80018001 80018001 80018001 80018001 80018001 80018001
[  153.636154] 4fa0  80018001 80018001 80018001 80018001 80018001 80018001 80018001 80018001
[  153.644338] 4fc0  80018001 80018001 80018001 80018001 80018001 80018001 80018001 80018001
[  153.652523] 4fe0  80018001 80018001 80018001 80018001 80018001 80018001 80018001 80018001
[  153.660707] 5000  80018001 80018001 80018001 80018001 80018001 80018001 80018001 80018001
[  153.668890] 5020  80018001 80018001 80018001 80018001 80018001 80018001 80018001 80018001
[  153.677074] 5040  80018001 80018001 80018001 80018001 80018001 80018001 80018001 80018001
[  153.685259] 5060  80018001 80018001 80018001 80018001 80018001 80018001 80018001 80018001

相关文章:

crash工具分析dma设备内存踩踏(一)

背景介绍 我们的客户在利用我们提供的SDK参考方案开发相关产品时&#xff0c;在产品方案上进行一些基础老化测试时&#xff0c;极低概率出现kernel随机panic问题&#xff0c;由于场景复杂&#xff0c;无法单独针对特定模块或功能进行拆解来进行实验排查&#xff0c;只能基于已…...

C#上位机——根据命令发送

C#上位机——根据命令发送 第一步&#xff1a;设置窗口的布局 第二步&#xff1a;设置各个属性 第三步&#xff1a;编写各个模块之间的关系...

BEVFormer代码跑通

1 环境配置 1.1 环境安装 # 1 拉取源码 github加速代理https://ghproxy.com/ git clone https://github.com/fundamentalvision/BEVFormer.git# 2 创建虚拟环境 conda create -n bev python3.8 -y# 3 激活虚拟环境 conda activate bev# 4.1 安装torch,torchvision,torchaud…...

kafka安装

kafka安装 1 kafka概念 1.1 kafka介绍 kafka是最初有Linkedin公司开发的&#xff0c;是一个分布式&#xff0c;分区&#xff0c;多副本&#xff0c;多生产者&#xff0c;多订阅者&#xff0c;基于zookeeper协调的分布式日志系统。具有高吞吐量&#xff0c;可扩展性和可容错性…...

Mac上安装Java的JDK多版本管理软件jEnv

JDK的多版本管理软件主要有以下三种&#xff1a; jEnv jEnv 是一个命令行工具&#xff0c;可以帮助您管理和切换不同版本的 Java 环境。它可以让您在不同的项目之间轻松切换 Java 版本。您可以使用 jenv global 命令设置全局 Java 版本&#xff0c;也可以使用 jenv local 命令…...

linux常见命令以及jdk,tomcat环境搭建

目录 Is pwd cd touch cat echo vim 复制粘贴 mkdir rm cp jdk部署 1. yum list | grep jdk进行查找​编辑 2.安装​编辑 3.再次确认 4.判断是否安装成功 tomcat安装 1.下载压缩包&#xff0c;把压缩包上传至linux(可能需要yum install lrzsz) 2.解压缩unzip 压缩包名&…...

将表情存入数据库

概念&#xff1a; 表情是一种比较特殊的字符串&#xff0c;为unicode编码&#xff0c;unicode编码要存入数据库一般情况下&#xff0c;是存不了的&#xff0c;有两种解决方式&#xff0c;一种将数据表编码方式改为unicode编码方式&#xff0c;但是这种情况适用于功能刚开始设计…...

H桥级联型五电平三相逆变器Simulink仿真模型

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

后端解决跨域(极速版)

header(Access-Control-Allow-Origin: *); header(Access-Control-Allow-Methods:*); 代表接收全部的请求&#xff0c;"POST,GET"//允许访问的方式 指定域&#xff0c;如http://172.20.0.206//宝塔的域名&#xff0c;注意不是&#xff1a;http://wang.jingyi.icu等…...

数据结构与算法-前缀树

数据结构与算法-前缀树详解 1 何为前缀树 2 前缀树的代码表示及相关操作 1 何为前缀树 前缀树 又称之为字典树,是一种多路查找树,多路树形结构,是哈希树的变种&#xff0c;和hash效率有一拼&#xff0c;是一种用于快速检索的多叉树结构。 性质&#xff1a;不同字符串的相同…...

DirectX12_Windows_GameDevelop_3:Direct3D的初始化

引言 查看龙书时发现&#xff0c;第四章介绍预备知识的代码不太利于学习。因为它不像是LearnOpenGL那样从头开始一步一步教你敲代码&#xff0c;导致你没有一种整体感。如果你把它当作某一块的代码进行学习&#xff0c;你跟着敲会发现&#xff0c;总有几个变量是没有定义的。这…...

基于粒子群优化算法、鲸鱼算法、改进的淘沙骆驼模型算法(PSO/SSA/tGSSA)的微电网优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

数据分析篇-数据认知分析

一简介 数据认知分析&#xff0c;实际是对数据的整体结构和分布特征进行分析&#xff0c;是对整个数据外在的认识&#xff0c;也是数据分析的第一步。对于数据认知的分析&#xff0c;一般会考虑分散性、位置特性、变量的相关性等&#xff0c;一般会考虑平均数、方差、极差、峰…...

【力扣-每日一题】714. 买卖股票的最佳时机含手续费

class Solution { public:int maxProfit(vector<int>& prices, int fee) {//[i][0]-不持有 [i][1]-持有int mprices.size();vector<vector<int>> dp(m,vector<int>(2));dp[0][0]0; //初始状态dp[0][1]-prices[0];for(int i1;i<m;i){dp[i]…...

【代码实践】HAT代码Window平台下运行实践记录

HAT是CVPR2023上的自然图像超分辨率重建论文《activating More Pixels in Image Super-Resolution Transformer》所提出的模型。本文旨在记录在Window系统下运行该官方代码&#xff08;https://github.com/XPixelGroup/HAT&#xff09;的过程&#xff0c;中间会遇到一些问题&am…...

机器学习-Pytorch基础

Numpy和Pytorch可以相互转换&#xff0c;前者CPU上&#xff0c;后者GPU上&#xff0c;都是对矩阵进行运算&#xff0c;Pytorch的基本单位是张量。torch 可以初始化全为0、全为1、符合正态分布的矩阵确定性初始化 torch.tensor()torch.arrange()torch.linspace()torch.logspace…...

金九银十,刷完这个笔记,17K不能再少了....

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;得准备面试了&#xff0c;又不知道从何下手&#xff01;为了帮大家节约时间&#xff0c;特意准备了一份面试相关的资料&#xff0c;内容非常的全面&#xff0c;真的可以好好补一补&#xff0c;希望大家在都能拿到理想…...

精确到区县级街道乡镇行政边界geojson格式矢量数据的获取拼接实现Echarts数据可视化大屏地理坐标信息地图的解决方案

在Echarts制作地理信息坐标地图时&#xff0c;最麻烦的就是街道乡镇级别的行政geojson的获取&#xff0c; 文件大小 788M 文件格式 .json格式&#xff0c;由于是大文件数据&#xff0c;无法直接使用记事本或者IDE编辑器打开&#xff0c;推荐Dadroit Viewer&#xff08;国外…...

【Python 千题 —— 基础篇】多行输出

题目描述 下面是一道关于输入输出的基础题。⭐⭐⭐ 题目描述 编写一个Python程序&#xff0c;将字符串 Hello World! 存储在变量 str1 中&#xff0c;将字符串 Hello Python! 存储在变量 str2 中&#xff0c;然后使用 print 语句分别将它们在不同行打印出来。 输入描述 无…...

AdaBoost(上):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…...

Py之pygraphviz:pygraphviz的简介、安装、使用方法之详细攻略

Py之pygraphviz&#xff1a;pygraphviz的简介、安装、使用方法之详细攻略 目录 pygraphviz的简介 pygraphviz的安装 Graphviz&#xff1a;可视化工具Graphviz的简介、安装、使用方法、经典案例之详细攻略 pygraphviz的使用方法 1、基础用法 2、进阶案例 Algorithm&#…...

acwing算法基础之基础算法--前缀和算法

目录 1 知识点2 模板 1 知识点 前缀后下标尽量从1开始&#xff0c;当然不从1开始也是ok的。 a 1 , a 2 , a 3 , . . . , a n a_1,a_2,a_3,...,a_n a1​,a2​,a3​,...,an​ S 1 , S 2 , S 3 , . . . S n S_1,S_2,S_3,...S_n S1​,S2​,S3​,...Sn​ S i S_i Si​&#xff1…...

华为云云耀云服务器L实例评测|Ubuntu 22.04部署edusoho-ct企培版教程 | 支持华为云视频点播对接CDN加速

华为云云耀云服务器L实例评测&#xff5c;Ubuntu 22.04部署edusoho企培版教程 1、选择购买 华为云耀云服务器L实例 简单上云第一步 2、选择你要安装的操作系统&#xff0c;例如 Ubuntu 22.04 server 64bit 3、然后支付订单就行了 4、华为云云耀云服务器L实例创建好之后&#x…...

土木硕设计院在职转码上岸

一、个人介绍 双非土木硕&#xff0c;98年&#xff0c;目前在北京&#xff0c;职位为前端开发工程师&#xff0c;设计院在职期间自学转码上岸&#x1f33f; 二、背景 本人于19年开始土木研究生生涯&#xff0c;研二期间去地产实习近半年(碧桂园和世茂&#xff0c;这两家的地产…...

js查询月份开始和结束日期

js查询月份开始和结束日期 月份开始和结束 月份开始和结束 整体不是很复杂&#xff0c;使用new Date()方法自带获取最后一天的时间 new Date(a,b,c),传递参数 参数a&#xff1a;是要获取的年份 参数b&#xff1a;是要获取的月份 参数c&#xff1a;是要获取的日期 传递日期为…...

mybatis开发部分核心代码

pom.xml<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 ht…...

Springboot中查看gradle工程使用了哪些仓库

在springboot项目开发中&#xff0c;由于初始化配置文件(init.gradle)可能存在多个目录中(不只一份)&#xff0c;可能导致多次重复引入仓库。也有可能配置文件放置位置错误&#xff0c;导致gradle编译时找不到相应的仓库。如果能在编译时查看gradle到底引用了哪些库&#xff0c…...

c#中的接口

使用IEnumerable统一迭代变量类型 class Program {static void Main(string[] args){int[] nums1 new int[] { 1, 2, 3, 4, 5 };ArrayList nums2 new ArrayList { 1, 2, 3, 4, 5 };Console.WriteLine(Sum(nums1));Console.WriteLine(Sum(nums2));Console.WriteLine(Avg(nums…...

老卫带你学---leetcode刷题(76. 最小覆盖子串)

76. 最小覆盖子串 问题&#xff1a; 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 “” 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必…...

Maven-DskipTests和-Dmaven.test.skip=true的区别

DskipTeststrue和-Dmaven.test.skiptrue的区别 1、 -DskipTeststrue 不执行测试用例&#xff0c;但编译测试用例类生成相应的class文件至target/test-classes下&#xff0c;如&#xff1a; mvn clean package -DskipTeststrue2、 -Dmaven.test.skiptrue 完全忽略测试代码的…...

天长做网站的/2345网址导航删除办法

「2019 Python开发者日」全日程揭晓&#xff0c;请扫码咨询 ↑↑↑作者 | 伊凡伊德里斯&#xff08;Ivan Idris&#xff09;&#xff0c;曾是Java和数据库应用开发者&#xff0c;后专注于Python和数据分析领域&#xff0c;致力于编写干净、可测试的代码。他还是《Python Machin…...

重庆市建设工程交易中心/搜索引擎优化培训免费咨询

2019独角兽企业重金招聘Python工程师标准>>> Zookeeper Watch机制 博客分类&#xff1a; zookeeper Znode发生变化&#xff08;Znode本身的增加&#xff0c;删除&#xff0c;修改&#xff0c;以及子Znode的变化&#xff09;可以通过Watch机制通知到客户端。那么要实…...

有没有做任务赚钱的网站/最新新闻热点素材

...

怎么使网站降权/免费顶级域名申请网站

使用管道命令执行带密码执行sudo命令&#xff0c;在java中老是不成功今天找到方法解决了顺便整理了一下java Runtime.getRuntime().exec 调用脚本命令的注意事项。 使用管道命令执行带密码执行sudo命令 String cmds“echo password | sudo -S /usr/bin/pdf2htmlEX -h ”&…...

南昌网站定制服务/网站注册要多少钱

09-整合第三方技术-注解整合mybatis分析 10-整合第三方技术-注解整合mybatis 前替换后&#xff0c; 前替换后 测试 11-整合第三方技术-注解整合Junit 已看完&#xff1a;&#xff1a;&#xff1a;&#xff1a;&#xff1a;...

163企业邮箱格式/常州seo建站

本文讲的是从五大要素切入应用 告别SOA幻灭的谷底期&#xff0c;【IT168 资讯】严峻的经济形势&#xff0c;缺乏有说服性的案例使得SOA开始面临质疑&#xff0c;有分析师断言SOA已死&#xff0c;并批评SOA项目浪费了企业大量的投资。  这真的是SOA将死的预言&#xff0c;还是…...