1、uboot跳转到内核启动的时候通过环境变量 console设置控制台

(console = ttySAC0表示输出到串口,并从串口结束输入,也可以设置console=tty1,表示输出到LCD,从inputevent接受输入事件)

2、内核用printk打印,printk肯定要调用硬件函数,其通过console参数来确定具体硬件,调用对应的硬件处理函数

  在内核中搜索“console=”,可以看到__setup("console=",console_setup),__setup是个宏

以console为例,在/kernel/printk.c中,如下:

  1. static int __init console_setup(char *str)
  2. {
  3. .......
  4. }
  5. __setup("console=", console_setup);

__setup宏定义展开,如下:

  1. Static struct obs_kernel_param __setup_console_setup
  2. __used_section(.init.setup) __attribute__((aligned((sizeof(long)))) = {
  3. .name = “console=”,
  4. .setup_func = console_setup,
  5. .early = 0
  6. }

__setup_console_setup编译时就会链接到.init.setup段中,kernel运行时就会根据cmdline中的参数名与.init.setup段中obs_kernel_param的name对比。

匹配则调用console-setup来解析该参数,console_setup的参数就是cmdline中console的值

1. 内核处理UBOOT传入的参数
console_setup
  add_preferred_console // 我想用名为"ttySAC0"的控制台,先保存在console_cmdline中,可以有多个console,会在register_console中被使用来比较

2. 硬件驱动的入口函数里:
drivers/serial/s3c2410.c
  register_console(&s3c24xx_serial_console);//注册console,其有个名字,内核会把这个名字和uboot中传过来的被保存的那个名字链表比较,s3c24xx_serial_console结构体有write函数,会被prinkt调用;register_console会把s3c24xx_serial_console放在console_drivers的尾部

(3.4.2的内核如下

drivers/tty/serial/samsung.c

s3c24xx_serial_probe

  uart_add_one_port(&s3c24xx_uart_drv, &ourport->port);//s3c24xx_uart_drv的cons成员就是提供串口写操作的函数

    uart_configure_port

      register_console(port->cons);//同上面其他内核分析的,会把cons保存在console_drivers这个console链表上,其就是个链表头,根据它可以找到多个cons,这里的cons就是上面s3c24xx_uart_drv的cons,在uart_add_one_port中赋的值

3.printk
    vprintk
        /* Emit the output into the temporary buffer */
        // 先把输出信息放入临时BUFFER
        vscnprintf

        // Copy the output into log_buf.
        // 把临时BUFFER里的数据稍作处理,再写入log_buf(处理打印级别,给无打印级别的添加默认打印级别 )
        // 比如printk("abc")会得到"<4>abc", 再写入log_buf
        // 可以用dmesg命令把log_buf里的数据打印出来重现内核的输出信息

        // 调用硬件的write函数输出,3.4.2内核是console_unlock函数
        release_console_sem();或者console_unlock
            call_console_drivers(_con_start, _log_end);
                // 从log_buf得到数据,算出打印级别
                _call_console_drivers(start_print, cur_index, msg_level); //通过drivers的“s”看出可以打印到多个设备,在uboot环境变量中设置多个console=
                    // 如果可以级别够格打印
                    if ((msg_log_level < console_loglevel
                          __call_console_drivers
                              con->write(con, &LOG_BUF(start), end - start);

cat  /proc/sys/kernel/printk

7  4  1  7

console_loglevel  default_message_loglevel  minimum_console_loglevel  defaule_console_loglevel

通过“echo  "8 4 1 7"  >  /proc/sys/kernel/printk”来设置

内核文档kernel-parameters.txt有介绍这些环境变量参数,可以设置loglevel=这些环境变量,在uboot的环境变量中设置

24、驱动调试之printk的更多相关文章

  1. 驱动调试(一)-printk

    目录 驱动调试(一)-printk 引入 框架 入口console_setup add_preferred_console register_console s3c24xx_serial_initco ...

  2. printk 驱动调试

    驱动的调试,printk()添加调试信息 printk相当于printf的孪生姐妹,它们一个运行在用户态,另一个则在内核态. 需要包含<linux/device.h>或者<linux ...

  3. Linux驱动设计—— 驱动调试技术

    参考博客与书籍: <Linux设备驱动开发详解> <Linux设备驱动程序> http://blog.chinaunix.net/uid-24219701-id-2884942 ...

  4. 【转】android 电容屏(三):驱动调试之驱动程序分析篇

    关键词:android  电容屏 tp 工作队列 中断 坐点计算  电容屏主要参数平台信息:内核:linux2.6/linux3.0系统:android/android4.0  平台:S5PV310( ...

  5. 【转】Android LCD(四):LCD驱动调试篇

    关键词:android LCD TFTSN75LVDS83B  TTL-LVDS LCD电压背光电压 平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台 ...

  6. 驱动调试(三)oops确定函数PC

    目录 驱动调试(三)oops确定函数PC 什么是oops 流程简述 代码仓库 模块例子分析 找到PC值 判断是否属于模块 查看符号表 找到模块 反汇编模块 内核例子分析 找到PC值 判断是否属于模块 ...

  7. linux驱动调试--修改系统时钟终端来定位僵死问题【转】

    本文转载自:http://blog.chinaunix.net/uid-20671208-id-4940381.html 原文地址:linux驱动调试--修改系统时钟终端来定位僵死问题 作者:枫露清愁 ...

  8. tiny4412 串口驱动分析二 --- printk的实现

    作者:彭东林 邮箱:pengdonglin137@163.com 开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 ...

  9. Android驱动调试利器Busybox之初体验

    工欲善其事必先利其器,之前做WinCE开发时,经常写一些小工具以提高开发调试的效率,如WinCE驱动调试助手.WinCE串口调试助手.WinCE6.0寄存器访问工具.WinCE远程桌面助手和S3C24 ...

随机推荐

  1. centos配置tomcat编辑修改

    https://jingyan.baidu.com/article/6525d4b1382f0aac7d2e9421.html

  2. type---显示指定命令的类型

    type命令用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令. 命令类型: alias:别名. keyword:关键字,Shell保留字. function:函数,Shell函数. bui ...

  3. .Net 程序在自定义位置查找托管/非托管 dll 的几种方法

    原文:.Net 程序在自定义位置查找托管/非托管 dll 的几种方法 一.自定义托管 dll 程序集的查找位置 目前(.Net4.7)能用的有2种: #define DEFAULT_IMPLEMENT ...

  4. Exclusive or

    题目连接 题意: 每次给一个n.求 (2≤n<10500) 分析: 先说一下自己的想法,假设将n换成二进制数,也就一两千位左右,那么一位一位处理是能够接受的. 将0-n写成二进制形式后,显然全部 ...

  5. jquery如何阻止子元素相应mouseout事件

    jquery如何阻止子元素相应mouseout事件:mouseout有一个特点,当鼠标移入子元素的时候,也会触发此事件,但是在实际应用中这个特点往往不是我们想要的,下面就通过代码实例介绍一下如何实现此 ...

  6. 洛谷P3201 [HNOI2009]梦幻布丁

    题目描述 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. 输入输出格式 输入格式: 第 ...

  7. collapse折叠

    基本: <button class="btn btn-primary" data-toggle="collapse" data-target=" ...

  8. http压测工具wrk

    安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持LuaJIT和OpenSSL,不过不用担心,大多数类Unix系统都支持.安装wrk非常简单,只要从github上下载wrk源 ...

  9. C# 解决ListView控件显示数据出现闪屏的问题

    一.发现问题 如果发送数据过快的情况下,ListVies滚屏显示数据时会显示闪屏,如下所示现象: 二.解决问题 根据出现闪屏的情况,在网上查了资料要使用双缓存的办法来处理.其原理是数据在缓存区中进行处 ...

  10. 洛谷 P1104 生日

    P1104 生日 题目描述 cjf君想调查学校OI组每个同学的生日,并按照从大到小的顺序排序.但cjf君最近作业很多,没有时间,所以请你帮她排序. 输入输出格式 输入格式: 有2行, 第1行为OI组总 ...