本文节选自《实验指导手册》第二版第16.5章
实验指导手册是奔跑吧Linux内核入门篇第二版配套实验书,pdf版本已经release,可以免费下载和自由打印!
下载方法:
登陆“奔跑吧linux社区”微信公众号,输入“奔跑吧2”获取下载地址。

本文是《奔跑吧Linux内核 入门篇》第16章中的实验16-3:实现printk打印函数。前面的实验,我们直接使用串口函数来打印,非常不方便。我们在实现BenOS其他功能之前,还需要需要实现一个简单好用的打印函数,这样我们可以通过串口来打印需要的数据类型,方便我们后面的调试工作。

20220404_121635_023.jpg
20220404_121635_024.jpg

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的镜像文件中各个段的起始地址、结束地址和大小等信息。

640.png

另外,我们也可以做其他一些测试。

20220404_121635_025.jpg


奔跑吧Linux社区
4 声望4 粉丝

奔跑吧Linux社区,为广大小伙伴布道Linux开源!


引用和评论

0 条评论