Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78392
  • 博文数量: 9
  • 博客积分: 295
  • 博客等级: 一等列兵
  • 技术积分: 222
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-14 08:30
文章分类
文章存档

2013年(1)

2012年(8)

我的朋友

分类: LINUX

2012-07-19 14:29:36

很多时候我们需要在内核中调试一些汇编代码,这个时候要是想打印一些寄存器信息咋办呢?还有要是我们在console未初始化之前,要调试代码,怎样通过串口输出信息呢?研究下内核中的代码片段:
 76 __error_p:
 77 #ifdef CONFIG_DEBUG_LL
 78         adr     r0, str_p1
 79         bl      printascii
 80         mov     r0, r9
 81         bl      printhex8
 82         adr     r0, str_p2
 83         bl      printascii
 84         b       __error
 85 str_p1: .asciz  "\nError: unrecognized/unsupported processor variant (0x"
 86 str_p2: .asciz  ").\n"
 87         .align
 88 #endif
 89 ENDPROC(__error_p)
上面代码片段来自于arch/arm/kernel/head-common.S(内核版本2.6.35.3)
要想上面代码参与编译,需要配置内核如下:
Kernel hacking  --->
[*] Kernel low-level debugging functions
78:讲85行字符串的基地址赋值给r0
79: 跳转到printascii打印r0内核的字符串
80:将r9的值赋给r0
81:跳转到printhex8,以16进制打印出r0内的值
82-83:打印出86行字符串。
上面汇编实现的__error_p函数就是用来处理内核支持的arm core和内核支持arm core匹配的问题,这个时候console还不能用呢。
具体的调用可以参看代码:
 83         mrc     p15, 0, r9, c0, c0              @ get processor id
 84         bl      __lookup_processor_type         @ r5=procinfo r9=cpuid
 85         movs    r10, r5                         @ invalid processor (r5=0)?
 86         beq     __error_p                       @ yes, error 'p'
代码片段来自于arch/arm/kernel/head.S。
83:从ARM的CP15协处理器的寄存器中读取出 processor id;
84: 跳转到函数 __lookup_processor_type,返回r5=procinfo,读入参数r9=cpuid
85: 如果不支持改processor,返回值r5=0
86:如果r5=0则跳转到__error_p,打印出错信息。
例如:Error: unrecognized/unsupported processor variant(0x41069265)。
好了,看到了汇编级串口信息打印函数了吧:),我们调试的时候依葫芦画瓢就行了。
上面用到的printascii,printhex8等等,他们都被封装在arch/arm/kernel/debug.S中。
以后用到了可以看看,实际上这种debug方法可以移植到uboot上,貌似以前samsung的vivi bootloader也是支持这个debug方法的,用着很方便。
阅读(5582) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~