本文节选自《实验指导手册》第二版第16.5章
实验指导手册是奔跑吧Linux内核入门篇第二版配套实验书,pdf版本已经release,可以免费下载和自由打印!
下载方法:
登陆“奔跑吧linux社区”微信公众号,输入“奔跑吧2”获取下载地址。
本文是《奔跑吧Linux内核 入门篇》第16章中的实验16-3:实现printk打印函数。前面的实验,我们直接使用串口函数来打印,非常不方便。我们在实现BenOS其他功能之前,还需要需要实现一个简单好用的打印函数,这样我们可以通过串口来打印需要的数据类型,方便我们后面的调试工作。
1.实验目的
了解printk()函数的实现。
2.实验要求
我们在实验16-1中实现了串口输出,本实验将实现printk()函数以格式化输出。
3.实验详解
本实验的主要目的是实现printk打印函数。
参考代码在lib/printk.c文件里,读者可以自行实现。
Printk函数类似C语言的printf函数,需要实现如下方面的格式要求。
首先看一下,printf是在头文件stdio.h中声明的:
int printk( const char *format, … );
第一个参数就是输出格式,这是一个字符串,里面可以用%的形式表示一个占位符,这个%处的内容会被后面的参数替换。
%占位符的格式是这样的 方括号里的[]表示可选
%flags.prectype
(1) 格式字符type
Printk函数应该支持如下这些格式字符。
格式字符 含义
i或者d 输出有符号的十进制整数
u 输出无符号的十进制整数
x/x 输出十六进制数
o 输出八进制数
p 输出指针类型
c 输出一个字符
s 输出一个字符串
(2) 控制符flags
控制符 含义
- 实现被显示数据的左对齐
- 显示数字的正负号
当格式字符是 o、x、X 时,增加前缀0x
0 使用零 填充字段宽度
(3) 域宽width与精度prec
width指明了输出的宽度,prec表示小数点位数。
另外,这里的字符数width可以用*,表示用下一个参数作为宽度。
例如
printf(“%*d”, 6, 12)
是用6当做输出宽度,相当于:
printf(“%6d”, 12);
(4) 修饰类型
这里表示修饰变量的类型。
修饰类型 含义
hh 单个字节
h short
l long
ll long long
为了检验printk函数的打印效果,我们希望读者能打印BenOS的镜像文件中各个段的起始地址、结束地址和大小等信息。
另外,我们也可以做其他一些测试。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。