本文是《奔跑吧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][width][.prec][hlL]type
(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的镜像文件中各个段的起始地址、结束地址和大小等信息。
另外,我们也可以做其他一些测试。