久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何理解Linux內核驅動的編碼風格

176次閱讀
沒有評論

共計 3608 個字符,預計需要花費 10 分鐘才能閱讀完成。

本篇文章給大家分享的是有關如何理解 Linux 內核驅動的編碼風格,丸趣 TV 小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著丸趣 TV 小編一起來看看吧。

最近在向 Linux 內核提交一些驅動程序,在提交的過程中,發現自己的代碼離 Linux 內核的 coding  style 要求還是差很多。當初自己對內核文檔里的 CodingStyle 一文只是粗略的瀏覽,真正寫代碼的時候在很多細節上會照顧不周。不過,在不遵守規則的程序員隊   伍里,我并不是孤獨的。如果去看 drivers/staging 下的代碼,就會發現很多驅動程序都沒有嚴格遵守內核的 coding  style,而且在很多驅動程序的 TODO 文件里,都會把”checkpatch.pl  fixes”作為自己的目標之一(checkpatch.pl 是用來檢查代碼是否符合 coding style 的腳本)。

不可否認,coding style 是仁者見仁、智者見智的事情。比如 Microsoft 所推崇的匈牙利命名法,在 Linus 看來就是及其腦殘 (brain  damaged) 的做法。也許您并不贊成 Linus 制定的 coding  style,但在提交內核驅動這件事上,*** 還是以大局為重。對于這么一個龐大的集市式的開發來說,隨意書寫代碼必將帶來嚴重的可維護性的災難。

一些輔助工具

當代碼量達到一定程度時,手動去檢查和修改 coding style 是非常繁瑣的工作,幸好,我們還有一些工具可以使用。

scripts/checkpatch.pl

這是一個檢查代碼是否符合內核編碼規范的的腳本。顧名思義,checkpatch 是用來檢查 patch 的,默認的調用也確實如此。如果用來檢查原文件,需要加上“-f”的選項。

我們來看一段無聊的代碼(文件名為 print_msg.c):

void print_msg(int a) { switch (a) { case 1: printf( a == 1\n  break; case 2: printf( a == 2\n  break; } }

這段代碼的 coding style 是否有問題呢? 用 checkpatch.pl 來檢查一下:

scripts/checkpatch.pl -f print_msg.c

檢查的結果是:

ERROR: switch and case should be at the same indent #3: FILE: switch.c:3: + switch (a) { + case 1: [...] + case 2: total: 1 errors, 0 warnings, 12 lines checked switch.c has style problems, please review. If any of these errors are false positives report them to the maintainer, see CHECKPATCH in MAINTAINERS.

在 Linux 內核的 coding  style 里,switch 和 case 要求有相同的縮進。本例的代碼很少,錯誤也只有這一個,手動修改很方便。如果類似的縮緊錯誤很多怎么辦?

scripts/Lindent

scripts 目錄下的工具 Lindent 可以用來自動修改縮進問題。提醒一下,使用 Lindent 要求系統安裝 indent 這個工具。

對于上面這個例子,執行 Lindent 命令:

scripts/Lindent print_msg.c

得到的新代碼是:

void print_msg(int a) { switch (a) { case 1: printf( a == 1\n  break; case 2: printf( a == 2\n  break; } }

sed

sed 是一個流編輯器,其強大的功能可以幫助我們處理很多重復性的工作。比如,Linux 內核的 coding  style 要求,行尾不能有空格(包括 Tab),去除這些空格就可以借助 sed。

我自己的習慣很差,經常在代碼的行尾留下一些空格。比如一行代碼過長需要換行時,總是下意識的在換行的地方敲一個空格。另外,我常用的編輯器之一的 Kate,為了對齊的需要,經常在空行的前面留上幾個縮進的 Tab(如下圖)。

手動去除這些行尾的空格是一件頭大的事情,但對于 sed 來說不過是舉手之勞。命令格式如下:

sed  lsquo;s/[ \t]*$//g rsquo; your_code.c

一些需要注意的 Coding Style

縮進

1、除了注釋、文檔和 Kconfig 之外,使用 Tab 縮進,而不是空格,并且 Tab 的寬度為 8 個字符;

2、switch hellip; case hellip; 語句中,switch 和 case 具有相同的縮進(參考上文);

花括號

3、花括號的使用參考 K R 風格。

如果是函數,左花括號另起一行:

int function(int x) { body of function }

否則,花括號緊接在語句的 ***:

if (x is true) { we do y }

如果只有一行語句,則不需要用花括號:

if (condition) action();

但是,對于條件語句來說,如果一個分支是一行語句,另一個分支是多行,則需要保持一致,使用花括號:

if (condition) { do_this(); do_that(); } else { otherwise(); }

空格

4、在關鍵字“if, switch, case, for, do, while”之后需要加上空格,如:

if (something)

5、在關鍵字“sizeof, typeof, alignof, or __attribute__”之后不要加空格,如:

sizeof(struct file)

6、在括號里的表達式兩邊不要加空格,比如,下面是一個反面的例子:

sizeof(struct file)

7、大多說的二元和三元運算符兩邊需要空格,如“= + ndash; * / % | ^ = = == != ?  :”;

8、一元運算符后面不要空格,如“* + ndash; ~ ! sizeof typeof alignof __attribute__  defined”;

9、在前綴自增自減運算符之后和后綴自增自減運算符之前不需要空格(“++”和“ndash;”);

10、結構成員運算符 (“.”和“-”) 的兩邊不需要空格;

11、行尾不需要空格;

注釋

12、使用 C89 的“/* hellip; */”風格而不是 C99 的“// hellip;”風格;

13、對于多行注釋,可以參考下例:

/* * This is the preferred style for multi-line * comments in the Linux kernel source code. * Please use it consistently. * * Description: A column of asterisks on the left side, * with beginning and ending almost-blank lines. */

Kconfig

14、“config”定義下面的語句用 Tab 縮進,help 下面的語句再額外縮進兩個空格,如:

config AUDIT bool  Auditing support  depends on NET help Enable auditing infrastructure that can be used with another kernel subsystem, such as SELinux (which requires this for logging of avc messages output). Does not do system-call auditing without CONFIG_AUDITSYSCALL.

15、多行的宏定義需要用“do .. while”封裝,如:

#define macrofun(a, b, c) \ do { \ if (a == 5) \ do_this(b, c); \ } while (0)

函數返回值

16、函數返回值的定義 *** 也要遵循一定的章法。

如果函數的名稱是一種動作或者命令式的語句,應該以錯誤代碼的形式返回(通常是 0 表示成功,-Exxx 這種形式的負數表示錯誤),如:

do_something()

如果函數的名稱是判斷語句,則返回值應該類似與布爾值(通常 1 表示成功,0 表示錯誤),如:

something_is_present()

以上就是如何理解 Linux 內核驅動的編碼風格,丸趣 TV 小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注丸趣 TV 行業資訊頻道。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-25發表,共計3608字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 吉首市| 吉水县| 星子县| 青川县| 和田县| 怀集县| 泽普县| 阳信县| 都匀市| 闽侯县| 水富县| 乌兰浩特市| 驻马店市| 昭苏县| 阳新县| 高台县| 宁波市| 关岭| 永丰县| 巴中市| 磴口县| 探索| 金阳县| 鄂尔多斯市| 饶平县| 长沙市| 南通市| 洛阳市| 郯城县| 东丽区| 浦北县| 新宁县| 崇阳县| 璧山县| 边坝县| 松滋市| 峨边| 伊川县| 年辖:市辖区| 叙永县| 阿拉尔市|