綜合能力訓練:在樹莓派上動手寫一個小OS(4):實驗16-3:實現printk函式

rlk8888發表於2022-03-18

本文節選自《實驗指導手冊》第二版第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][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”, 
612)

是用6當做輸出寬度,相當於:

printf(“%
6d”, 
12);

(4)    修飾型別

這裡表示修飾變數的型別。
修飾型別    含義

  • hh    單個位元組

  • h    short

  • l    long

  • ll    long long

為了檢驗printk函式的列印效果,我們希望讀者能列印BenOS的映象檔案中各個段的起始地址、結束地址和大小等資訊。

另外,我們也可以做其他一些測試。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70005277/viewspace-2872526/,如需轉載,請註明出處,否則將追究法律責任。

相關文章