printk
printk相当于printf的孪生姐妹,她们一个运行在用户态的,另一个则在内核态被人们所熟知的。
但是根据不同的操作系统也会有不一样的效果,例如编写一个hello word 内核模块,使用这个函数不一定会将内容显示到终端上,
但是一定在内核缓冲区里,可以使用dmesg查看效果。
printk是在内核中运行的向控制台输出显示的函数,Linux内核首先在内核空间分配一个静态缓冲区,作为显示用的空间,
然后调用sprintf,格式化显示字符串,最后调用tty_write向终端进行信息的显示。
printk与printf的差异,是什么导致一个运行在内核态而另一个运行用户态?
其实这两个函数几乎是相同的,出现这种差异是因为tty_write函数需要使用fs指向的被显示的字符串,而fs是专门用于存放用户态段选择符的,
因此,在内核态时,为了配合tty_write函数,printk会把fs修改为内核态数据段选择符ds中的值,这样才能正确指向内核的数据缓冲区,
当然这个操作会先对fs进行压栈保存,调用tty_write完毕后再出栈恢复。总结说来,printk与printf的差异是由fs造成的,所以差异也是围绕对fs的处理。

浙公网安备 33010602011771号