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

vmcore分析锁问题实例(x86-64)

问题描述:系统出现panic,dmesg有如下打印:

[122061.197311] task:irq/181-ice-enp state:D stack:0     pid:3134  ppid:2      flags:0x00004000
[122061.197315] Call Trace:
[122061.197317]  <TASK>
[122061.197318]  __schedule+0x34e/0xb00
[122061.197325]  schedule_rtlock+0x1f/0x40
[122061.197328]  rtlock_slowlock_locked+0x232/0xd40
[122061.197332]  rt_read_lock+0x54/0x130
[122061.197333]  ep_poll_callback+0x35/0x2a0
[122061.197337]  ? ktime_get+0x39/0xa0
[122061.197340]  __wake_up_common+0x7d/0x190
[122061.197343]  __wake_up_common_lock+0x7c/0xc0
[122061.197345]  sock_def_readable+0x42/0xc0
[122061.197349]  tcp_child_process+0x199/0x1f0
[122061.197354]  tcp_v4_rcv+0xaf5/0xe80
[122061.197356]  ? raw_local_deliver+0xc7/0x230
[122061.197359]  ip_protocol_deliver_rcu+0x32/0x160
[122061.197361]  ip_local_deliver_finish+0x77/0xa0
[122061.197363]  ip_sublist_rcv_finish+0x80/0x90
[122061.197364]  ip_sublist_rcv+0x1a4/0x240
[122061.197365]  ? __pfx_ip_rcv_finish+0x10/0x10
[122061.197367]  ip_list_rcv+0x136/0x160
[122061.197368]  __netif_receive_skb_list_core+0x2b1/0x2e0
[122061.197371]  netif_receive_skb_list_internal+0x1d5/0x310
[122061.197373]  napi_complete_done+0x73/0x1b0
[122061.197377]  ice_napi_poll+0xa1f/0xd80 [ice]
[122061.197444]  __napi_poll+0x29/0x1b0
[122061.197446]  net_rx_action+0x29f/0x370
[122061.197447]  ? plist_del+0x63/0xc0
[122061.197450]  handle_softirqs.constprop.0+0xb0/0x250
[122061.197453]  ? __pfx_irq_forced_thread_fn+0x10/0x10
[122061.197456]  __local_bh_enable_ip+0x6f/0xa0
[122061.197457]  irq_forced_thread_fn+0x77/0x90
[122061.197460]  irq_thread+0xed/0x1a0
[122061.197463]  ? __pfx_irq_thread_dtor+0x10/0x10
[122061.197466]  ? __pfx_irq_thread+0x10/0x10
[122061.197468]  kthread+0xdd/0x110
[122061.197470]  ? __pfx_kthread+0x10/0x10 
[122061.197471]  ret_from_fork+0x31/0x50
[122061.197474]  ? __pfx_kthread+0x10/0x10 
[122061.197476]  ret_from_fork_asm+0x1b/0x30
[122061.197479]  </TASK>

进程3134在尝试获取lock,而且处于state:D,中断无法执行,导致系统出现异常。
内核代码在rtlock_slowlock_locked中尝试获取lock,代码如下:

1802 /**                 
1803  * rtlock_slowlock_locked - Slow path lock acquisition for RT locks
1804  * @lock:   The underlying RT mutex
1805  */                 
1806 static void __sched rtlock_slowlock_locked(struct rt_mutex_base *lock)
1807 {                                                                                                                                                                                                                                    
1808     struct rt_mutex_waiter waiter;
1809     struct task_struct *owner;
1810    
1811     lockdep_assert_held(&lock->wait_lock);
1812    
1813     if (try_to_take_rt_mutex(lock, current, NULL))
1814         return;     
1815    
1816     rt_mutex_init_rtlock_waiter(&waiter);
1817    
1818     /* Save current state and set state to TASK_RTLOCK_WAIT */
1819     current_save_and_set_rtlock_wait_state();
1820    
1821     trace_contention_begin(lock, LCB_F_RT);
1822    
1823     task_blocks_on_rt_mutex(lock, &waiter, current, NULL, RT_MUTEX_MIN_CHAINWALK);
1824    
1825     for (;;) {      
1826         /* Try to acquire the lock again */
1827         if (try_to_take_rt_mutex(lock, current, &waiter))
1828             break;
1829    
1830         if (&waiter == rt_mutex_top_waiter(lock))
1831             owner = rt_mutex_owner(lock);
1832         else        
1833             owner = NULL;
1834         raw_spin_unlock_irq(&lock->wait_lock);
1835    
1836         if (!owner || !rtmutex_spin_on_owner(lock, &waiter, owner))
1837             schedule_rtlock();
1838    
1839         raw_spin_lock_irq(&lock->wait_lock);
1840         set_current_state(TASK_RTLOCK_WAIT);
1841     }               
1842    
1843     /* Restore the task state */
1844     current_restore_rtlock_saved_state();
1845    
1846     /*              
1847      * try_to_take_rt_mutex() sets the waiter bit unconditionally.
1848      * We might have to fix that up:
1849      */             
1850     fixup_rt_mutex_waiters(lock, true);
1851     debug_rt_mutex_free_waiter(&waiter);
1852  
1853     trace_contention_end(lock, 0);
1854 }

lock结构体如下:

struct rt_mutex_base {raw_spinlock_t      wait_lock;struct rb_root_cached   waiters;struct task_struct  *owner;
};

解决思路:只要找到lock,就可以通过lock找到owner
使用crash打开vmcore分析:

crash> bt -f 3134
PID: 3134     TASK: ff27411db0af97c0  CPU: 0    COMMAND: "irq/181-ice-enp"#0 [ff468632c619f748] __schedule at ffffffff99f3c3ceff468632c619f750: 0000100000000000 ff27415b3e5f23c0 ff468632c619f760: ffffffff00000004 ffffffff9a2100a0 ff468632c619f770: 0000000000000000 0000000000000002 ff468632c619f780: da58a4eb0f1c7100 ff27411db0af97c0 ff468632c619f790: ff27411db0af97c0 ff27411f3bd0df00 ff468632c619f7a0: ff27411db0afa098 ff27411db0af97c0 ff468632c619f7b0: ff27411f89f8da98 ffffffff99f3d04f #1 [ff468632c619f7b8] schedule_rtlock at ffffffff99f3d04fff468632c619f7c0: ff468632c619f800 ffffffff99f43042 #2 [ff468632c619f7c8] rtlock_slowlock_locked at ffffffff99f43042ff468632c619f7d0: 0000000000000000 ff27411f3bd0e7d8 ff468632c619f7e0: ff27411f3bd0e7d8 0000000000000000 ff468632c619f7f0: ff27411db0af9ba8 0000000000000000 ff468632c619f800: ff468632cc40f3f0 0000000000000000 ff468632c619f810: 0000000000000000 ffffffff0000001d ff468632c619f820: 0000000000000000 0000000000000001 ff468632c619f830: 0000000000000000 0000000000000000 ff468632c619f840: ff27411d0000001d 0000000000000000 ff468632c619f850: ff27411db0af97c0 ff27411f89f8da98 ff468632c619f860: 27183d1600001000 0000000000000000 ff468632c619f870: da58a4eb0f1c7100 00000000000000c3 ff468632c619f880: ff27411f89f8da90 ff27411f89f8da98 ff468632c619f890: ff27411fbcd3d8d0 ff27411f89f8da90 ff468632c619f8a0: 00000000000000c3 ffffffff99f43c74 
…………

需要找到lock的寄存器,进而找到在何时被压栈到何处
rt_mutex_base中wait_lock是第一个成员,也就是说函数当中许多对 lock->wait_lock 的调用可以直接用lock的值,对函数rtlock_slowlock_locked进行反汇编:

crash> dis -lr ffffffff99f43042
kernel/locking/rtmutex.c: 1807
0xffffffff99f42e10 <rtlock_slowlock_locked>:	nopl   0x0(%rax,%rax,1) [FTRACE NOP]
0xffffffff99f42e15 <rtlock_slowlock_locked+5>:	push   %r15
kernel/locking/rtmutex.c: 1813
0xffffffff99f42e17 <rtlock_slowlock_locked+7>:	xor    %edx,%edx
kernel/locking/rtmutex.c: 1807
0xffffffff99f42e19 <rtlock_slowlock_locked+9>:	push   %r14
0xffffffff99f42e1b <rtlock_slowlock_locked+11>:	push   %r13
0xffffffff99f42e1d <rtlock_slowlock_locked+13>:	push   %r12
0xffffffff99f42e1f <rtlock_slowlock_locked+15>:	push   %rbp
0xffffffff99f42e20 <rtlock_slowlock_locked+16>:	mov    %rdi,%rbp
0xffffffff99f42e23 <rtlock_slowlock_locked+19>:	push   %rbx
arch/x86/include/asm/current.h: 41
0xffffffff99f42e24 <rtlock_slowlock_locked+20>:	mov    %gs:0x31b40,%r12
kernel/locking/rtmutex.c: 1813
0xffffffff99f42e2d <rtlock_slowlock_locked+29>:	mov    %r12,%rsi
kernel/locking/rtmutex.c: 1807
0xffffffff99f42e30 <rtlock_slowlock_locked+32>:	sub    $0xa8,%rsp
0xffffffff99f42e37 <rtlock_slowlock_locked+39>:	mov    %gs:0x28,%rax
0xffffffff99f42e40 <rtlock_slowlock_locked+48>:	mov    %rax,0xa0(%rsp)
0xffffffff99f42e48 <rtlock_slowlock_locked+56>:	xor    %eax,%eax
arch/x86/include/asm/current.h: 41
0xffffffff99f42e4a <rtlock_slowlock_locked+58>:	call   0xffffffff99f42430 <try_to_take_rt_mutex>
kernel/locking/rtmutex.c: 1813
0xffffffff99f42e4f <rtlock_slowlock_locked+63>:	mov    %eax,0x4(%rsp)
0xffffffff99f42e53 <rtlock_slowlock_locked+67>:	test   %eax,%eax
0xffffffff99f42e55 <rtlock_slowlock_locked+69>:	je     0xffffffff99f42e84 <rtlock_slowlock_locked+116>
kernel/locking/rtmutex.c: 1854
0xffffffff99f42e57 <rtlock_slowlock_locked+71>:	mov    0xa0(%rsp),%rax
0xffffffff99f42e5f <rtlock_slowlock_locked+79>:	sub    %gs:0x28,%rax
0xffffffff99f42e68 <rtlock_slowlock_locked+88>:	jne    0xffffffff99f43b44 <rtlock_slowlock_locked+3380>
0xffffffff99f42e6e <rtlock_slowlock_locked+94>:	add    $0xa8,%rsp
0xffffffff99f42e75 <rtlock_slowlock_locked+101>:	pop    %rbx
0xffffffff99f42e76 <rtlock_slowlock_locked+102>:	pop    %rbp
0xffffffff99f42e77 <rtlock_slowlock_locked+103>:	pop    %r12
0xffffffff99f42e79 <rtlock_slowlock_locked+105>:	pop    %r13
0xffffffff99f42e7b <rtlock_slowlock_locked+107>:	pop    %r14
0xffffffff99f42e7d <rtlock_slowlock_locked+109>:	pop    %r15
0xffffffff99f42e7f <rtlock_slowlock_locked+111>:	ret    
0xffffffff99f42e80 <rtlock_slowlock_locked+112>:	int3   
0xffffffff99f42e81 <rtlock_slowlock_locked+113>:	int3   
0xffffffff99f42e82 <rtlock_slowlock_locked+114>:	int3   
0xffffffff99f42e83 <rtlock_slowlock_locked+115>:	int3   
kernel/locking/rtmutex_common.h: 214
0xffffffff99f42e84 <rtlock_slowlock_locked+116>:	lea    0x8d8(%r12),%r13
0xffffffff99f42e8c <rtlock_slowlock_locked+124>:	lea    0x30(%rsp),%rbx
kernel/locking/rtmutex_common.h: 217
0xffffffff99f42e91 <rtlock_slowlock_locked+129>:	movq   $0x0,0x80(%rsp)
kernel/locking/rtmutex_common.h: 214
0xffffffff99f42e9d <rtlock_slowlock_locked+141>:	lea    0x58(%rsp),%rax
kernel/locking/rtmutex.c: 1819
0xffffffff99f42ea2 <rtlock_slowlock_locked+146>:	mov    %r13,%rdi
kernel/locking/rtmutex_common.h: 215
0xffffffff99f42ea5 <rtlock_slowlock_locked+149>:	mov    %rbx,0x30(%rsp)
kernel/locking/rtmutex_common.h: 214
0xffffffff99f42eaa <rtlock_slowlock_locked+154>:	mov    %rax,0x58(%rsp)
kernel/locking/rtmutex_common.h: 223
0xffffffff99f42eaf <rtlock_slowlock_locked+159>:	movl   $0x1000,0x90(%rsp)
arch/x86/include/asm/current.h: 41
0xffffffff99f42eba <rtlock_slowlock_locked+170>:	call   0xffffffff99f45c60 <_raw_spin_lock>
0xffffffff99f42ebf <rtlock_slowlock_locked+175>:	mov    0x18(%r12),%eax
0xffffffff99f42ec4 <rtlock_slowlock_locked+180>:	mov    %r13,%rdi
0xffffffff99f42ec7 <rtlock_slowlock_locked+183>:	movl   $0x1000,0x18(%r12)
0xffffffff99f42ed0 <rtlock_slowlock_locked+192>:	mov    %eax,0x1c(%r12)
0xffffffff99f42ed5 <rtlock_slowlock_locked+197>:	call   0xffffffff99f45d60 <_raw_spin_unlock>
arch/x86/include/asm/jump_label.h: 27
0xffffffff99f42eda <rtlock_slowlock_locked+202>:	nopl   0x0(%rax,%rax,1)
arch/x86/include/asm/current.h: 41
0xffffffff99f42edf <rtlock_slowlock_locked+207>:	mov    0x18(%rbp),%r13
0xffffffff99f42ee3 <rtlock_slowlock_locked+211>:	mov    %gs:0x31b40,%r15
kernel/locking/rtmutex_common.h: 161
0xffffffff99f42eec <rtlock_slowlock_locked+220>:	and    $0xfffffffffffffffe,%r13
0xffffffff99f42ef0 <rtlock_slowlock_locked+224>:	mov    %r13,%r12
kernel/locking/rtmutex.c: 1224
0xffffffff99f42ef3 <rtlock_slowlock_locked+227>:	cmp    %r13,%r15
0xffffffff99f42ef6 <rtlock_slowlock_locked+230>:	je     0xffffffff99f4302a <rtlock_slowlock_locked+538>
kernel/locking/rtmutex.c: 1227
0xffffffff99f42efc <rtlock_slowlock_locked+236>:	lea    0x8d8(%r15),%r14
0xffffffff99f42f03 <rtlock_slowlock_locked+243>:	mov    %r14,%rdi
0xffffffff99f42f06 <rtlock_slowlock_locked+246>:	call   0xffffffff99f45c60 <_raw_spin_lock>
kernel/locking/rtmutex.c: 1228
0xffffffff99f42f0b <rtlock_slowlock_locked+251>:	mov    0x6c(%r15),%ecx
kernel/locking/rtmutex.c: 350
0xffffffff99f42f0f <rtlock_slowlock_locked+255>:	mov    $0x78,%eax
kernel/locking/rtmutex.c: 365
0xffffffff99f42f14 <rtlock_slowlock_locked+260>:	mov    0x1f8(%r15),%r9
kernel/locking/rtmutex.c: 1228
0xffffffff99f42f1b <rtlock_slowlock_locked+267>:	mov    %r15,0x80(%rsp)
kernel/locking/rtmutex.c: 1229
0xffffffff99f42f23 <rtlock_slowlock_locked+275>:	cmp    $0x64,%ecx
0xffffffff99f42f26 <rtlock_slowlock_locked+278>:	mov    %rbp,0x88(%rsp)
include/linux/sched/rt.h: 11
0xffffffff99f42f2e <rtlock_slowlock_locked+286>:	cmovge %eax,%ecx
kernel/locking/rtmutex_common.h: 112
0xffffffff99f42f31 <rtlock_slowlock_locked+289>:	mov    0x8(%rbp),%rax
kernel/locking/rtmutex.c: 365
0xffffffff99f42f35 <rtlock_slowlock_locked+293>:	mov    %r9,0x50(%rsp)
kernel/locking/rtmutex.c: 379
0xffffffff99f42f3a <rtlock_slowlock_locked+298>:	mov    %r9,0x78(%rsp)
kernel/locking/rtmutex.c: 364
0xffffffff99f42f3f <rtlock_slowlock_locked+303>:	mov    %ecx,0x48(%rsp)
kernel/locking/rtmutex.c: 378
0xffffffff99f42f43 <rtlock_slowlock_locked+307>:	mov    %ecx,0x70(%rsp)
kernel/locking/rtmutex_common.h: 112
0xffffffff99f42f47 <rtlock_slowlock_locked+311>:	test   %rax,%rax
0xffffffff99f42f4a <rtlock_slowlock_locked+314>:	je     0xffffffff99f4321e <rtlock_slowlock_locked+1038>
kernel/locking/rtmutex_common.h: 130
0xffffffff99f42f50 <rtlock_slowlock_locked+320>:	mov    0x10(%rbp),%rax
0xffffffff99f42f54 <rtlock_slowlock_locked+324>:	mov    %rax,0x8(%rsp)
kernel/locking/rtmutex_common.h: 135
0xffffffff99f42f59 <rtlock_slowlock_locked+329>:	test   %rax,%rax
0xffffffff99f42f5c <rtlock_slowlock_locked+332>:	je     0xffffffff99f42f68 <rtlock_slowlock_locked+344>
kernel/locking/rtmutex_common.h: 137
0xffffffff99f42f5e <rtlock_slowlock_locked+334>:	cmp    0x58(%rax),%rbp
0xffffffff99f42f62 <rtlock_slowlock_locked+338>:	jne    0xffffffff99f43527 <rtlock_slowlock_locked+1815>
include/linux/rbtree.h: 168
0xffffffff99f42f68 <rtlock_slowlock_locked+344>:	mov    0x8(%rbp),%rax
0xffffffff99f42f6c <rtlock_slowlock_locked+348>:	lea    0x8(%rbp),%r10
include/linux/rbtree.h: 172
0xffffffff99f42f70 <rtlock_slowlock_locked+352>:	test   %rax,%rax
0xffffffff99f42f73 <rtlock_slowlock_locked+355>:	je     0xffffffff99f4315c <rtlock_slowlock_locked+844>
include/linux/rbtree.h: 170
0xffffffff99f42f79 <rtlock_slowlock_locked+361>:	mov    $0x1,%edi
0xffffffff99f42f7e <rtlock_slowlock_locked+366>:	jmp    0xffffffff99f42f9a <rtlock_slowlock_locked+394>
include/linux/sched/deadline.h: 15
0xffffffff99f42f80 <rtlock_slowlock_locked+368>:	test   %ecx,%ecx
0xffffffff99f42f82 <rtlock_slowlock_locked+370>:	js     0xffffffff99f430b8 <rtlock_slowlock_locked+680>
include/linux/rbtree.h: 177
0xffffffff99f42f88 <rtlock_slowlock_locked+376>:	mov    0x8(%rax),%rdx
0xffffffff99f42f8c <rtlock_slowlock_locked+380>:	lea    0x8(%rax),%rsi
include/linux/rbtree.h: 178
0xffffffff99f42f90 <rtlock_slowlock_locked+384>:	xor    %edi,%edi
include/linux/rbtree.h: 172
0xffffffff99f42f92 <rtlock_slowlock_locked+386>:	test   %rdx,%rdx
0xffffffff99f42f95 <rtlock_slowlock_locked+389>:	je     0xffffffff99f42fab <rtlock_slowlock_locked+411>
0xffffffff99f42f97 <rtlock_slowlock_locked+391>:	mov    %rdx,%rax
kernel/locking/rtmutex.c: 393
0xffffffff99f42f9a <rtlock_slowlock_locked+394>:	cmp    0x18(%rax),%ecx
0xffffffff99f42f9d <rtlock_slowlock_locked+397>:	jge    0xffffffff99f42f80 <rtlock_slowlock_locked+368>
include/linux/rbtree.h: 175
0xffffffff99f42f9f <rtlock_slowlock_locked+399>:	lea    0x10(%rax),%rsi
include/linux/rbtree.h: 172
0xffffffff99f42fa3 <rtlock_slowlock_locked+403>:	mov    (%rsi),%rdx
0xffffffff99f42fa6 <rtlock_slowlock_locked+406>:	test   %rdx,%rdx
0xffffffff99f42fa9 <rtlock_slowlock_locked+409>:	jne    0xffffffff99f42f97 <rtlock_slowlock_locked+391>
include/linux/rbtree.h: 62
0xffffffff99f42fab <rtlock_slowlock_locked+411>:	mov    %rax,0x30(%rsp)
include/linux/rbtree.h: 63
0xffffffff99f42fb0 <rtlock_slowlock_locked+416>:	movq   $0x0,0x38(%rsp)
0xffffffff99f42fb9 <rtlock_slowlock_locked+425>:	movq   $0x0,0x40(%rsp)
include/linux/rbtree.h: 65
0xffffffff99f42fc2 <rtlock_slowlock_locked+434>:	mov    %rbx,(%rsi)
include/linux/rbtree.h: 112
0xffffffff99f42fc5 <rtlock_slowlock_locked+437>:	test   %dil,%dil
0xffffffff99f42fc8 <rtlock_slowlock_locked+440>:	jne    0xffffffff99f4317b <rtlock_slowlock_locked+875>
include/linux/rbtree.h: 114
0xffffffff99f42fce <rtlock_slowlock_locked+446>:	mov    %rbx,%rdi
0xffffffff99f42fd1 <rtlock_slowlock_locked+449>:	mov    %r10,%rsi
0xffffffff99f42fd4 <rtlock_slowlock_locked+452>:	call   0xffffffff99f20d40 <rb_insert_color>
kernel/locking/rtmutex.c: 1238
0xffffffff99f42fd9 <rtlock_slowlock_locked+457>:	mov    %rbx,0x900(%r15)
kernel/locking/rtmutex.c: 1240
0xffffffff99f42fe0 <rtlock_slowlock_locked+464>:	mov    %r14,%rdi
0xffffffff99f42fe3 <rtlock_slowlock_locked+467>:	call   0xffffffff99f45d60 <_raw_spin_unlock>
kernel/locking/rtmutex.c: 1257
0xffffffff99f42fe8 <rtlock_slowlock_locked+472>:	test   %r13,%r13
0xffffffff99f42feb <rtlock_slowlock_locked+475>:	je     0xffffffff99f4302a <rtlock_slowlock_locked+538>
kernel/locking/rtmutex.c: 1260
0xffffffff99f42fed <rtlock_slowlock_locked+477>:	lea    0x8d8(%r13),%r8
0xffffffff99f42ff4 <rtlock_slowlock_locked+484>:	mov    %r8,%rdi
0xffffffff99f42ff7 <rtlock_slowlock_locked+487>:	mov    %r8,0x10(%rsp)
0xffffffff99f42ffc <rtlock_slowlock_locked+492>:	call   0xffffffff99f45c60 <_raw_spin_lock>
kernel/locking/rtmutex_common.h: 130
0xffffffff99f43001 <rtlock_slowlock_locked+497>:	mov    0x10(%rbp),%rax
kernel/locking/rtmutex_common.h: 135
0xffffffff99f43005 <rtlock_slowlock_locked+501>:	mov    0x10(%rsp),%r8
0xffffffff99f4300a <rtlock_slowlock_locked+506>:	test   %rax,%rax
0xffffffff99f4300d <rtlock_slowlock_locked+509>:	je     0xffffffff99f43022 <rtlock_slowlock_locked+530>
kernel/locking/rtmutex_common.h: 137
0xffffffff99f4300f <rtlock_slowlock_locked+511>:	cmp    0x58(%rax),%rbp
0xffffffff99f43013 <rtlock_slowlock_locked+515>:	jne    0xffffffff99f435fe <rtlock_slowlock_locked+2030>
kernel/locking/rtmutex_common.h: 139
0xffffffff99f43019 <rtlock_slowlock_locked+521>:	cmp    %rbx,%rax
0xffffffff99f4301c <rtlock_slowlock_locked+524>:	je     0xffffffff99f43228 <rtlock_slowlock_locked+1048>
kernel/locking/rtmutex.c: 1275
0xffffffff99f43022 <rtlock_slowlock_locked+530>:	mov    %r8,%rdi
0xffffffff99f43025 <rtlock_slowlock_locked+533>:	call   0xffffffff99f45d60 <_raw_spin_unlock>
kernel/locking/rtmutex.c: 1281
0xffffffff99f4302a <rtlock_slowlock_locked+538>:	mov    %gs:0x31b40,%r12
arch/x86/include/asm/current.h: 41
0xffffffff99f43033 <rtlock_slowlock_locked+547>:	jmp    0xffffffff99f43054 <rtlock_slowlock_locked+580>
kernel/locking/rtmutex.c: 1834
0xffffffff99f43035 <rtlock_slowlock_locked+549>:	mov    %rbp,%rdi
0xffffffff99f43038 <rtlock_slowlock_locked+552>:	call   0xffffffff99f45da0 <_raw_spin_unlock_irq>
kernel/locking/rtmutex.c: 1837
0xffffffff99f4303d <rtlock_slowlock_locked+557>:	call   0xffffffff99f3d030 <schedule_rtlock>
kernel/locking/rtmutex.c: 1839
0xffffffff99f43042 <rtlock_slowlock_locked+562>:	mov    %rbp,%rdi

在x86上面,当参数少于7时, 参数会依次放入寄存器: rdi, rsi, rdx, rcx, r8, r9,

mov    %rdi,%rbp

这一行代码已经把参数的值放到rbp寄存器当中了,而且后续可以看到一些类似“mov %r13,%rdi”的操作,说明虽然schedule_rtlock没有参数,但是rdi寄存器已经不再存放lock的值了。
从以下反汇编的内容可以得知,lock值应该就存在rbq当中

0xffffffff99f43035 <rtlock_slowlock_locked+549>:        mov    %rbp,%rdi
0xffffffff99f43038 <rtlock_slowlock_locked+552>:        call   0xffffffff99f45da0 <_raw_spin_unlock_irq>

因为原函数当中是这样进行调用的:

1839         raw_spin_lock_irq(&lock->wait_lock);

lock->wait_lock就是lock的值,在调用_raw_spin_unlock_irq的时候把rbp传给参数寄存器,也就是说rbq当中存的就是lock的值。

接下来对schedule_rtlock进行反汇编:

crash> dis -lr ffffffff99f3d04f
kernel/sched/core.c: 6874
0xffffffff99f3d030 <schedule_rtlock>:	nopw   (%rax)
kernel/sched/core.c: 6792
0xffffffff99f3d034 <schedule_rtlock+4>:	push   %rbx
arch/x86/include/asm/current.h: 41
0xffffffff99f3d035 <schedule_rtlock+5>:	mov    %gs:0x31b40,%rbx
arch/x86/include/asm/preempt.h: 80
0xffffffff99f3d03e <schedule_rtlock+14>:	incl   %gs:0x660f4b03(%rip)        # 0x31b48
kernel/sched/core.c: 6796
0xffffffff99f3d045 <schedule_rtlock+21>:	mov    $0x2,%edi
0xffffffff99f3d04a <schedule_rtlock+26>:	call   0xffffffff99f3c080 <__schedule>
arch/x86/include/asm/preempt.h: 85
0xffffffff99f3d04f <schedule_rtlock+31>:	decl   %gs:0x660f4af2(%rip)        # 0x31b48

并未发现对%rbp的操作,可能是编译器进行了优化,因为schedule_rtlock并未改变寄存器%rbq的值,所以并未进行压栈。
继续对上一层函数__schedule进行反汇编

crash> dis -lr ffffffff99f3c3ce
kernel/sched/core.c: 6598
0xffffffff99f3c080 <__schedule>:	push   %rbp
0xffffffff99f3c081 <__schedule+1>:	mov    %rsp,%rbp
0xffffffff99f3c084 <__schedule+4>:	push   %r15
0xffffffff99f3c086 <__schedule+6>:	push   %r14
0xffffffff99f3c088 <__schedule+8>:	mov    %edi,%r14d
0xffffffff99f3c08b <__schedule+11>:	push   %r13
……

可以看到在最开始的时候就对寄存器%rbp进行压栈,对应的栈地址为ff468632c619f7b0,内容为ff27411f89f8da98
在crash里面查看这个地址的内容:

crash> rt_mutex_base ff27411f89f8da98
struct rt_mutex_base {wait_lock = {raw_lock = {{val = {counter = 0},{locked = 0 '\000',pending = 0 '\000'},{locked_pending = 0,tail = 0}}}},waiters = {rb_root = {rb_node = 0xff468632cc40f3f0},rb_leftmost = 0xff468632c619f800},owner = crash> rt_mutex_base ff27411f89f8da98
}

可以看到owner为0xff27411f3bd0df01,最后的1不是task_struct的地址,是在获得锁的时候或的,实际的task_struct地址是0xff27411f3bd0df00

crash> task_struct.pid 0xff27411f3bd0df00 pid = 23645,

得到锁是由23645进程执有的

相关文章:

vmcore分析锁问题实例(x86-64)

问题描述&#xff1a;系统出现panic&#xff0c;dmesg有如下打印&#xff1a; [122061.197311] task:irq/181-ice-enp state:D stack:0 pid:3134 ppid:2 flags:0x00004000 [122061.197315] Call Trace: [122061.197317] <TASK> [122061.197318] __schedule0…...

【vue3】vue3+express实现图片/pdf等资源文件的下载

文件资源的下载&#xff0c;是我们业务开发中常见的需求。作为前端开发&#xff0c;学习下如何自己使用node的express框架来实现资源的下载操作。 实现效果 代码实现 前端 1.封装的请求后端下载接口的方法,需求配置aixos的请求参数里面的返回数据类型为blob // 下载 export…...

【BUG】Redis RDB快照持久化及写操作禁止问题排查与解决

1 问题描述 在使用Redis 的过程中&#xff0c;遇到如下报错&#xff0c;错误信息是 “MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk...”&#xff0c;记录下问题排查过程。 2 问题排查与解决 该错误提示表明&#…...

【HD-RK3576-PI】定制用户升级固件

硬件&#xff1a;HD-RK3576-PI 软件&#xff1a;Linux6.1Ubuntu22.04 在进行 Rockchip 相关开发时&#xff0c;制作自定义的烧写固件是一项常见且重要的操作。这里主要介绍文件系统的修改以及打包成完整update包升级的过程。 一、修改文件系统镜像&#xff08;Ubuntu环境操作&…...

【AI学习】李宏毅老师讲AI Agent摘要

在b站听了李宏毅2025最新的AI Agent教程&#xff0c;简单易懂&#xff0c;而且紧跟发展&#xff0c;有大量最新的研究进展。 教程中引用了大量论文&#xff0c;为了方便将来阅读相关论文&#xff0c;进一步深入理解&#xff0c;做了截屏纪录。 同时也做一下分享。 根据经验调整…...

狂神SQL学习笔记十:修改和删除数据表字段

1、修改与删除表 alter 修改表的名称&#xff1a; 增加表的字段&#xff1a; 修改表的字段&#xff08;重命名&#xff0c;修改约束&#xff09;&#xff1a; 修改约束 重命名 删除表的字段 删除表...

OSPF综合实验

一、网络拓扑 二、实验要求 1&#xff0c;R5为ISP&#xff0c;其上只能配置IP地址;R4作为企业边界路由器&#xff1b; 2&#xff0c;整个0SPF环境IP基于172.16.0.8/16划分; 3&#xff0c;所有设备均可访问R5的环回; 4&#xff0c;减少LSA的更新量&#xff0c;加快收敛&#xf…...

2025 cs144 Lab Checkpoint 2 小白超详细版

文章目录 1 环形索引的实现1.1 wrap类wrapunwrap 2 实现tcp_receiver2.1 tcp_receiver的功能2.2 传输的报文格式TCPSenderMessageTCPReceiverMessage 2.3 如何实现函数receive&#xff08;&#xff09;send&#xff08;&#xff09; 1 环形索引的实现 范围是0~2^32-1 需要有SY…...

VMware虚拟机安装Ubuntu 22.04.2

一、我的虚拟机版本 二、浏览器搜索Ubuntu 三、下载Ubuntu桌面版 四、下这个 五、创建新的虚拟机 六、选择典型&#xff0c;然后下一步 七、选择稍后安装操作系统&#xff0c;然后下一步 八、选择Linux ,版本选择Ubuntu 64位 九、选择好安装位置 十、磁盘大小一般选20G就够用了…...

XSS漏洞及常见处理方案

文章背景&#xff1a; 在近期项目安全测试中&#xff0c;安全团队发现了一处潜在的 跨站脚本攻击&#xff08;XSS&#xff09;漏洞&#xff0c;该漏洞可能导致用户数据被篡改或会话劫持等安全风险。针对这一问题&#xff0c;项目组迅速响应&#xff0c;通过代码修复、输入过滤、…...

TCP标志位抓包

说明 TCP协议的Header信息&#xff0c;URG、ACK、PSH、RST、SYN、FIN这6个字段在14字节的位置&#xff0c;对应的是tcp[13]&#xff0c;因为字节数是从[0]开始数的&#xff0c;14字节对应的就是tcp[13]&#xff0c;因此在抓这几个标志位的数据包时就要明确范围在tcp[13] 示例1…...

C/C++条件判断

条件判断 if语句的三种形态 if(a<b){} 、 if(a<b){}else{} 、 if(a<b){}else if(a>b) else{} if语句的嵌套 嵌套的常见错误&#xff08;配对错误&#xff09;,与前面最近的&#xff0c;而且还没有配对的if匹配 错误避免方法&#xff1a;严格使用 { }、先写&am…...

单位门户网站被攻击后的安全防护策略

政府网站安全现状与挑战 近年来&#xff0c;随着数字化进程的加速&#xff0c;政府门户网站已成为政务公开和服务公众的重要窗口。然而&#xff0c;网络安全形势却日益严峻。国家互联网应急中心的数据显示&#xff0c;政府网站已成为黑客攻击的重点目标&#xff0c;被篡改和被…...

# 工具记录

工具记录 键盘操作可视化工具openark64系统工具dufs-webui文件共享zotero文献查看cff explorerNoFencesfreeplane开源思维导图...

C/C++运算

C语言字符串的比较 #include <string.h> int strcmp( const char *str1, const char *str2 );例如: int ret; ret strcmp(str1, str2);返回值&#xff1a; str1 < str2时&#xff0c; 返回值< 0&#xff08;有些编译器返回 -1&#xff09; str1 > str2时…...

CloudWeGo 技术沙龙·深圳站回顾:云原生 × AI 时代的微服务架构与技术实践

2025 年 3 月 22 日&#xff0c;CloudWeGo “云原生 AI 时代的微服务架构与技术实践”主题沙龙在深圳圆满落幕。作为云原生与 AI 微服务融合领域的深度技术聚会&#xff0c;本次活动吸引了来自企业、开发者社区的百余位参与者&#xff0c;共同探讨如何通过开源技术应对智能时代…...

STM32移植文件系统FATFS——片外SPI FLASH

一、电路连接 主控芯片选型为&#xff1a;STM32F407ZGT6&#xff0c;SPI FLASH选型为&#xff1a;W25Q256JV。 采用了两片32MB的片外SPI FLASH&#xff0c;电路如图所示。 SPI FLASH与主控芯片的连接方式如表所示。 STM32F407GT6W25Q256JVPB3SPI1_SCKPB4SPI1_MISOPB5SPI1_MOSI…...

华为HG8546M光猫宽带密码破解

首先进光猫管理界面 将password改成text就可以看到加密后的密码了 复制密码到下面代码里 import hashlibdef sha256(todo):return hashlib.sha256(str(todo).encode()).hexdigest()def md5(todo):return hashlib.md5(str(todo).encode()).hexdigest()def find_secret(secret,…...

驱动-兼容不同设备-container_of

驱动兼容不同类型设备 在 Linux 驱动开发中&#xff0c;container_of 宏常被用来实现一个驱动兼容多种不同设备的架构。这种设计模式在 Linux 内核中非常常见&#xff0c;特别 是在设备驱动模型中。linux内核的主要开发语言是C&#xff0c;但是现在内核的框架使用了非常多的面向…...

UE5 检测球形范围的所有Actor

和Untiiy不同&#xff0c;不需要复杂的调用 首选确保角色添加了Sphere Collision 然后直接把sphere拖入蓝图&#xff0c;调用GetOverlappingActors来获取碰撞范围内的所有Actor...

AI大模型学习十:‌Ubuntu 22.04.5 调整根目录大小,解决根目录磁盘不够问题

一、说明 由于默认安装时导致home和根目录大小一样&#xff0c;导致根目录不够&#xff0c;所以我们调整下 二、调整 # 确认/home和/是否为独立逻辑卷&#xff0c;并属于同一卷组&#xff08;VG&#xff09; rootnode1:~# lsblk NAME MAJ:MIN RM SIZE…...

在ros2上使用opencv显示一张图片

1.先将图片放到桌面上 2.打开终端ctrlaltT&#xff0c;查看自己是否已安装opencv 3.创建工作环境 4.进入工作目录并创建ROS2包添加OpenCV依赖项 5.进入/home/kong/opencv_ws/opencv_use/src目录创建.cpp文件并编辑 6.代码如下 my_opencv.cpp #include <cstdio> #include…...

训练神经网络的原理(前向传播、反向传播、优化、迭代)

训练神经网络的原理 通过前向传播计算预测值和损失&#xff0c;利用反向传播计算梯度&#xff0c;然后通过优化算法更新参数&#xff0c;最终使模型在给定任务上表现更好。 核心&#xff1a;通过计算损失函数&#xff08;通常是模型预测与真实值之间的差距&#xff09;对模型参…...

每日一题(小白)暴力娱乐篇30

顺时针旋转&#xff0c;从上图中不难看出行列进行了变换。因为这是一道暴力可以解决的问题&#xff0c;我们直接尝试使用行列转换看能不能得到想要的结果。 public static void main(String[] args) {Scanner scan new Scanner(System.in);int nscan.nextInt();int mscan.next…...

【HTTPS】免费SSL证书配置Let‘s Encrypt自动续期

【HTTPS】免费SSL证书配置Lets Encrypt自动续期 1. 安装Certbot1.1 snapd1.2 certbot2. 申请泛域名证书使用 DNS 验证申请泛域名证书3.配置nginx申请的 SSL 证书文件所在目录nginx配置证书示例查看证书信息和剩余时间4.自动续期手动自动5.不同服务器使用1. 安装Certbot 1.1 sn…...

企业应如何防范 AI 驱动的网络安全威胁?

互联网技术和 AI 科技为世界开启了一个新的发展篇章。同时&#xff0c;网络攻击也呈现出愈发强势的发展势头&#xff1a;高级持续性威胁 &#xff08;APT&#xff1a;Advanced Persistent Threat&#xff09;组织采用新的战术、技术和程序 (TTP)、AI 驱动下攻击数量和速度的提高…...

决策树简介

【理解】决策树例子 决策树算法是一种监督学习算法&#xff0c;英文是Decision tree。 决策树思想的来源非常朴素&#xff0c;试想每个人的大脑都有类似于if-else这样的逻辑判断&#xff0c;这其中的if表示的是条件&#xff0c;if之后的else就是一种选择或决策。程序设计中的…...

ScrollView(滚动视图)详解和按钮点击事件

文章目录 **ScrollView&#xff08;滚动视图&#xff09;详解****1. 核心特性****2. 基本用法****XML 示例&#xff1a;简单滚动布局** **3. 水平滚动&#xff1a;HorizontalScrollView****4. 高级用法****(1) 嵌套滚动控件****(2) 动态添加内容****(3) 监听滚动事件** **5. 注…...

2025年3月,再上中科院1区TOP,“等级熵+状态识别、故障诊断”

引言 2025年3月&#xff0c;研究者在国际机械领域顶级期刊《Mechanical Systems and Signal Processing》&#xff08;JCR 1区&#xff0c;中科院1区 Top&#xff0c;IF&#xff1a;7.9&#xff09;上以“Rating entropy and its multivariate version”为题发表科学研究成果。…...

根据pdf文档生成问答并进行评估

目标是根据pdf文档生成问答&#xff0c;并进行评估。 首先&#xff0c;安装依赖 pip install PyPDF2 pandas tqdm openai -q 具体过程如下&#xff1a; 1、将pdf放在opeai_blog_pdfs目录下&#xff0c;引用依赖 2、上传pdf文件&#xff0c;创建向量库 3、单个提问的向量检索…...

计算机网络 - 四次挥手相关问题

通过一些问题来讨论 TCP 的四次挥手断开连接 说一下四次挥手的过程&#xff1f;为什么需要四次呢&#xff1f;time-wait干嘛的&#xff0c;close-wait干嘛的&#xff0c;在哪一个阶段&#xff1f;状态CLOSE_WAIT在什么时候转换成下一个状态呢&#xff1f;为什么 TIME-WAIT 状态…...

SLAM | 两组时间戳不同但同时开始的imu如何对齐

场景&#xff1a; 两个手机在支架上&#xff0c;同时开始采集数据 需求&#xff1a; 对齐两个数据集的imu数据 做到A图片 B imu 做法&#xff1a; 取出来两组imu数据到excel表中&#xff0c;画图 A组 B组&#xff1a; x轴 &#xff1a; 所有imu的时间戳减去第一个时间…...

code review时线程池的使用

一、多线程的作用 多个任务并行执行可以提升效率异步&#xff0c;让与主业务无关的逻辑异步执行&#xff0c;不阻塞主业务 二、问题描述 insertSelective()方法是一个并发度比较高的业务&#xff0c;主要是插入task到任务表里&#xff0c;新建task&#xff0c;并且insertSele…...

物流网络暗战升级DHL新布局将如何影响eBay卖家库存分布策略?

物流网络暗战升级&#xff1a;DHL新布局将如何影响eBay卖家库存分布策略&#xff1f; 跨境电商发展迅猛&#xff0c;卖家对物流的依赖程度不言而喻。尤其是平台型卖家&#xff0c;例如在eBay上经营多站点的卖家&#xff0c;物流成本和时效几乎直接决定了利润空间与客户满意度。…...

JAMA Netw. Open:机器学习解码大脑:精准预测PTSD症状新突破

创伤后应激障碍&#xff08;PTSD&#xff09;是一种常见的心理健康状况&#xff0c;它可以在人们经历或目睹创伤性事件&#xff08;如战争、严重事故、自然灾害、暴力攻击等&#xff09;后发展。PTSD的症状可能包括 flashbacks&#xff08;闪回&#xff09;、噩梦、严重的焦虑、…...

域控制器升级的先决条件验证失败,证书服务器已安装

出现“证书服务器已安装”导致域控制器升级失败时&#xff0c;核心解决方法是卸载已安装的证书服务‌。具体操作如下&#xff1a;‌ ‌卸载证书服务‌ 以管理员身份打开PowerShell&#xff0c;执行命令&#xff1a; Remove-WindowsFeature -Name AD-Certificate该命令会移除A…...

Node.js入门

Node.js入门 html,css,js 30年了 nodejs环境 09年出现 15年 nodejs为我们解决了2个方面的问题&#xff1a; 【锦上添花】让我们前端工程师拥有了后端开发能力&#xff08;开接口&#xff0c;访问数据库&#xff09; - 大公司BFF&#xff08;50&#xff09;【✔️】前端工程…...

使用CubeMX新建EXTI外部中断工程——不使用回调函数

具体的使用CubeMX新建工程的步骤看这里&#xff1a;STM32CubeMX学习笔记&#xff08;3&#xff09;——EXTI(外部中断)接口使用_cubemx exti-CSDN博客 之前一直都是在看野火的视频没有亲手使用CubeMX生成工程&#xff0c;而且野火给的例程代码框架和自动生成的框架也不一样&…...

Verilog的整数除法

1、可变系数除法实现----利用除法的本质 timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2025/04/15 13:45:39 // Design Name: // Module Name: divide_1 // Project Name: // Target Devices: // Tool Versions: // Description: // // Depe…...

win32汇编环境,网络编程入门之十九

;win32汇编环境,网络编程入门之十九 ;在这一编程里&#xff0c;我们学习一下如何使用gethostbyname函数&#xff0c;也顺便学一下如何将C定义的函数在WIN32汇编环境中使用 ;先看一下官方解释&#xff1a;从主机数据库中检索与主机名对应的主机信息。 ;它的原理是从你的电脑DNS中…...

Java学习手册:Java线程安全与同步机制

在Java并发编程中&#xff0c;线程安全和同步机制是确保程序正确性和数据一致性的关键。当多个线程同时访问共享资源时&#xff0c;如果不加以控制&#xff0c;可能会导致数据不一致、竞态条件等问题。本文将深入探讨Java中的线程安全问题以及解决这些问题的同步机制。 线程安…...

在生信分析中,从生物学数据库中下载的序列存放在哪里?要不要建立一个小型数据库,或者存放在Gitee上?

李升伟 整理 在Galaxy平台中使用时&#xff0c;从NCBI等生物学数据库下载的DNA序列的存储位置和管理方式需要根据具体的工作流程和需求进行调整。以下是详细的分步说明和建议&#xff1a; 一、Galaxy中DNA序列的默认存储位置 在Galaxy的“历史记录”&#xff08;History&…...

Python异步编程入门:Async/Await实战详解

引言 在当今高并发的应用场景下&#xff0c;传统的同步编程模式逐渐暴露出性能瓶颈。Python通过asyncio模块和async/await语法为开发者提供了原生的异步编程支持。本文将手把手带你理解异步编程的核心概念&#xff0c;并通过实际代码案例演示如何用异步爬虫提升10倍效率&#…...

cmd 终端输出乱码问题 |Visual Studio 控制台输出中文乱码解决

在网上下载&#xff0c;或者移植别人的代码到自己的电脑&#xff0c;使用VS运行后&#xff0c;控制台输出中文可能出现乱码。这是因为源代码的编码格式和控制台的编码格式不一致。 文章目录 查看源代码文件编码格式查看输出控制台编码格式修改编码格式修改终端代码页 补充总结 …...

【算法】椭圆曲线签名(ECDSA)

&#x1f914;什么是椭圆曲线签名&#xff08;ECDSA&#xff09;&#xff1f; 椭圆曲线签名算法&#xff08;Elliptic Curve Digital Signature Algorithm&#xff0c;简称 ECDSA&#xff09;是一种基于 椭圆曲线密码学 的数字签名算法。它主要用于加密货币&#xff08;如 Bit…...

Linux下使用MTK的SP_Flash_tool刷机工具

MTK的SP_Flash_tool刷机工具安装流程如下&#xff1a; 1、解压SP_Flash_Tool_Linux_v5.1336.00.100_Customer.zip unzip SP_Flash_Tool_exe_Linux_64Bit_v5.1520.00.100.zip 2、首先安装 libusb-dev 这个包&#xff1a; sudo apt-get install libusb-dev 3、安装成功之后…...

FRP内网穿透代理两个web页面(多端口内网穿透)

内网机器代理两个web页面出来 下载frp 选择0.51.2版本下载&#xff0c;高版本测试为成功 frp下载地址 部署frp server端&#xff08;公网部署&#xff09; #上传到opt rootsdgs-server07:/opt# ll frp_0.51.2_linux_amd64.tar.gz -rw-r--r-- 1 root root 11981480 Apr 15 1…...

Jenkins插件下载慢解决办法

jenkins设置插件使用国内镜像_jenkins 国内镜像-CSDN博客 国内源 以下是一些常用的国内 Jenkins 插件更新源地址&#xff1a; 清华大学&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json华为开源镜像站&#xff1a;https://mirrors.huawei…...

【Unity笔记】Unity开发笔记:ScriptableObject实现高效游戏配置管理(含源码解析)

在Unity开发中&#xff0c;高效管理游戏配置数据是提升开发效率的关键。本文分享如何使用ScriptableObject构建可编辑的键值对存储系统&#xff0c;并实现运行时动态读取。 一、为什么选择ScriptableObject&#xff1f; 1.1 ScriptableObject的核心优势 独立资源&#xff1a;…...

FPAG IP核调用小练习

一、调用步骤 1、打开Quartus 右上角搜索ROM&#xff0c;如图所示 2、点击后会弹出如图所示 其中文件路径需要选择你自己的 3、点击OK弹出如图所示 图中红色改为12与1024 4、然后一直点NEXT&#xff0c;直到下图 这里要选择后缀为 .mif的文件 5、用C语言生成 .mif文件 //…...