- 论坛徽章:
- 0
|
原帖由 qiangtoucao121 于 2007-9-30 09:43 发表
老大,能给我简单的讲讲调试跟踪内核的方法吗?谢谢!
惭愧,偶不是 linux kernel 爱好者,没学习过 linux kernel,所以不了解 kernel 调试方法
不过,偶喜欢分析汇编代码:
- push %rbp
- mov %rsp,%rbp
- push %r15
- mov %r8,%r15 /* key */
- push %r14
- lea 0x8(%rdi),%r14 /* r14 = &q->task_list */
- push %r13
- mov %edx,%r13d /* r13d = nr_exclusive */
- push %r12
- push %rbx
- sub $0x8,%rsp
- mov %esi,0xffffffffffffffd4(%rbp) /* [rbp-40] = mode */
- mov %ecx,0xffffffffffffffd0(%rbp) /* [rbp-48] = sync */
- mov 0x8(%rdi),%rax /* rax = q->task_list */
- cmp %r14,%rax /* 判断是否回到头节点 */
- mov (%rax),%r12 /* r12 = *q->task_list */
- je 0xffffffff8013093e <__wake_up_common+94>
- data16
- data16
- nop
- lea 0xffffffffffffffe8(%rax),%rdi /* curr */
- mov 0xffffffffffffffe8(%rax),%ebx
- mov %r15,%rcx /* key */
- mov 0xffffffffffffffd0(%rbp),%edx /* sync */
- mov 0xffffffffffffffd4(%rbp),%esi /* mode */
- callq *0xfffffffffffffff8(%rax) /* curr->func() */
- test %eax,%eax
- je 0xffffffff80130932 <__wake_up_common+82>
- and $0x1,%ebx
- je 0xffffffff80130932 <__wake_up_common+82>
- dec %r13d
- nop
- je 0xffffffff8013093e <__wake_up_common+94>
- mov %r12,%rax /* rax = *q->task_list */
- mov (%r12),%r12 / q->task_list = *q->task_list */
- cmp %r14,%rax /* 判断是否回到头节点 */
- jne 0xffffffff80130910 <__wake_up_common+48>
- add $0x8,%rsp
- pop %rbx
- pop %r12
- pop %r13
- pop %r14
- pop %r15
- leaveq
- retq
- data16
- data16
- nop
复制代码
curr->func 被置为 0 时,就出现了以下的错误。
偶给你介绍一下 AMD64 的 ABI 几个特性:
1、7个通用寄存器(rdi,rsi,rdx,rcx,r8,r9 和 rax)依次用作函数传递参数。
2、rsp 及 rbp 用于管理堆栈
3、r10 及 r11 用于临时寄存器
4、5个通用寄存器(r12,r13,r14,r15 及 rbx)由被调用方保存 |
|