溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux內(nèi)核源代碼編程的規(guī)范有哪些

發(fā)布時間:2022-02-24 16:09:56 來源:億速云 閱讀:146 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Linux內(nèi)核源代碼編程的規(guī)范有哪些”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Linux內(nèi)核源代碼編程的規(guī)范有哪些”文章能幫助大家解決問題。

1.強烈推薦單行的寬度為八十列。

任何一行超過八十列寬度的語句都應(yīng)該拆分成多個行,除非超過八十列的部分可以提高可讀性且不會隱藏信息。但是,千萬不要把用戶可見的字符串,比如 printk 的信息,拆分成多行,因為這樣會導(dǎo)致使用 grep 的時候找不到這些信息。

2.關(guān)于大括號

c語言里的if,do, while, for語句都會使用到大括號,內(nèi)核代碼傾向于把左括號放在行末,把右括號放在行首,并且大括號和前面的語句,以及if和后面的語句,都保留一個空格。

3.關(guān)于空格

這個還是單獨列出來說明一下吧,因為內(nèi)核代碼里用到空格的地方太多了。

Linux 內(nèi)核風(fēng)格的空格主要用在一些關(guān)鍵字上,即在關(guān)鍵字之后添一個空格。值得關(guān)注的例外是一些長得像函數(shù)的關(guān)鍵字,比如:sizeof, typeof, alignof, attribute,在 Linux 中,這些關(guān)鍵字的使用都會帶上一對括號,比如sizeof(int)。

所以在下面這些關(guān)鍵字后面需要添加一個空格:

if, switch, case, for, do, while

但是, sizeof, typeof, alignof, attribute 之后則不需要添加空格:

s = sizeof(struct file);

在聲明指針或者返回值為指針的函數(shù)時,星號的位置應(yīng)該緊靠著變量名或函數(shù)名,而不是類型名,例如:

char linux_banner; unsigned long long memparse(char ptr, char *retptr); char match_strdup(substring_t *s);

在二元操作符和三元操作符周圍添加一個空格,例如:

=  +  -  <  >  *  /  %  |  &  ^  <=  >=  ==  !=  ?  :

但是不要在一元操作符之后添加空格:

&  *  +  -  ~  !  sizeof  typeof  alignof  attribute  defined

4.變量命名

C 是一種簡潔粗曠的語言,因此,你的命名也應(yīng)該是簡潔的。linux內(nèi)核里的變量定義應(yīng)該盡可能簡單,在不產(chǎn)生歧義的情況下,越簡單越好??梢杂孟聞澗€,但是絕對不推薦使用大寫字母。所以,內(nèi)核里的變量和函數(shù)定義不要使用駝峰命名法。

5.函數(shù)

函數(shù)應(yīng)該短小精悍,一個函數(shù)只干一件事。幾百行代碼組成一個函數(shù)是不被推薦的。

關(guān)鍵函數(shù)的前面最好留有注釋。

6.注釋

多行注釋推薦格式如下:

/*

  • To support ISA shared interrupts, we need to have one interrupt

  • handler that ensures that the IRQ line has been deasserted

  • before returning.  Failing to do this will result in the IRQ

  • line being stuck active, and, since ISA irqs are edge triggered,

  • no more IRQs will be seen. */

7.推薦使用函數(shù)自注釋

所謂函數(shù)自注釋,就是從你的函數(shù)名就可以猜到你要干什么,比如內(nèi)核的:

wait_event(), wait_event_interruptible(), wait_event_interruptible_timeout()等。

注意,寫代碼不只是寫給現(xiàn)在的自己,也是寫給以后的自己,也是寫給其他人看的。如果你回看你一年前寫的代碼都很陌生,那說明你的代碼規(guī)范是有問題的。

8.常量宏和枚舉的命名都是大寫的

9.打印內(nèi)核或者驅(qū)動信息

編寫好的調(diào)試信息是一項巨大的挑戰(zhàn),一旦你完成了,這些信息會對遠程調(diào)試產(chǎn)生巨大幫助

很多子系統(tǒng)在對應(yīng)的 makefile 里都有 Kconfig 調(diào)試選項來打開 -DDEBUG,或者是在文件里定義宏 #define DEBUG。當(dāng)調(diào)試信息可以被無條件打印,或者說已經(jīng)編譯了和調(diào)試有關(guān)的 #ifdef 段,那么 printk(KERN_DEBUG ...) 就可以用來打印調(diào)試信息。

10.內(nèi)聯(lián)函數(shù)(inline)

Inline關(guān)鍵字會讓編譯器將指定的函數(shù)體插入并取代每一處調(diào)用該函數(shù)的地方(上下文),從而節(jié)省了每次調(diào)用函數(shù)帶來的額外時間開支。然而,inline 關(guān)鍵字的泛濫,會使內(nèi)核變大,從而使整個系統(tǒng)運行速度變慢,因為大內(nèi)核會占用更多的CPU高速緩存,同時會導(dǎo)致可用內(nèi)存頁緩存減少。想象一下,一次頁緩存未命中就會導(dǎo)致一次磁盤尋址,這至少耗費5毫秒。5毫秒足夠CPU運行很多很多的指令。

關(guān)于“Linux內(nèi)核源代碼編程的規(guī)范有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI