0
点赞
收藏
分享

微信扫一扫

综合能力训练:在树莓派上动手写一个小OS(4):实验16-3:实现printk函数

忆北文学摄影爱好员 2022-03-11 阅读 16
linux

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

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

举报

相关推荐

0 条评论