.. SPDX-License-Identifier: GPL-2.0 .. include:: ../disclaimer-zh_TW.rst :Original: :ref:`Documentation/process/4.Coding.rst <development_coding>` :Translator: 時奎亮 Alex Shi <alex.shi@linux.alibaba.com> :æ ¡è¯: å³æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> 胡皓文 Hu Haowen <src.res@email.cn> .. _tw_development_coding: 使代碼æ£ç¢º ====================== é›–ç„¶ä¸€å€‹å …å¯¦çš„ã€é¢å‘社å€çš„è¨è¨ˆéŽç¨‹æœ‰å¾ˆå¤šå€¼å¾—說é“çš„ï¼Œä½†æ˜¯ä»»ä½•å…§æ ¸é–‹ç™¼é …ç›®å·¥ä½œ çš„è‰æ˜Žéƒ½åæ˜ åœ¨ä»£ç¢¼ä¸ã€‚它是將由其他開發人員檢查併åˆä¸¦ï¼ˆæˆ–ä¸åˆä½µï¼‰åˆ°ä¸»ç·šæ¨¹ä¸ 的代碼。所以這段代碼的質é‡æ±ºå®šäº†é …目的最終æˆåŠŸã€‚ 本節將檢查編碼éŽç¨‹ã€‚æˆ‘å€‘å°‡å¾žå…§æ ¸é–‹ç™¼äººå“¡å¸¸çŠ¯çš„å¹¾ç¨®éŒ¯èª¤é–‹å§‹ã€‚ç„¶å¾Œé‡é»žå°‡è½‰ç§» 到æ£ç¢ºçš„åšæ³•å’Œç›¸é—œæœ‰ç”¨çš„工具上。 陷阱 ---- ä»£ç¢¼é¢¨æ ¼ ******** å…§æ ¸é•·æœŸä»¥ä¾†éƒ½æœ‰å…¶æ¨™æº–çš„ä»£ç¢¼é¢¨æ ¼ï¼Œå¦‚ :ref:`Documentation/translations/zh_TW/process/coding-style.rst <tw_codingstyle>` ä¸æ‰€è¿°ã€‚在多數時候,該文檔ä¸æ述的準則至多被èªçˆ²æ˜¯å»ºè°æ€§çš„ã€‚å› æ¤ï¼Œå…§æ ¸ä¸å˜åœ¨ 大é‡ä¸ç¬¦åˆä»£ç¢¼é¢¨æ ¼æº–則的代碼。這種代碼的å˜åœ¨æœƒçµ¦å…§æ ¸é–‹ç™¼äººå“¡å¸¶ä¾†å…©æ–¹é¢çš„å±å®³ã€‚ é¦–å…ˆï¼Œç›¸ä¿¡å…§æ ¸ä»£ç¢¼æ¨™æº–ä¸¦ä¸é‡è¦ï¼Œä¹Ÿä¸å¼·åˆ¶åŸ·è¡Œã€‚但事實上,如果沒有按照標準 ç·¨å¯«ä»£ç¢¼ï¼Œé‚£éº¼æ–°ä»£ç¢¼å°‡å¾ˆé›£åŠ å…¥åˆ°å…§æ ¸ä¸ï¼›è¨±å¤šé–‹ç™¼äººå“¡ç”šè‡³æœƒåœ¨å¯©æŸ¥ä»£ç¢¼ä¹‹å‰è¦æ±‚ å°ä»£ç¢¼é€²è¡Œé‡æ–°æ ¼å¼åŒ–。一個åƒå…§æ ¸é€™éº¼å¤§çš„代碼庫需è¦ä¸€äº›çµ±ä¸€æ ¼å¼çš„代碼,以使 é–‹ç™¼äººå“¡èƒ½å¤ å¿«é€Ÿç†è§£å…¶ä¸çš„任何部分。所以å†ä¹Ÿç¶“ä¸èµ·å¥‡æ€ªæ ¼å¼çš„代碼的折騰了。 å…§æ ¸çš„ä»£ç¢¼é¢¨æ ¼å¶çˆ¾æœƒèˆ‡åƒ±ä¸»çš„å¼·åˆ¶é¢¨æ ¼ç™¼ç”Ÿè¡çªã€‚在這種情æ³ä¸‹ï¼Œå¿…é ˆåœ¨ä»£ç¢¼åˆä½µ 之å‰éµå¾žå…§æ ¸ä»£ç¢¼é¢¨æ ¼ã€‚å°‡ä»£ç¢¼æ”¾å…¥å…§æ ¸æ„味著以多種方å¼æ”¾æ£„一定程度的控制權—— 包括控制代碼樣å¼ã€‚ å¦ä¸€å€‹å±å®³æ˜¯èªçˆ²å·²ç¶“åœ¨å…§æ ¸ä¸çš„代碼迫切需è¦ä¿®å¾©ä»£ç¢¼æ¨£å¼ã€‚開發者å¯èƒ½æœƒé–‹å§‹ç·¨å¯« é‡æ–°æ ¼å¼åŒ–補ä¸ï¼Œä½œçˆ²ç†Ÿæ‚‰é–‹ç™¼éŽç¨‹çš„一種方å¼ï¼Œæˆ–者作爲將其åå—å¯«å…¥å…§æ ¸è®Šæ›´æ—¥èªŒ 的一種方å¼ï¼Œæˆ–è€…å…©è€…å…¼è€Œæœ‰ä¹‹ã€‚ä½†æ˜¯ç´”ä»£ç¢¼é¢¨æ ¼çš„ä¿®å¾©è¢«é–‹ç™¼ç¤¾å€è¦–爲噪音,它們往 å¾€å—到冷é‡ã€‚å› æ¤ï¼Œæœ€å¥½é¿å…編寫這種類型的補ä¸ã€‚åœ¨ç”±æ–¼å…¶ä»–åŽŸå› è™•ç†ä¸€æ®µä»£ç¢¼çš„ åŒæ™‚é †å¸¶ä¿®å¾©å…¶æ¨£å¼æ˜¯å¾ˆè‡ªç„¶çš„,但是ä¸æ‡‰è©²åƒ…爲了更改代碼樣å¼è€Œæ›´æ”¹ä¹‹ã€‚ ä»£ç¢¼é¢¨æ ¼æ–‡æª”ä¹Ÿä¸æ‡‰è©²è¢«è¦–爲絕å°ä¸å¯é•åçš„è¦å‰‡ã€‚å¦‚æžœæœ‰ä¸€å€‹è¶³å¤ çš„ç†ç”±åå°é€™ç¨® 樣å¼ï¼ˆä¾‹å¦‚爲了80列é™åˆ¶æ‹†åˆ†è¡Œæœƒå°Žè‡´å¯è®€æ€§å¤§å¤§é™ä½Žï¼‰ï¼Œé‚£éº¼å°±é€™æ¨£åšå§ã€‚ 注æ„您還å¯ä»¥ä½¿ç”¨ ``clang-format`` 工具來幫助您處ç†é€™äº›è¦å‰‡ï¼Œå¿«é€Ÿè‡ªå‹•é‡æ–°æ ¼å¼ 化部分代碼,和審閱完整的文件以發ç¾ä»£ç¢¼æ¨£å¼éŒ¯èª¤ã€æ‹¼å¯«éŒ¯èª¤å’Œå¯èƒ½çš„改進。它還 å¯ä»¥æ–¹ä¾¿åœ°æŽ’åº ``#includes`` ã€å°é½Šè®Šé‡/å®ã€é‡æŽ’文本和其他類似任務。有關詳細 ä¿¡æ¯ï¼Œè«‹åƒé–±æ–‡æª” :ref:`Documentation/process/clang-format.rst <clangformat>` 抽象層 ****** 計算機科å¸æ•™æŽˆæ•™å¸ç”Ÿä»¥éˆæ´»æ€§å’Œä¿¡æ¯éš±è—çš„åç¾©å»£æ³›ä½¿ç”¨æŠ½è±¡å±¤ã€‚ç•¶ç„¶ï¼Œå…§æ ¸å»£æ³› 地使用了抽象;任何涉åŠæ•¸ç™¾è¬è¡Œä»£ç¢¼çš„é …ç›®éƒ½å¿…é ˆåšåˆ°é€™ä¸€é»žä»¥å˜çºŒä¸‹ä¾†ã€‚但經驗 表明,éŽåº¦æˆ–éŽæ—©çš„抽象å¯èƒ½å’ŒéŽæ—©çš„優化一樣有害。抽象應用在é©ç•¶å±¤ç´šï¼Œ ä¸è¦éŽåº¦ã€‚ 簡單點,先考慮一個調用時始終åªæœ‰ä¸€å€‹åƒæ•¸ä¸”總爲零的函數。我們å¯ä»¥ä¿ç•™é€™å€‹åƒæ•¸ï¼Œ 以在需è¦ä½¿ç”¨å®ƒæ™‚æ供的é¡å¤–éˆæ´»æ€§ã€‚ä¸éŽï¼Œåœ¨é‚£æ™‚實ç¾äº†é€™å€‹é¡å¤–åƒæ•¸çš„代碼很有 å¯èƒ½ä»¥æŸç¨®å¾žæœªè¢«æ³¨æ„到的微妙方å¼è¢«ç ´å£žâ€”â€”å› çˆ²å®ƒå¾žæœªè¢«ä½¿ç”¨éŽã€‚或者當需è¦é¡å¤– çš„éˆæ´»æ€§æ™‚,它並未以符åˆç¨‹å¼è¨è¨ˆå¸«ç•¶åˆæœŸæœ›çš„æ–¹å¼ä¾†å¯¦ç¾ã€‚å…§æ ¸é–‹ç™¼äººå“¡é€šå¸¸æœƒæ交 補ä¸ä¾†åˆªé™¤æœªä½¿ç”¨çš„åƒæ•¸ï¼›ä¸€èˆ¬ä¾†èªªï¼Œä¸€é–‹å§‹å°±ä¸æ‡‰è©²æ·»åŠ 這些åƒæ•¸ã€‚ éš±è—硬體訪å•çš„抽象層——通常爲了å…許大é‡çš„驅動程åºå…¼å®¹å¤šå€‹ä½œæ¥ç³»çµ±â€”—尤其ä¸å— æ¡è¿Žã€‚這樣的層使代碼變得模糊,å¯èƒ½æœƒé€ æˆæ€§èƒ½æ失;它們ä¸å±¬æ–¼Linuxå…§æ ¸ã€‚ å¦ä¸€æ–¹é¢ï¼Œå¦‚果您發ç¾è‡ªå·±å¾žå¦ä¸€å€‹å…§æ ¸å系統複製了大é‡çš„代碼,那麼是時候 了解一下:是å¦éœ€è¦å°‡é€™äº›ä»£ç¢¼ä¸çš„部分æå–到單ç¨çš„庫ä¸ï¼Œæˆ–者在更高的層次上 實ç¾é€™äº›åŠŸèƒ½ã€‚åœ¨æ•´å€‹å…§æ ¸ä¸è¤‡è£½ç›¸åŒçš„代碼沒有價值。 #ifdef å’Œé è™•ç† *************** Cé 處ç†å™¨ä¼¼ä¹Žçµ¦ä¸€äº›C程å¼è¨è¨ˆå¸«å¸¶ä¾†äº†å¼·å¤§çš„誘惑,他們èªçˆ²å®ƒæ˜¯ä¸€ç¨®å°‡å¤§é‡éˆæ´»æ€§åŠ å…¥ 原始碼ä¸çš„方法。但是é 處ç†å™¨ä¸æ˜¯C,大é‡ä½¿ç”¨å®ƒæœƒå°Žè‡´ä»£ç¢¼å°å…¶ä»–人來說更難閱讀, å°ç·¨è¯å™¨ä¾†èªªæ›´é›£æª¢æŸ¥æ£ç¢ºæ€§ã€‚使用了大é‡é 處ç†å™¨å¹¾ä¹Žç¸½æ˜¯ä»£ç¢¼éœ€è¦ä¸€äº› 清ç†å·¥ä½œçš„標誌。 使用#ifdefçš„æ¢ä»¶ç·¨è¯å¯¦éš›ä¸Šæ˜¯ä¸€å€‹å¼·å¤§çš„åŠŸèƒ½ï¼Œå®ƒåœ¨å…§æ ¸ä¸ä½¿ç”¨ã€‚但是很少有人希望 看到代碼被鋪滿#ifdef塊。一般è¦å®šï¼Œifdef的使用應儘å¯èƒ½é™åˆ¶åœ¨é 文件ä¸ã€‚æ¢ä»¶ ç·¨è¯ä»£ç¢¼å¯ä»¥é™åˆ¶å‡½æ•¸ï¼Œå¦‚果代碼ä¸å˜åœ¨ï¼Œé€™äº›å‡½æ•¸å°±ç›´æŽ¥è®Šæˆç©ºçš„。然後編è¯å™¨å°‡ 悄悄地優化å°ç©ºå‡½æ•¸çš„èª¿ç”¨ã€‚ä½¿å¾—ä»£ç¢¼æ›´åŠ æ¸…æ™°ï¼Œæ›´å®¹æ˜“ç†è§£ã€‚ Cé 處ç†å™¨å®å˜åœ¨è¨±å¤šå±éšªæ€§ï¼ŒåŒ…括å¯èƒ½å°å…·æœ‰å‰¯ä½œç”¨ä¸”沒有類型安全的表é”å¼é€²è¡Œå¤š é‡è©•ä¼°ã€‚如果您試圖定義å®ï¼Œè«‹è€ƒæ…®å‰µå»ºä¸€å€‹å…§è¯å‡½æ•¸æ›¿ä»£ã€‚çµæžœç›¸åŒçš„ä»£ç¢¼ï¼Œå…§è¯ å‡½æ•¸æ›´å®¹æ˜“é–±è®€ï¼Œä¸æœƒå¤šæ¬¡è¨ˆç®—å…¶åƒæ•¸ï¼Œä¸¦ä¸”å…許編è¯å™¨å°åƒæ•¸å’Œè¿”回值執行類型檢查。 å…§è¯å‡½æ•¸ ******** ä¸éŽï¼Œå…§è¯å‡½æ•¸æœ¬èº«ä¹Ÿå˜åœ¨é¢¨éšªã€‚程å¼è¨è¨ˆå¸«å¯ä»¥å‚¾å¿ƒæ–¼é¿å…函數調用和用內è¯å‡½æ•¸å¡«å……æº æ–‡ä»¶æ‰€å›ºæœ‰çš„æ•ˆçŽ‡ã€‚ç„¶è€Œï¼Œé€™äº›åŠŸèƒ½å¯¦éš›ä¸Šæœƒé™ä½Žæ€§èƒ½ã€‚å› çˆ²å®ƒå€‘çš„ä»£ç¢¼åœ¨æ¯å€‹èª¿ç”¨ç«™ 點都被複製一éï¼Œæ‰€ä»¥æœ€çµ‚æœƒå¢žåŠ ç·¨è¯å…§æ ¸çš„大å°ã€‚æ¤å¤–,這也å°è™•ç†å™¨çš„å…§å˜ç·©å˜ é€ æˆå£“力,從而大大é™ä½ŽåŸ·è¡Œé€Ÿåº¦ã€‚通常內è¯å‡½æ•¸æ‡‰è©²éžå¸¸å°ï¼Œè€Œä¸”相å°è¼ƒå°‘。畢竟 函數調用的æˆæœ¬ä¸¦ä¸é«˜ï¼›å¤§é‡å‰µå»ºå…§è¯å‡½æ•¸æ˜¯éŽæ—©å„ªåŒ–的典型例å。 ä¸€èˆ¬ä¾†èªªï¼Œå…§æ ¸ç¨‹å¼è¨è¨ˆå¸«æœƒè‡ªå†’風險忽略緩å˜æ•ˆæžœã€‚在數據çµæ§‹èª²ç¨‹é–‹é ä¸çš„經典 時間/空間權衡通常ä¸é©ç”¨æ–¼ç•¶ä»£ç¡¬é«”。空間 *就是* æ™‚é–“ï¼Œå› çˆ²ä¸€å€‹å¤§çš„ç¨‹åºæ¯”一個 更緊湊的程åºé‹è¡Œå¾—慢。 較新的編è¯å™¨è¶Šä¾†è¶Šæ¿€é€²åœ°æ±ºå®šä¸€å€‹çµ¦å®šå‡½æ•¸æ˜¯å¦æ‡‰è©²å…§è¯ã€‚å› æ¤ï¼Œéš¨æ„放置使用 「inlineã€é—œéµå—å¯èƒ½ä¸åƒ…僅是éŽåº¦çš„,也å¯èƒ½æ˜¯ç„¡ç”¨çš„。 鎖 ** 2006å¹´5月,「deviceescapeã€ç¶²çµ¡å †æ£§åœ¨å‰å‘¼å¾Œæ“下以GPL發布,並被ç´å…¥ä¸»ç·šå…§æ ¸ã€‚ 這是一個å—æ¡è¿Žçš„消æ¯ï¼›Linuxä¸å°ç„¡ç·šç¶²çµ¡çš„支æŒå……å…¶é‡è¢«èªçˆ²æ˜¯ä¸åˆæ ¼çš„,而 Deviceescapeå †æ£§æ‰¿è«¾ä¿®å¾©é€™ç¨®æƒ…æ³ã€‚然而直到2007å¹´6月(2.6.22),這段代碼æ‰çœŸ æ£é€²å…¥ä¸»ç·šã€‚發生了什麼? 這段代碼出ç¾äº†è¨±å¤šé–‰é–€é€ 車的跡象。但一個大麻煩是,它並ä¸æ˜¯çˆ²å¤šè™•ç†å™¨ç³»çµ±è€Œ è¨è¨ˆã€‚在åˆä½µé€™å€‹ç¶²çµ¡å †æ£§ï¼ˆç¾åœ¨ç¨±çˆ²mac80211)之å‰ï¼Œéœ€è¦å°å…¶é€²è¡Œä¸€å€‹éŽ–方案的 æ”¹é€ ã€‚ 曾經,Linuxå…§æ ¸ä»£ç¢¼å¯ä»¥åœ¨ä¸è€ƒæ…®å¤šè™•ç†å™¨ç³»çµ±æ‰€å¸¶ä¾†çš„並發性å•é¡Œçš„情æ³ä¸‹é€²è¡Œ 開發。然而ç¾åœ¨ï¼Œé€™å€‹æ–‡æª”å°±æ˜¯åœ¨é›™æ ¸ç†è¨˜æœ¬é›»è…¦ä¸Šå¯«çš„。å³ä½¿åœ¨å–®è™•ç†å™¨ç³»çµ±ä¸Šï¼Œ 爲æ高響應能力所åšçš„工作也會æé«˜å…§æ ¸å…§çš„ä¸¦ç™¼æ€§æ°´å¹³ã€‚ç·¨å¯«å…§æ ¸ä»£ç¢¼è€Œä¸è€ƒæ…®éŽ– çš„æ—¥åæ—©å·²é 去。 å¯ä»¥ç”±å¤šå€‹ç·šç¨‹ä¸¦ç™¼è¨ªå•çš„任何資æºï¼ˆæ•¸æ“šçµæ§‹ã€ç¡¬é«”寄å˜å™¨ç‰ï¼‰å¿…é ˆç”±éŽ–ä¿è·ã€‚æ–° 的代碼應該謹記這一è¦æ±‚ï¼›äº‹å¾Œä¿®æ”¹éŽ–æ˜¯ä¸€é …ç›¸ç•¶å›°é›£çš„ä»»å‹™ã€‚å…§æ ¸é–‹ç™¼äººå“¡æ‡‰è©²èŠ± 時間充分了解å¯ç”¨çš„鎖原語,以便爲工作é¸æ“‡æ£ç¢ºçš„工具。å°ä¸¦ç™¼æ€§ç¼ºä¹é—œæ³¨çš„代碼 很難進入主線。 å›žæ¸ **** 最後一個值得一æçš„å±éšªæ˜¯å›žæ¸ï¼šå®ƒå¯èƒ½æœƒå¼•èµ·å°Žè‡´ç¾æœ‰ç”¨æˆ¶çš„æŸäº›æ±è¥¿ä¸æ–·çš„改變 (這也å¯èƒ½æœƒå¸¶ä¾†å¾ˆå¤§çš„改進)。這種變化被稱爲「回æ¸ã€ï¼Œå›žæ¸å·²ç¶“æˆçˆ²ä¸»ç·šå…§æ ¸ 最ä¸å—æ¡è¿Žçš„å•é¡Œã€‚除了少數例外情æ³ï¼Œå¦‚果回æ¸ä¸èƒ½åŠæ™‚ä¿®æ£ï¼Œæœƒå°Žè‡´å›žæ¸çš„修改 將被å–消。最好首先é¿å…回æ¸ç™¼ç”Ÿã€‚ 人們常常çˆè«–,如果回æ¸å¸¶ä¾†çš„功能é 超éŽç”¢ç”Ÿçš„å•é¡Œï¼Œé‚£éº¼å›žæ¸æ˜¯å¦çˆ²å¯æŽ¥å—的。 å¦‚æžœå®ƒç ´å£žäº†ä¸€å€‹ç³»çµ±å»çˆ²å個系統帶來新的功能,爲何ä¸æ”¹æ”¹æ…‹åº¦å‘¢ï¼Ÿ2007å¹´7月, Linuså°é€™å€‹å•é¡Œçµ¦å‡ºäº†æœ€ä½³ç”案: :: 所以我們ä¸æœƒé€šéŽå¼•å…¥æ–°å•é¡Œä¾†ä¿®å¾©éŒ¯èª¤ã€‚這種方å¼æ˜¯é ä¸ä½çš„ï¼Œæ²’äººçŸ¥é“ æ˜¯å¦çœŸçš„有進展。是å‰é€²å…©æ¥ã€å¾Œé€€ä¸€æ¥ï¼Œé‚„是å‰é€²ä¸€æ¥ã€å¾Œé€€å…©æ¥ï¼Ÿ (http://lwn.net/Articles/243460/) 特別ä¸å—æ¡è¿Žçš„一種回æ¸é¡žåž‹æ˜¯ç”¨æˆ¶ç©ºé–“ABI的任何變化。一旦接å£è¢«å°Žå‡ºåˆ°ç”¨æˆ¶ç©ºé–“, å°±å¿…é ˆç„¡é™æœŸåœ°æ”¯æŒå®ƒã€‚這一事實使得用戶空間接å£çš„å‰µå»ºç‰¹åˆ¥å…·æœ‰æŒ‘æˆ°æ€§ï¼šå› çˆ²å®ƒå€‘ ä¸èƒ½ä»¥ä¸å…¼å®¹çš„æ–¹å¼é€²è¡Œæ›´æ”¹ï¼Œæ‰€ä»¥å¿…é ˆä¸€æ¬¡å°±å°ã€‚å› æ¤ï¼Œç”¨æˆ¶ç©ºé–“接å£ç¸½æ˜¯éœ€è¦å¤§é‡ çš„æ€è€ƒã€æ¸…晰的文檔和廣泛的審查。 代碼檢查工具 ------------ 至少目å‰ï¼Œç·¨å¯«ç„¡éŒ¯èª¤ä»£ç¢¼ä»ç„¶æ˜¯æˆ‘們ä¸å¾ˆå°‘人能é”到的ç†æƒ³ç‹€æ…‹ã€‚ä¸éŽï¼Œæˆ‘å€‘å¸Œæœ›åš çš„æ˜¯ï¼Œåœ¨ä»£ç¢¼é€²å…¥ä¸»ç·šå…§æ ¸ä¹‹å‰ï¼Œå„˜å¯èƒ½å¤šåœ°æ•ç²ä¸¦ä¿®å¾©é€™äº›éŒ¯èª¤ã€‚爲æ¤ï¼Œå…§æ ¸é–‹ç™¼äºº 員已經æ供了一系列令人å°è±¡æ·±åˆ»çš„工具,å¯ä»¥è‡ªå‹•æ•ç²å„種å„樣的隱è—å•é¡Œã€‚計算機 發ç¾çš„任何å•é¡Œéƒ½æ˜¯ä¸€å€‹ä»¥å¾Œä¸æœƒå›°æ“¾ç”¨æˆ¶çš„å•é¡Œï¼Œå› æ¤ï¼Œåªè¦æœ‰å¯èƒ½ï¼Œå°±æ‡‰è©²ä½¿ç”¨ 自動化工具。 第一æ¥æ˜¯æ³¨æ„ç·¨è¯å™¨ç”¢ç”Ÿçš„è¦å‘Šã€‚當å‰ç‰ˆæœ¬çš„GCCå¯ä»¥æª¢æ¸¬ï¼ˆä¸¦è¦å‘Šï¼‰å¤§é‡æ½›åœ¨éŒ¯èª¤ã€‚ 通常,這些è¦å‘Šéƒ½æŒ‡å‘真æ£çš„å•é¡Œã€‚æ交以供審閱的代碼一般ä¸æœƒç”¢ç”Ÿä»»ä½•ç·¨è¯å™¨è¦å‘Šã€‚ 在消除è¦å‘Šæ™‚,注æ„了解真æ£çš„åŽŸå› ï¼Œä¸¦å„˜é‡é¿å…僅「修復ã€ä½¿è¦å‘Šæ¶ˆå¤±è€Œä¸è§£æ±ºå…¶åŽŸå› 。 請注æ„,並éžæ‰€æœ‰ç·¨è¯å™¨è¦å‘Šéƒ½é»˜èªå•“用。使用「make KCFLAGS=-Wã€æ§‹å»ºå…§æ ¸ä»¥ ç²å¾—完整集åˆã€‚ å…§æ ¸æ供了幾個é…ç½®é¸é …,å¯ä»¥æ‰“開調試功能;大多數é…ç½®é¸é …ä½æ–¼ã€Œkernel hacking〠åèœå–®ä¸ã€‚å°æ–¼ä»»ä½•ç”¨æ–¼é–‹ç™¼æˆ–æ¸¬è©¦ç›®çš„çš„å…§æ ¸ï¼Œéƒ½æ‡‰è©²å•“ç”¨å…¶ä¸å¹¾å€‹é¸é …。特別是, 您應該打開: - FRAME_WARN ç²å–大於給定數é‡çš„å †æ£§å¹€çš„è¦å‘Šã€‚ 這些è¦å‘Šç”Ÿæˆçš„輸出å¯èƒ½æ¯”較冗長,但您ä¸å¿…æ“”å¿ƒä¾†è‡ªå…§æ ¸å…¶ä»–éƒ¨åˆ†çš„è¦å‘Šã€‚ - DEBUG_OBJECTS å°‡æ·»åŠ ä»£ç¢¼ä»¥è·Ÿè¹¤å…§æ ¸å‰µå»ºçš„å„種å°è±¡çš„生命周期,並在出ç¾å•é¡Œ 時發出è¦å‘Šã€‚å¦‚æžœä½ è¦æ·»åŠ 創建(和導出)關於其自己的複雜å°è±¡çš„å系統,請 考慮打開å°è±¡èª¿è©¦åŸºç¤Žçµæ§‹çš„支æŒã€‚ - DEBUG_SLAB å¯ä»¥ç™¼ç¾å„種內å˜åˆ†é…å’Œä½¿ç”¨éŒ¯èª¤ï¼›å®ƒæ‡‰è©²ç”¨æ–¼å¤§å¤šæ•¸é–‹ç™¼å…§æ ¸ã€‚ - DEBUG_SPINLOCK, DEBUG_ATOMIC_SLEEP å’Œ DEBUG_MUTEXES 會發ç¾è¨±å¤šå¸¸è¦‹çš„ 鎖錯誤。 還有很多其他調試é¸é …,其ä¸ä¸€äº›å°‡åœ¨ä¸‹é¢è¨Žè«–。其ä¸ä¸€äº›æœ‰é¡¯è‘—的性能影響,ä¸æ‡‰ 一直使用。在å¸ç¿’å¯ç”¨é¸é …上花費一些時間,å¯èƒ½æœƒåœ¨çŸæœŸå…§å¾—åˆ°è¨±å¤šå›žå ±ã€‚ å…¶ä¸ä¸€å€‹è¼ƒé‡çš„調試工具是鎖檢查器或「lockdepã€ã€‚該工具將跟蹤系統ä¸æ¯å€‹éŽ– (spinlock或mutex)的ç²å–和釋放ã€ç²å–鎖的相å°é †åºã€ç•¶å‰ä¸æ–·ç’°å¢ƒç‰ç‰ã€‚然後, 它å¯ä»¥ç¢ºä¿ç¸½æ˜¯ä»¥ç›¸åŒçš„é †åºç²å–鎖,相åŒçš„ä¸æ–·å‡è¨é©ç”¨æ–¼æ‰€æœ‰æƒ…æ³ç‰ç‰ã€‚æ›å¥è©± 說,lockdepå¯ä»¥æ‰¾åˆ°è¨±å¤šå°Žè‡´ç³»çµ±æ»éŽ–çš„å ´æ™¯ã€‚åœ¨éƒ¨ç½²çš„ç³»çµ±ä¸ï¼Œé€™ç¨®å•é¡Œå¯èƒ½æœƒ 很痛苦(å°æ–¼é–‹ç™¼äººå“¡å’Œç”¨æˆ¶è€Œè¨€ï¼‰ï¼›LockDepå…許æå‰ä»¥è‡ªå‹•æ–¹å¼ç™¼ç¾å•é¡Œã€‚具有 任何類型的éžæ™®é€šéŽ–的代碼在æ交åˆä½µå‰æ‡‰åœ¨å•“用lockdep的情æ³ä¸‹é‹è¡Œæ¸¬è©¦ã€‚ ä½œçˆ²ä¸€å€‹å‹¤å¥®çš„å…§æ ¸ç¨‹å¼è¨è¨ˆå¸«ï¼Œæ¯«ç„¡ç–‘å•ï¼Œæ‚¨å°‡æª¢æŸ¥ä»»ä½•å¯èƒ½å¤±æ•—çš„æ“作(如內å˜åˆ†é…) 的返回狀態。然而,事實上,最終的故障復ç¾è·¯å¾‘å¯èƒ½å®Œå…¨æ²’有經éŽæ¸¬è©¦ã€‚未測試的 代碼往往會出å•é¡Œï¼›å¦‚果所有這些錯誤處ç†è·¯å¾‘都被執行了幾次,那麼您å¯èƒ½å°ä»£ç¢¼ 更有信心。 å…§æ ¸æ供了一個å¯ä»¥åšåˆ°é€™ä¸€é»žçš„錯誤注入框架,特別是在涉åŠå…§å˜åˆ†é…的情æ³ä¸‹ã€‚ 啓用故障注入後,內å˜åˆ†é…çš„å¯é…置失敗的百分比;這些失敗å¯ä»¥é™å®šåœ¨ç‰¹å®šçš„代碼 範åœå…§ã€‚在啓用了故障注入的情æ³ä¸‹é‹è¡Œï¼Œç¨‹å¼è¨è¨ˆå¸«å¯ä»¥çœ‹åˆ°ç•¶æƒ…æ³æƒ¡åŒ–時代碼如何響 應。有關如何使用æ¤å·¥å…·çš„詳細信æ¯ï¼Œè«‹åƒé–± Documentation/fault-injection/fault-injection.rst。 「sparseã€éœæ…‹åˆ†æžå·¥å…·å¯ä»¥ç™¼ç¾å…¶ä»–類型的錯誤。sparseå¯ä»¥è¦å‘Šç¨‹å¼è¨è¨ˆå¸«ç”¨æˆ¶ç©ºé–“ å’Œå…§æ ¸ç©ºé–“åœ°å€ä¹‹é–“çš„æ··æ·†ã€å¤§ç«¯åºèˆ‡å°ç«¯åºçš„æ··æ·†ã€åœ¨éœ€è¦ä¸€çµ„ä½æ¨™èªŒçš„åœ°æ–¹å‚³éž æ•´æ•¸å€¼ç‰ç‰ã€‚sparseå¿…é ˆå–®ç¨å®‰è£(如果您的分發伺æœå™¨æ²’有將其打包, å¯ä»¥åœ¨ https://sparse.wiki.kernel.org/index.php/Main_page 找到), 然後å¯ä»¥é€šéŽåœ¨make命令ä¸æ·»åŠ 「C=1ã€åœ¨ä»£ç¢¼ä¸Šé‹è¡Œå®ƒã€‚ 「Coccinelleã€å·¥å…· :ref:`http://coccinelle.lip6.fr/ <devtools_coccinelle>` èƒ½å¤ ç™¼ç¾å„種潛在的編碼å•é¡Œï¼›å®ƒé‚„å¯ä»¥çˆ²é€™äº›å•é¡Œæ出修複方案。在 scripts/coccinelleç›®éŒ„ä¸‹å·²ç¶“æ‰“åŒ…äº†ç›¸ç•¶å¤šçš„å…§æ ¸ã€Œèªžç¾©è£œä¸ã€ï¼›é‹è¡Œ 「make coccicheckã€å°‡é‹è¡Œé€™äº›èªžç¾©è£œä¸ä¸¦å ±å‘Šç™¼ç¾çš„任何å•é¡Œã€‚有關詳細信æ¯ï¼Œè«‹åƒé–± :ref:`Documentation/dev-tools/coccinelle.rst <devtools_coccinelle>` 其他類型的å¯ç§»æ¤æ€§éŒ¯èª¤æœ€å¥½é€šéŽçˆ²å…¶ä»–體系çµæ§‹ç·¨è¯ä»£ç¢¼ä¾†ç™¼ç¾ã€‚如果沒有S/390系統 或Blackfin開發æ¿ï¼Œæ‚¨ä»ç„¶å¯ä»¥åŸ·è¡Œç·¨è¯æ¥é©Ÿã€‚å¯ä»¥åœ¨ä»¥ä¸‹ä½ç½®æ‰¾åˆ°ä¸€å¤§å †ç”¨æ–¼x86系統的 交å‰ç·¨è¯å™¨ï¼š https://www.kernel.org/pub/tools/crosstool/ 花一些時間安è£å’Œä½¿ç”¨é€™äº›ç·¨è¯å™¨å°‡æœ‰åŠ©æ–¼é¿å…以後的尷尬。 文檔 ---- æ–‡æª”é€šå¸¸æ¯”å…§æ ¸é–‹ç™¼è¦å‰‡æ›´çˆ²ä¾‹å¤–。å³ä¾¿å¦‚æ¤ï¼Œè¶³å¤ 的文檔將有助於簡化將新代碼åˆä½µ åˆ°å…§æ ¸ä¸çš„éŽç¨‹ï¼Œä½¿å…¶ä»–開發人員的生活更輕鬆,並å°æ‚¨çš„ç”¨æˆ¶æœ‰æ‰€å¹«åŠ©ã€‚åœ¨è¨±å¤šæƒ…æ³ ä¸‹ï¼Œæ·»åŠ æ–‡æª”å·²åŸºæœ¬ä¸Šæ˜¯å¼·åˆ¶æ€§çš„ã€‚ 任何補ä¸çš„第一個文檔是其關è¯çš„變更日誌。日誌æ¢ç›®æ‡‰è©²æè¿°æ£åœ¨è§£æ±ºçš„å•é¡Œã€è§£æ±º 方案的形å¼ã€è™•ç†è£œä¸çš„人員ã€å°æ€§èƒ½çš„任何相關影響,以åŠç†è§£è£œä¸å¯èƒ½éœ€è¦çš„任何 其他內容。確ä¿è®Šæ›´æ—¥èªŒèªªæ˜Žäº†*爲什麼*補ä¸å€¼å¾—應用;大é‡é–‹ç™¼è€…未能æ供這些信æ¯ã€‚ ä»»ä½•æ·»åŠ æ–°ç”¨æˆ¶ç©ºé–“æŽ¥å£çš„代碼——包括新的sysfs或/proc文件——都應該包å«è©²æŽ¥å£ çš„æ–‡æª”ï¼Œè©²æ–‡æª”ä½¿ç”¨æˆ¶ç©ºé–“é–‹ç™¼äººå“¡èƒ½å¤ çŸ¥é“他們在使用什麼。請åƒé–± Documentation/ABI/README,了解如何æ¤æ–‡æª”æ ¼å¼ä»¥åŠéœ€è¦æ供哪些信æ¯ã€‚ 文檔 :ref:`Documentation/admin-guide/kernel-parameters.rst <kernelparameters>` æè¿°äº†å…§æ ¸çš„æ‰€æœ‰å¼•å°Žæ™‚é–“åƒæ•¸ã€‚ä»»ä½•æ·»åŠ æ–°åƒæ•¸çš„補ä¸éƒ½æ‡‰è©²å‘è©²æ–‡æª”æ·»åŠ é©ç•¶çš„ æ¢ç›®ã€‚ 任何新的é…ç½®é¸é …éƒ½å¿…é ˆé™„æœ‰å¹«åŠ©æ–‡æœ¬ï¼Œå¹«åŠ©æ–‡æœ¬éœ€æ¸…æ¥šåœ°è§£é‡‹é€™äº›é¸é …以åŠç”¨æˆ¶å¯èƒ½ 希望何時使用它們。 許多å系統的內部APIä¿¡æ¯é€šéŽå°ˆé–€æ ¼å¼åŒ–的注釋進行記錄;這些注釋å¯ä»¥é€šéŽ 「kernel-docã€è…³æœ¬ä»¥å¤šç¨®æ–¹å¼æå–å’Œæ ¼å¼åŒ–。如果您在具有kerneldoc注釋的åç³»çµ±ä¸ å·¥ä½œï¼Œå‰‡æ‡‰è©²ç¶è·å®ƒå€‘ï¼Œä¸¦æ ¹æ“šéœ€è¦çˆ²å¤–部å¯ç”¨çš„åŠŸèƒ½æ·»åŠ å®ƒå€‘ã€‚å³ä½¿åœ¨æ²’有如æ¤è¨˜éŒ„ çš„é ˜åŸŸä¸ï¼Œçˆ²å°‡ä¾†æ·»åŠ kerneldoc注釋也沒有壞處;實際上,這å°æ–¼å‰›é–‹å§‹é–‹ç™¼å…§æ ¸çš„人 ä¾†èªªæ˜¯ä¸€å€‹æœ‰ç”¨çš„æ´»å‹•ã€‚é€™äº›æ³¨é‡‹çš„æ ¼å¼ä»¥åŠå¦‚何創建kerneldoc模æ¿çš„一些信æ¯å¯ä»¥åœ¨ :ref:`Documentation/doc-guide/ <doc_guide>` 上找到。 任何閱讀大é‡ç¾æœ‰å…§æ ¸ä»£ç¢¼çš„人都會注æ„到,注釋的缺失往往是最值得注æ„的。åŒæ™‚, å°æ–°ä»£ç¢¼çš„è¦æ±‚比éŽåŽ»æ›´é«˜ï¼›åˆä½µæœªæ³¨é‡‹çš„ä»£ç¢¼å°‡æ›´åŠ å›°é›£ã€‚é€™å°±æ˜¯èªªï¼Œäººå€‘ä¸¦ä¸æœŸæœ› 詳細注釋的代碼。代碼本身應該是自解釋的,注釋闡釋了更微妙的方é¢ã€‚ æŸäº›äº‹æƒ…應該總是被注釋。使用內å˜å±éšœæ™‚,應附上一行文å—,解釋爲什麼需è¦è¨ç½®å…§å˜ å±éšœã€‚數據çµæ§‹çš„鎖è¦å‰‡é€šå¸¸éœ€è¦åœ¨æŸå€‹åœ°æ–¹è§£é‡‹ã€‚一般來說,主è¦æ•¸æ“šçµæ§‹éœ€è¦å…¨é¢ 的文檔。應該指出代碼ä¸åˆ†ç«‹çš„ä½ä¹‹é–“ä¸æ˜Žé¡¯çš„ä¾è³´æ€§ã€‚任何å¯èƒ½èª˜ä½¿ä»£ç¢¼ç®¡ç†äººé€²è¡Œ 錯誤的「清ç†ã€çš„事情都需è¦ä¸€å€‹æ³¨é‡‹ä¾†èªªæ˜Žçˆ²ä»€éº¼è¦é€™æ¨£åšã€‚ç‰ç‰ã€‚ 內部API更改 ----------- å…§æ ¸æ供給用戶空間的二進ä½æŽ¥å£ä¸èƒ½è¢«ç ´å£žï¼Œé™¤éžé€¼ä¸å¾—å·²ã€‚è€Œå…§æ ¸çš„å…§éƒ¨ç·¨ç¨‹æŽ¥å£ æ˜¯é«˜åº¦æµå‹•çš„,當需è¦æ™‚å¯ä»¥æ›´æ”¹ã€‚å¦‚æžœä½ ç™¼ç¾è‡ªå·±ä¸å¾—ä¸è™•ç†ä¸€å€‹å…§æ ¸API,或者僅 åƒ…å› çˆ²å®ƒä¸æ»¿è¶³ä½ 的需求導致無法使用特定的功能,這å¯èƒ½æ˜¯API需è¦æ”¹è®Šçš„一個標誌。 ä½œçˆ²å…§æ ¸é–‹ç™¼äººå“¡ï¼Œæ‚¨æœ‰æ¬Šé€²è¡Œæ¤é¡žæ›´æ”¹ã€‚ 的確å¯ä»¥é€²è¡ŒAPIæ›´æ”¹ï¼Œä½†æ›´æ”¹å¿…é ˆæ˜¯åˆç†çš„ã€‚å› æ¤ä»»ä½•é€²è¡Œå…§éƒ¨API更改的補ä¸éƒ½æ‡‰è©² 附帶關於更改內容和必è¦åŽŸå› çš„æ述。這種變化也應該拆分æˆä¸€å€‹å–®ç¨çš„補ä¸ï¼Œè€Œä¸æ˜¯ 埋在一個更大的補ä¸ä¸ã€‚ å¦ä¸€å€‹è¦é»žæ˜¯ï¼Œæ›´æ”¹å…§éƒ¨API的開發人員通常è¦è² è²¬ä¿®å¾©å…§æ ¸æ¨¹ä¸è¢«æ›´æ”¹ç ´å£žçš„任何代碼。 å°æ–¼ä¸€å€‹å»£æ³›ä½¿ç”¨çš„函數,這個責任å¯ä»¥å°Žè‡´æˆç™¾ä¸Šåƒçš„變化,其ä¸è¨±å¤šè®ŠåŒ–å¯èƒ½èˆ‡å…¶ä»– 開發人員æ£åœ¨åšçš„工作相è¡çªã€‚ä¸ç”¨èªªï¼Œé€™å¯èƒ½æ˜¯ä¸€é …大工程,所以最好確ä¿ç†ç”±æ˜¯ å¯é 的。請注æ„,coccinelle工具å¯ä»¥å¹«åŠ©é€²è¡Œå»£æ³›çš„API更改。 在進行ä¸å…¼å®¹çš„API更改時,應儘å¯èƒ½ç¢ºä¿ç·¨è¯å™¨æ•ç²æœªæ›´æ–°çš„代碼。這將幫助您確ä¿æ‰¾ 到該接å£çš„樹內用處。它還將è¦å‘Šé–‹ç™¼äººå“¡æ¨¹å¤–代碼å˜åœ¨ä»–們需è¦éŸ¿æ‡‰çš„更改。支æŒæ¨¹å¤– 代碼ä¸æ˜¯å…§æ ¸é–‹ç™¼äººå“¡éœ€è¦æ“”心的事情,但是我們也ä¸å¿…使樹外開發人員的生活有ä¸å¿…è¦ çš„å›°é›£ã€‚