日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux printk 源码,Printk原理简介

發布時間:2024/9/15 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux printk 源码,Printk原理简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

可變參數操作宏

假設有一段代碼如程序清單 1.3所示:

程序清單?1.3

int printk(const char *fmt, ...)

{

va_list args;

va_start(args, fmt);

i=vsprintf(buf,fmt,args);

va_end(args);

}

va_list類型的定義如程序清單 1.4所示,可見va_list其實就是一個char型指針。

程序清單?1.4

typedef char *va_list;

va_start宏定義如程序清單 1.5所示:

程序清單?1.5

#define __va_rounded_size(TYPE) \

(((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))

#define va_start(AP, LASTARG) \

(AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))

AP表示argument pointer,是參數指針的意思,其實就是va_list類型變量;LASTARG表示last argument,其實就是printk的第一個參數fmt,之所以叫last argument,是因為這個參數是最后一個壓棧的。

__va_rounded_size的作用是按int類型的倍數計算TYPE變量在棧中的大小,假設TYPE變量是5字節大小,則__va_rounded_size(TYPE)值為8,因為每次壓棧的數據大小都是int類型數據大小的倍數。

(char *) &(LASTARG)表示將fmt變量的地址轉為char *指針,這樣加上__va_rounded_size (LASTARG)后的值就是第一個可變參數的地址。如圖 1.2所示:

圖?1.2 va_list args移動示意圖

由此可見,va_start宏的作用就是將指針args跳過fmt參數,指向第一個要解析的可變參數。

va_arg宏定義如程序清單 1.6所示:

程序清單?1.6

#define va_arg(AP, TYPE) \

(AP += __va_rounded_size (TYPE), \

*((TYPE *) (AP - __va_rounded_size (TYPE))))

AP += __va_rounded_size (TYPE),經過這個表達式運算后,args指向了下一個參數;

*((TYPE *) (AP - __va_rounded_size (TYPE)))表示取原來args位置處的變量值,如圖 1.3所示:

圖?1.3 va_arg作用

va_end是一個空的宏。

總結

以上是生活随笔為你收集整理的linux printk 源码,Printk原理简介的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。