printk流程简介及kernel串口log打印流程整理
2013-09-23 23:30
459 查看
一.printk函数简介
1.printk简介
printk是在内核中运行的向控制台输出显示的函数,Linux内核首先在内核空间分配一个静态缓冲区,作为显示用的空间,然后调用sprintf,格式化显示字符串,最后调用tty_write向终端进行信息的显示2.printk函数定义
asmlinkage int printk(const char *fmt, ...) { va_list args; int r; #ifdef CONFIG_KGDB_KDB if (unlikely(kdb_trap_printk)) { va_start(args, fmt); r = vkdb_printf(fmt, args); va_end(args); return r; } #endif va_start(args, fmt); r = vprintk_emit(0, -1, NULL, 0, fmt, args); va_end(args); return r; }
其中asmlinkage表示将函数参数存放在局部栈中,va_start和va_end是获取可变参数的方法,该方法读取可变参数的过程其实就是在堆栈中,使用指针,遍历堆栈段中的参数列表,从低地址到高地址一个一个地把参数内容读出来的过程.
3.vprintk_emit流程
从流程中看vprintk_emit函数调用了console_unlock将log通过串口进行输出的
4、console_unlock函数调用流程如下
而con->write就是串口的写函数,它会调用具体的平台串口写函数,将数据写入串口buff中;
二、设置相应串口为调试串口
芯片平台一般会有好几个串口,具体采用哪个串口做为调试串口在uboot或者lk中可以设定,并通过cmdline来告知kernel,kernel在启动时会对cmdline进行解析,根据cmdline的解析结果,调用串口注册函数,对相应的串口进行注册,其相关流程如下:注意selected_console是个全局变量,串口进行初始化注册时会用到这个全局变量
串口初始化流程如下
regiister_console函数流程如下
从上述流程中可以看出,使用哪个串口做为调试串口,其实就是uboot或者lk发送cmdline知会kernel,kernel使用全局变量selected_console进行标记的
相关文章推荐
- printk流程简介及kernel串口log打印流程整理
- linux下判断 串口是否通讯 最简单方法 和android kernel实时打印log方法
- 添加串口打印信息 && 串口工具使用中出现的问题 && printk改造
- printk打印log过多会导致performance下降
- OSAL串口接收发送数据流程简介
- CC2530 串口打印log
- MTK串口简单流程整理
- 串口打印Uncompressing Linux..... done, booting the kernel后不再打印
- powerPC P2020 uboot引导kernel 串口没有打印信息啦,
- 串口LOG 单编kernel
- adb如何打印kernel输出log
- 接收到无线数据串口打印流程
- uboot和kernel修改打印串口
- /proc/sys/kernel/printk 控制log的输出
- linux系统连接串口工具打印log
- 查看android kernel打印的log
- linux内核打印数据到串口控制台,printk数据不打印问题
- Android Java层,Native层,Lib层打印Log简介
- rk3288之释放打印log的串口