Chinaunix首页 | 论坛 | 博客
  • 博客访问: 305210
  • 博文数量: 65
  • 博客积分: 185
  • 博客等级: 入伍新兵
  • 技术积分: 609
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-06 21:41
个人简介

好好学习,天天向上

文章分类

全部博文(65)

文章存档

2022年(3)

2021年(25)

2020年(1)

2019年(3)

2016年(2)

2015年(3)

2014年(14)

2013年(7)

2012年(7)

我的朋友

分类: 嵌入式

2021-12-04 16:04:43

cpu高,R状态的任务为什么/proc/[pid]/stack堆栈不准


点击(此处)折叠或打开

  1. 构造sys cpu高R的情况,为什么堆栈不准
  2. 190 read_unlock(&tasklist_lock);
  3. 191 while(1) {
  4. 192 udelay(8000);
  5. 193 usleep_range(1, 2);
  6. 194 }
  7. 195
  8. 196 return 0;
  9. 197 }

  10. 如下,只有在任务睡眠的时候堆栈是正确的
  11. 1、原因是如果任务在运行,cat stack的起始帧是上次切换出去的时候ENTRY(cpu_switch_to)保存的帧
  12. 而如果任务在运行处于R状态,那么用上次的起始帧去unwind现在的内核栈,回溯就会有很奇怪的数据,不是正常的数据
  13. 2、如果是单核的情况,那么在敲回溯的时候,R状态的任务会被preempt 调度出去,这种情况下cat的stack每次都是准确的
  14. 3、如果是用户态100%的情况rtprocess_arm64 1 50 2(FIFO 50 cpu2),内核栈是退出来的已经清空了的,一般没有内容
  15.  # cat /proc/189/stack
  16. [<0>] __switch_to+0x288/0x418
  17. / #


  18. / # cat /proc/148/stack
  19. [<0>] __switch_to+0x288/0x418
  20. [<0>] info_show+0x23c/0x2b8
  21. [<0>] seq_read+0x334/0xf38
  22. [<0>] proc_reg_read+0x124/0x1b0
  23. [<0>] do_iter_read+0x2e8/0x490
  24. [<0>] vfs_readv+0xc8/0x120
  25. [<0>] default_file_splice_read+0x374/0x730
  26. [<0>] do_splice_to+0xe0/0x140
  27. [<0>] splice_direct_to_actor+0x270/0x720
  28. [<0>] do_splice_direct+0x12c/0x200
  29. [<0>] do_sendfile+0x338/0xac0
  30. [<0>] __arm64_sys_sendfile64+0x340/0x400
  31. [<0>] el0_svc_common.constprop.0+0x110/0x378
  32. [<0>] el0_svc_handler+0x4c/0xd0
  33. [<0>] el0_svc+0x8/0x1bc
  34. / # cat /proc/148/stack
  35. [<0>] __switch_to+0x288/0x418
  36. [<0>] 0xffff000008cccc00
  37. / # cat /proc/148/stack
  38. [<0>] __switch_to+0x288/0x418
  39. [<0>] str_spec.71612+0x1c2838/0x2d6378
  40. / # cat /proc/148/stack
  41. [<0>] __switch_to+0x288/0x418
  42. [<0>] str_spec.71612+0x1c2838/0x2d6378
  43. / #

  44. if (tsk != current) {
  45.     start_backtrace(&frame, thread_saved_fp(tsk),
  46.         thread_saved_pc(tsk));

  47. #define thread_saved_pc(tsk)    \
  48.     ((unsigned long)(tsk->thread.cpu_context.pc))
  49. #define thread_saved_sp(tsk)    \
  50.     ((unsigned long)(tsk->thread.cpu_context.sp))
  51. #define thread_saved_fp(tsk)    \
  52.     ((unsigned long)(tsk->thread.cpu_context.fp))


  53. 1208 */
  54. 1209 ENTRY(cpu_switch_to)
  55. 1210 mov x10, #THREAD_CPU_CONTEXT
  56. 1211 add x8, x0, x10
  57. 1212 mov x9, sp
  58. 1213 stp x19, x20, [x8], #16 // store callee-saved registers
  59. 1214 stp x21, x22, [x8], #16
  60. 1215 stp x23, x24, [x8], #16
  61. 1216 stp x25, x26, [x8], #16
  62. 1217 stp x27, x28, [x8], #16
  63. 1218 stp x29, x9, [x8], #16
  64. 1219 str lr, [x8]
  65. 1220 add x8, x1, x10
  66. 1221 ldp x19, x20, [x8], #16 // restore callee-saved registers
  67. 1222 ldp x21, x22, [x8], #16
  68. 1223 ldp x23, x24, [x8], #16
  69. 1224 ldp x25, x26, [x8], #16
  70. 1225 ldp x27, x28, [x8], #16
  71. 1226 ldp x29, x9, [x8], #16
  72. 1227 ldr lr, [x8]
  73. 1228 mov sp, x9
  74. 1229 msr sp_el0, x1
  75. 1230 ret
  76. 1231 ENDPROC(cpu_switch_to)
  77. 1232 NOKPROBE(cpu_switch_to)

阅读(1267) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~