Linux程序调试--printk

本文详细解析Linux内核中printk函数的工作原理,包括如何根据命令行参数选择输出设备,printk级别的含义及其设置,以及如何利用printk进行驱动调试。通过实例分析了console_loglevel值的修改方法,提供了三种屏蔽打印的方法。
摘要由CSDN通过智能技术生成

0 导读

1)分析printk()函数
2)使用printk()调试驱动

1在驱动调试中,使用printk(),是最简单,最方便的办法

当uboot的命令行里的“console=tty1”时,表示printk()输出在开发板的LCD屏上

当uboot的命令行里的“console=ttySA0,115200”时,表示printk()输出在串口UART0上,波特率=115200

当uboot的命令行里的“console=tty1 console=ttySA0,115200”时,表示printk()同时输出在串口上,以及开发板的LCD屏上

显然printk(),还是根据命令行参数来调用不同控制台的硬件处理函数

内核又是怎么根据上面命令行参数来确定printk()的输出设备?

2我们以“console=ttySA0,115200”为例,进入linux-3.4.2\kernel\printk.c

找到以下一段:

__setup("console=", console_setup);

其中__setup()的作用就是:

若uboot传递进来的命令行字符串里含有“console=”,便调用console_setup()函数,并对“console=”后面带的字符串"ttySA0,115200"进行分析。

3 我们以*str= "ttySA0,115200"为例,console_setup()函数如下所示

static int __init console_setup(char *str)                    //*str="ttySA0,115200"
{
   
       char name[sizeof(console_cmdline[0].name)];     // char name[8]
       char *s, *options;
       int idx; 
       /*
        * Decode str into name, index, options.
        */

       if (str[0] >= '0' && str[0] <= '9') {
                       
              strcpy(name, "ttyS");
              strncpy(name + 4, str, sizeof(name) - 5);
       } else {
   
              strncpy(name, str, sizeof(name) - 1);   //*name="ttySA0, "
       }
       name[sizeof(name) - 1] = 0;            //*name="ttySA0"
       if ((options = strchr(str, ',')) != NULL)   //找到',',返回给options,所以options=",115200"
              *(options++) = 0;                //*options="115200", *str="ttySA0"
#ifdef __sparc__
       if (!strcmp(str, "ttya"))
              strcpy(name, "ttyS0");
       if (!strcmp(str, "ttyb"))
              strcpy(name, "ttyS1");
#endif

       for (s = name; *s; s++)                                     //*s="0"
              if ((*s >= '0' && *s <= '9') || *s == ',')
                     break;

       idx = simple_strtoul(s, NULL, 10)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值