2018-05-07(旧文整理)Printk实现流程

一、 初步结论
1.如何把字符串放到缓存,如果从缓存写到串口。
首先是在关中断,关调度,保持logbuf_lock自旋锁的情况下,将数据格式化后,放到printk_buf缓冲区,其大小为1K,也就是说,每次printk只能打印1K的内容。格式化完毕后,将数据再复制到log_buf缓冲区。由于在向串口输出的过程中,会暂时打开自旋锁,所以在SMP下,其他CPU可能继续向log_buf中存放数据,并由驱动输出。简单的说:调用一次printk,需要打印的并不仅仅是本次printk需要输出的内容,还可能有其他CPU上输出的内容。
从缓存中输出到真实的设备是由注册的控制台个数决定的。注册多少个设备,就向多少个设备输出。也就是说,如果注册了两个串口控制台,那么关中断的时间就会增加一倍。
2.采用中断还是轮询。
采用的是轮询方式。

二、 代码流程详细分析
Printk的主要流程由vprintk辅助函数实现。
Vprintk的流程如下:

1. 关抢占。这是因为需要调用smp_processor_id,如果不关调度,并且是在异常或者内核线程中调用printk的话,可能会导致任务飘移到其他CPU,从而导致后续逻辑判断错误。
2. 如果当前上下文是在异常中,那么异常可能是printk引起的,由于后续会使用logbuf_lock自旋锁,为了防止自旋锁嵌套,导致系统死锁,调用zap_locks,复位自旋锁。
3. 关中断,并获得logbuf_lock自旋锁,以保护printk_buf缓冲区,这样即使是在SMP上,printk打印出来的内容都不会交错输出。
4. 将格式化的信息输出到printk_buf缓冲区,并复制到log_buf。
5. 使用down_trylock非阻塞的申请console_sem信号量。视情况进入以下处理流程:
A:如果申请成功,则将log_buf中的内容输出到物理设备上。
B:如果申请失败,则开中断并释放自旋锁,并退出。本次输出到printk_buf缓冲区的内容,由其他printk执行路径输出到物理设备上。所以,某次printk输出到物理设备上的内容,并不一定仅仅是本次传递给printk的内容,还有可能是其他CPU上的printk输出到缓冲区中的内容。

当printk向缓冲区输出申请console_sem信号量成功后,printk会向物理设备输出,在这个过程中,会临时释放自旋锁,以允许其他CPU向缓冲区中输出内容。具体流程如下:

1. 暂时释放logbuf_lock自旋锁,这样,其他CPU可以向log_buf缓冲区中输出数据。
2. 调用release_console_sem向物理设备输出内容。
3. release_console_sem首先在循环执行如下流程:
A:得到当前log_buf缓冲区的起始地址和物理地址。如果没有新的数据,则退出。新的数据可能是其他cpu调用printk输出到缓冲区中的。
B:打开自旋锁,允许其他CPU向缓冲区中输出数据。
C:调用call_console_drivers将当前缓冲区中的内容输出到物理设备。本次输出的内容,不包含释放自旋锁后,其他CPU向缓冲区中输出的内容。
4. 循环结束后,release_console_sem判断本次printk是否确实输出了数据(当printk参数为空串时,可能没有数据),如果有数据数据输出,就唤醒klogd进程。

call_console_drivers函数首先将输出内容按行分拆,并将每行数据传递给当前注册的所有控制台设备,调用控制台驱动将数据打印出来。由于整个过程都处于关中断状态,所以,只要某个注册的控制台驱动是慢速设备,都会影响到关中断的时间。更为严重的是:如果某个CPU在调用printk输出期间,其他CPU也准备向控制台输出,那么其他CPU也会因为申请不到logbuf_lock自旋锁而处于忙等状态。

串口驱动函数:
耗时的过程是向串口等慢速设备输出数据的过程。由于printk可以在中断中使用,所以也决定了驱动不能采用中断方式,而必须是轮询串口的方式。

8250串口驱动回调函数serial8250_console_write实现了控制台write回调。这个函数的流程如下:
1. 首先调用一下NMI软件狗回调函数。看来串口驱动已经意识到慢速设备对系统的影响了。但是这个回调没有办法解决硬件狗的问题。
2. 关中断。
3. 对需要输出的每个字符,回调serial8250_console_putchar函数。
4. 最费时的地方就在serial8250_console_putchar中。它调用wait_for_xmitr(up, UART_LSR_THRE);一句,轮询串口状态。直到串口可写,才向串口输出一个字符。
5. 恢复中断状态。实际上,在printk上下文中,中断此时仍然是关闭的,直到log_buf缓冲区中的所有数据都输出到串口。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,376评论 0 4
  • 操作系统概论 操作系统的概念 操作系统是指控制和管理计算机的软硬件资源,并合理的组织调度计算机的工作和资源的分配,...
    野狗子嗷嗷嗷阅读 11,920评论 3 34
  • 作者 艾米 尽管夏荷和景阳有了肉体上的关系,但不会时时刻刻厮混在一起。 她给景阳一种即若即离的感觉,除了集体上课见...
    zi言字语阅读 756评论 0 0
  • 你别看现在这么多单身狗,很多都在等回不来的人。 最难过的事莫过于你忍了好久不联系对方,不去看他的动态,不想听到他的...
    傲慢的女王阅读 243评论 0 1
  • 蝉魋 墨词君痴 落尽天涯秋痴雨,云端幻蝉嘶月啼。 ---题记 “啊!啊!!!不是...
    墨词君痴阅读 405评论 0 0