这一次看一下printk。之前在其他地方看到过printk,当时看到的printk是把打印方式转到了串口上。刚刚看到的内核代码中出现了这个函数,接下来看看这个函数的实现。
我看到的函数调用是在这里,用到很多次。接下来,看看这个函数的实现。
本身的功能不用说,肯定是类似printf的。这里,先利用vsprintf做了一个格式转换,接着是调用了终端打印函数console_print。看起来,这个会是这个函数实现的关键。
函数的实现看上去简单,涉及到了一段汇编。从内容看,应该是对显示内存的直接操作。这里面,有涉及到了两个小函数的调用,分别是回车和换行。
这个设计倒是有意思,函数参数没用到,函数进行了变量的操作。相应的变量其实是宏,而不是变量,具体定义:
其实是对这个量的一个操作,而这个应该应该有一个跟硬件的地址的绑定关系。这样的操作通常会是在初始化的部分做。
从注释看,这里的主要工作是初始化中断,其他的都不做。一些显示处理需要参考setup.s的汇编代码。也好理解,系统启动过程其实还是有一些显示信息要处理的。清屏等也需要调用tty_write来实现。看起来,继续往下看,这个会是一个很庞大的信息了。不过,可以大概联想到这里的实现方式。我继续往下看的话,暂时了解下这个屏幕刷新我觉得基本上这部分就可以结束了。暂时,我并不想与过多的硬件纠缠。
屏幕的刷新,应该是这个地方做的控制。
相关的调用存在于终端初始化的函数调用中,也在tty的处理中,tty应该是关键接口。
而这部分在键盘处理汇编代码中触发,应该是在键盘的信息中断中做的处理。
最后,看看console.c代码文件的大概功能,顺便就直接跳过这份代码文件了。
其实,我这些疑惑看看这个文件的注释基本就可以得到解答。这个文件实现的主要功能是终端IO,而且支持一些图像以及显卡的操作。应该是别人贡献的,而linus做了一个集成汇总。也不容易,还能够工作并发展壮大到现在!