Based on kernel version 2.6.26. Page generated on 2008-07-16 21:13 EST.
1 Chinese translated version of Documentation/CodingStyle 2 3 If you have any comment or update to the content, please post to LKML directly. 4 However, if you have problem communicating in English you can also ask the 5 Chinese maintainer for help. Contact the Chinese maintainer, if this 6 translation is outdated or there is problem with translation. 7 8 Chinese maintainer: Zhang Le <r0bertz[AT]gentoo[DOT]org> 9 --------------------------------------------------------------------- 10 Documentation/CodingStyleçä¸æç¿»è¯ 11 12 妿æ³è¯è®ºææ´æ°æ¬æçå 容ï¼è¯·ç´æ¥åä¿¡å°LKMLãå¦æä½ ä½¿ç¨è±æäº¤æµæå°é¾çè¯ï¼ä¹å¯ 13 以å䏿çç»´æ¤è æ±å©ã妿æ¬ç¿»è¯æ´æ°ä¸åæ¶æè ç¿»è¯åå¨é®é¢ï¼è¯·èç³»ä¸æçç»´æ¤è ã 14 15 䏿çç»´æ¤è ï¼ å¼ ä¹ Zhang Le <r0bertz[AT]gentoo[DOT]org> 16 䏿çç¿»è¯è ï¼ å¼ ä¹ Zhang Le <r0bertz[AT]gentoo[DOT]org> 17 ä¸æçæ ¡è¯è ï¼ çèª Wang Cong <xiyou.wangcong[AT]gmail[DOT]com> 18 wheelz <kernel.zeng[AT]gmail[DOT]com> 19 管æä¸ Xudong Guan <xudong.guan[AT]gmail[DOT]com> 20 Li Zefan <lizf[AT]cn.fujitsu[DOT]com> 21 Wang Chen <wangchen[AT]cn.fujitsu[DOT]com> 22 以ä¸ä¸ºæ£æ 23 --------------------------------------------------------------------- 24 25 Linuxå æ ¸ä»£ç 飿 ¼ 26 27 è¿æ¯ä¸ä¸ªç®ççææ¡£ï¼æè¿°äºlinuxå æ ¸çé¦é代ç 飿 ¼ã代ç 飿 ¼æ¯å 人èå¼çï¼è䏿 28 䏿¿æææçè§ç¹å¼ºå ç»ä»»ä½äººï¼ä¸è¿è¿éæè®²è¿°çæ¯æå¿ é¡»è¦ç»´æ¤çä»£ç æéµå®ç飿 ¼ï¼ 29 并䏿ä¹å¸æç»å¤§å¤æ°å ¶ä»ä»£ç ä¹è½éµå®è¿ä¸ªé£æ ¼ã请å¨åä»£ç æ¶è³å°èèä¸ä¸æ¬ææè¿°ç 30 飿 ¼ã 31 32 é¦å ï¼æå»ºè®®ä½ æå°ä¸ä»½GNU代ç è§èï¼ç¶åä¸è¦è¯»å®ãç§äºå®ï¼è¿æ¯ä¸ä¸ªå ·æéå¤§è±¡å¾æ§ 33 æä¹çå¨ä½ã 34 35 ä¸ç®¡ææ ·ï¼ç°å¨æä»¬å¼å§ï¼ 36 37 38 第ä¸ç« ï¼ç¼©è¿ 39 40 å¶è¡¨ç¬¦æ¯8个åç¬¦ï¼æä»¥ç¼©è¿ä¹æ¯8个å符ãæäºå¼ç«¯è¿å¨è¯å¾å°ç¼©è¿å为4ï¼ä¹è³2ï¼ä¸ªå符 41 æ·±ï¼è¿å ä¹ç¸å½äºå°è¯å°åå¨ççå¼å®ä¹ä¸º3ã 42 43 çç±ï¼ç¼©è¿çå ¨é¨æä¹å°±å¨äºæ¸ æ¥çå®ä¹ä¸ä¸ªæ§å¶åèµ·æ¢äºä½å¤ãå°¤å ¶æ¯å½ä½ ç¯çä½ çå±å¹ 44 è¿ç»çäº20å°æ¶ä¹åï¼ä½ å°ä¼åç°å¤§ä¸ç¹ç缩è¿ä¼ä½¿ä½ æ´å®¹æå辨缩è¿ã 45 46 ç°å¨ï¼æäºäººä¼æ±æ¨8个å符ç缩è¿ä¼ä½¿ä»£ç åå³è¾¹ç§»å¨ç太è¿ï¼å¨80个å符çç»ç«¯å±å¹ä¸ 47 å°±å¾é¾è¯»è¿æ ·ç代ç ãè¿ä¸ªé®é¢ççæ¡æ¯ï¼å¦æä½ éè¦3级以ä¸ç缩è¿ï¼ä¸ç®¡ç¨ä½ç§æ¹å¼ä½ 48 ç代ç å·²ç»æé®é¢äºï¼åºè¯¥ä¿®æ£ä½ çç¨åºã 49 50 ç®èè¨ä¹ï¼8个å符ç缩è¿å¯ä»¥è®©ä»£ç æ´å®¹æé 读ï¼è¿æä¸ä¸ªå¥½å¤æ¯å½ä½ ç彿°åµå¥å¤ªæ·±ç 51 æ¶åå¯ä»¥ç»ä½ è¦åãçå¿è¿ä¸ªè¦åã 52 53 å¨switchè¯å¥ä¸æ¶é¤å¤çº§ç¼©è¿çé¦éçæ¹å¼æ¯è®©âswitchâåä»å±äºå®çâcaseâæ ç¾å¯¹é½äºå 54 ä¸åï¼èä¸è¦â两次缩è¿ââcaseâæ ç¾ãæ¯å¦ï¼ 55 56 switch (suffix) { 57 case 'G': 58 case 'g': 59 mem <<= 30; 60 break; 61 case 'M': 62 case 'm': 63 mem <<= 20; 64 break; 65 case 'K': 66 case 'k': 67 mem <<= 10; 68 /* fall through */ 69 default: 70 break; 71 } 72 73 74 ä¸è¦æå¤ä¸ªè¯å¥æ¾å¨ä¸è¡éï¼é¤éä½ æä»ä¹ä¸è¥¿è¦éèï¼ 75 76 if (condition) do_this; 77 do_something_everytime; 78 79 ä¹ä¸è¦å¨ä¸è¡éæ¾å¤ä¸ªèµå¼è¯å¥ãå æ ¸ä»£ç 飿 ¼è¶ 级ç®åãå°±æ¯é¿å å¯è½å¯¼è´å«äººè¯¯è¯»ç表 80 è¾¾å¼ã 81 82 é¤äºæ³¨éãææ¡£åKconfigä¹å¤ï¼ä¸è¦ä½¿ç¨ç©ºæ ¼æ¥ç¼©è¿ï¼åé¢çä¾åæ¯ä¾å¤ï¼æ¯ææä¸ºä¹ã 83 84 éç¨ä¸ä¸ªå¥½çç¼è¾å¨ï¼ä¸è¦å¨è¡å°¾çç©ºæ ¼ã 85 86 87 第äºç« ï¼æé¿çè¡ååç¬¦ä¸²ææ£ 88 89 代ç 飿 ¼çæä¹å°±å¨äºä½¿ç¨å¹³å¸¸ä½¿ç¨çå·¥å ·æ¥ç»´æä»£ç çå¯è¯»æ§åå¯ç»´æ¤æ§ã 90 91 æ¯ä¸è¡çé¿åº¦çéå¶æ¯80åï¼æä»¬å¼ºç建议æ¨éµå®è¿ä¸ªæ¯ä¾ã 92 93 é¿äº80åçè¯å¥è¦ææ£æææä¹ççæ®µãæ¯ä¸ªçæ®µè¦ææ¾çäºåæ¥çè¯å¥ï¼è䏿¾ç½®çä½ç½® 94 乿æ¾çé å³ãåæ ·çè§åä¹éç¨äºæå¾é¿åæ°å表ç彿°å¤´ãé¿å符串ä¹è¦ææ£æè¾çç 95 å符串ãå¯ä¸çä¾å¤æ¯è¶ è¿80åå¯ä»¥å¤§å¹ 度æé«å¯è¯»æ§å¹¶ä¸ä¸ä¼éèä¿¡æ¯çæ åµã 96 97 void fun(int a, int b, int c) 98 { 99 if (condition) 100 printk(KERN_WARNING "Warning this is a long printk with " 101 "3 parameters a: %u b: %u " 102 "c: %u \n", a, b, c); 103 else 104 next_statement; 105 } 106 107 第ä¸ç« ï¼å¤§æ¬å·åç©ºæ ¼çæ¾ç½® 108 109 Cè¯è¨é£æ ¼ä¸å¦å¤ä¸ä¸ªå¸¸è§é®é¢æ¯å¤§æ¬å·çæ¾ç½®ãå缩è¿å¤§å°ä¸åï¼éæ©æå¼ç¨æç§æ¾ç½®ç 110 ç¥å¹¶æ²¡æå¤å°ææ¯ä¸çåå ï¼ä¸è¿é¦éçæ¹å¼ï¼å°±åKernighanåRitchieå±ç¤ºç»æä»¬çï¼æ¯ 111 æèµ·å§å¤§æ¬å·æ¾å¨è¡å°¾ï¼èæç»æå¤§æ¬å·æ¾å¨è¡é¦ï¼æä»¥ï¼ 112 113 if (x is true) { 114 we do y 115 } 116 117 è¿éç¨äºææçé彿°è¯å¥åï¼ifãswitchãforãwhileãdoï¼ãæ¯å¦ï¼ 118 119 switch (action) { 120 case KOBJ_ADD: 121 return "add"; 122 case KOBJ_REMOVE: 123 return "remove"; 124 case KOBJ_CHANGE: 125 return "change"; 126 default: 127 return NULL; 128 } 129 130 ä¸è¿ï¼æä¸ä¸ªä¾å¤ï¼é£å°±æ¯å½æ°ï¼å½æ°çèµ·å§å¤§æ¬å·æ¾ç½®äºä¸ä¸è¡çå¼å¤´ï¼æä»¥ï¼ 131 132 int function(int x) 133 { 134 body of function 135 } 136 137 å ¨ä¸ççå¼ç«¯å¯è½ä¼æ±æ¨è¿ä¸ªä¸ä¸è´æ§æ¯â¦â¦åâ¦â¦ä¸ä¸è´çï¼ä¸è¿æææç»´å¥å ¨ç人é½ç¥éï¼ 138 aï¼K&Ræ¯_æ£ç¡®ç_ï¼å¹¶ä¸ï¼bï¼K&Ræ¯æ£ç¡®çãæ¤å¤ï¼ä¸ç®¡ææ ·å½æ°é½æ¯ç¹æ®çï¼å¨Cè¯è¨ä¸ 139 ï¼å½æ°æ¯ä¸è½åµå¥çï¼ã 140 141 注æç»æå¤§æ¬å·ç¬èªå æ®ä¸è¡ï¼é¤éå®åé¢è·çåä¸ä¸ªè¯å¥çå©ä½é¨åï¼ä¹å°±æ¯doè¯å¥ä¸ç 142 âwhileâæè ifè¯å¥ä¸çâelseâï¼åè¿æ ·ï¼ 143 144 do { 145 body of do-loop 146 } while (condition); 147 148 å 149 150 if (x == y) { 151 .. 152 } else if (x > y) { 153 ... 154 } else { 155 .... 156 } 157 158 çç±ï¼K&Rã 159 160 ä¹è¯·æ³¨æè¿ç§å¤§æ¬å·çæ¾ç½®æ¹å¼ä¹è½ä½¿ç©ºï¼æè å·®ä¸å¤ç©ºçï¼è¡çæ°éæå°åï¼åæ¶ä¸å¤±å¯ 161 读æ§ãå æ¤ï¼ç±äºä½ çå±å¹ä¸çæ°è¡æ¯ä¸å¯åçèµæºï¼æ³æ³25è¡çç»ç«¯å±å¹ï¼ï¼ä½ å°ä¼ææ´ 162 å¤çç©ºè¡æ¥æ¾ç½®æ³¨éã 163 164 å½åªæä¸ä¸ªåç¬çè¯å¥çæ¶åï¼ä¸ç¨å ä¸å¿ è¦ç大æ¬å·ã 165 166 if (condition) 167 action(); 168 169 è¿ç¹ä¸éç¨äºæ¬èº«ä¸ºæä¸ªæ¡ä»¶è¯å¥çä¸ä¸ªåæ¯çåç¬è¯å¥ãè¿æ¶éè¦å¨ä¸¤ä¸ªåæ¯éé½ä½¿ç¨å¤§ 170 æ¬å·ã 171 172 if (condition) { 173 do_this(); 174 do_that(); 175 } else { 176 otherwise(); 177 } 178 179 3.1ï¼ç©ºæ ¼ 180 181 Linuxå æ ¸çç©ºæ ¼ä½¿ç¨æ¹å¼ï¼ä¸»è¦ï¼åå³äºå®æ¯ç¨äºå½æ°è¿æ¯å ³é®åãï¼å¤§å¤æ°ï¼å ³é®åå 182 è¦å ä¸ä¸ªç©ºæ ¼ãå¼å¾æ³¨æçä¾å¤æ¯sizeofãtypeofãalignofå__attribute__ï¼è¿äºå ³é®å 183 æäºç¨åº¦ä¸çèµ·æ¥æ´å彿°ï¼å®ä»¬å¨Linuxéä¹å¸¸å¸¸ä¼´éå°æ¬å·è使ç¨ï¼å°½ç®¡å¨Cè¯è¨éè¿æ · 184 çå°æ¬å·ä¸æ¯å¿ éçï¼å°±åâstruct fileinfo infoâ声æè¿åçâsizeof infoâï¼ã 185 186 æä»¥å¨è¿äºå ³é®åä¹åæ¾ä¸ä¸ªç©ºæ ¼ï¼ 187 if, switch, case, for, do, while 188 使¯ä¸è¦å¨sizeofãtypeofãalignofæè __attribute__è¿äºå ³é®åä¹åæ¾ç©ºæ ¼ãä¾å¦ï¼ 189 s = sizeof(struct file); 190 191 ä¸è¦å¨å°æ¬å·éç表达å¼ä¸¤ä¾§å ç©ºæ ¼ãè¿æ¯ä¸ä¸ªåä¾ï¼ 192 193 s = sizeof( struct file ); 194 195 å½å£°ææéç±»åæè è¿åæéç±»åç彿°æ¶ï¼â*âçé¦éä½¿ç¨æ¹å¼æ¯ä½¿ä¹é è¿åéåæè å½ 196 æ°åï¼è䏿¯é è¿ç±»ååãä¾åï¼ 197 198 char *linux_banner; 199 unsigned long long memparse(char *ptr, char **retptr); 200 char *match_strdup(substring_t *s); 201 202 å¨å¤§å¤æ°äºå åä¸å æä½ç¬¦ä¸¤ä¾§ä½¿ç¨ä¸ä¸ªç©ºæ ¼ï¼ä¾å¦ä¸é¢ææè¿äºæä½ç¬¦ï¼ 203 204 = + - < > * / % | & ^ <= >= == != ? : 205 206 使¯ä¸å æä½ç¬¦åä¸è¦å ç©ºæ ¼ï¼ 207 & * + - ~ ! sizeof typeof alignof __attribute__ defined 208 209 åç¼èªå åèªåä¸å æä½ç¬¦åä¸å ç©ºæ ¼ï¼ 210 ++ -- 211 212 åç¼èªå åèªåä¸å æä½ç¬¦åä¸å ç©ºæ ¼ï¼ 213 ++ -- 214 215 â.âåâ->âç»æä½æåæä½ç¬¦ååä¸å ç©ºæ ¼ã 216 217 ä¸è¦å¨è¡å°¾ç空ç½ãæäºå¯ä»¥èªå¨ç¼©è¿çç¼è¾å¨ä¼å¨æ°è¡çè¡é¦å å ¥ééç空ç½ï¼ç¶åä½ 218 å°±å¯ä»¥ç´æ¥å¨é£ä¸è¡è¾å ¥ä»£ç ãä¸è¿åå¦ä½ æå没æå¨é£ä¸è¡è¾å ¥ä»£ç ï¼æäºç¼è¾å¨å°±ä¸ 219 ä¼ç§»é¤å·²ç»å å ¥ç空ç½ï¼å°±åä½ æ æçä¸ä¸ä¸ªåªæç©ºç½çè¡ãå å«è¡å°¾ç©ºç½çè¡å°±è¿æ ·äº§ 220 çäºã 221 222 å½gitåç°è¡¥ä¸å å«äºè¡å°¾ç©ºç½çæ¶åä¼è¦åä½ ï¼å¹¶ä¸å¯ä»¥åºä½ çè¦æ±å»æè¡å°¾ç©ºç½ï¼ä¸è¿ 223 å¦æä½ æ¯æ£å¨æä¸ç³»åè¡¥ä¸ï¼è¿æ ·åä¼å¯¼è´åé¢çè¡¥ä¸å¤±è´¥ï¼å ä¸ºä½ æ¹åäºè¡¥ä¸çä¸ä¸æã 224 225 226 第åç« ï¼å½å 227 228 Cæ¯ä¸ä¸ªç®æ´çè¯è¨ï¼ä½ çå½åä¹åºè¯¥è¿æ ·ãåModula-2åPascalç¨åºåä¸åï¼Cç¨åºåä¸ä½¿ 229 ç¨ç±»ä¼¼ThisVariableIsATemporaryCounterè¿æ ·å丽çååãCç¨åºåä¼ç§°é£ä¸ªåé为âtmpâ 230 ï¼è¿æ ·åèµ·æ¥ä¼æ´å®¹æï¼èä¸è³å°ä¸ä¼ä»¤å ¶é¾äºçè§£ã 231 232 ä¸è¿ï¼è½ç¶æ··ç¨å¤§å°åçå忝䏿å¡ä½¿ç¨çï¼ä½æ¯å ¨å±åéè¿æ¯éè¦ä¸ä¸ªå ·æè¿°æ§çåå 233 ãç§°ä¸ä¸ªå ¨å±å½æ°ä¸ºâfooâæ¯ä¸ä¸ªé¾ä»¥é¥¶æçé误ã 234 235 å ¨å±åéï¼åªæå½ä½ çæ£éè¦å®ä»¬çæ¶ååç¨å®ï¼éè¦æä¸ä¸ªå ·æè¿°æ§çååï¼å°±åå ¨å±å½ 236 æ°ãå¦æä½ æä¸ä¸ªå¯ä»¥è®¡ç®æ´»å¨ç¨æ·æ°éç彿°ï¼ä½ åºè¯¥å«å®âcount_active_users()âæè 237 类似çååï¼ä½ ä¸åºè¯¥å«å®âcntuser()âã 238 239 å¨å½æ°åä¸å å«å½æ°ç±»åï¼æè°çåçå©å½åæ³ï¼æ¯èååºäºé®é¢ââç¼è¯å¨ç¥éé£äºç±»åè 240 ä¸è½å¤æ£æ¥é£äºç±»åï¼è¿æ ·ååªè½æç¨åºåå¼ç³æ¶äºã龿ªå¾®è½¯æ»æ¯å¶é åºæé®é¢çç¨åºã 241 242 æ¬å°åéååºè¯¥ç®çï¼èä¸è½å¤è¡¨è¾¾ç¸å ³çå«ä¹ãå¦æä½ æä¸äºéæºçæ´æ°åç循ç¯è®¡æ°å¨ 243 ï¼å®åºè¯¥è¢«ç§°ä¸ºâiâãå«å®âloop_counterâå¹¶æ çå¤ï¼å¦æå®æ²¡æè¢«è¯¯è§£çå¯è½çè¯ã类似 244 çï¼âtmpâå¯ä»¥ç¨æ¥ç§°å¼ä»»æç±»åç临æ¶åéã 245 246 å¦æä½ ææ··æ·äºä½ çæ¬å°åéåï¼ä½ å°±éå°å¦ä¸ä¸ªé®é¢äºï¼å«å彿°å¢é¿è·å°è失衡综åç 247 ã请ç第å ç« ï¼å½æ°ï¼ã 248 249 250 第äºç« ï¼Typedef 251 252 ä¸è¦ä½¿ç¨ç±»ä¼¼âvps_tâä¹ç±»çä¸è¥¿ã 253 254 å¯¹ç»æä½åæé使ç¨typedefæ¯ä¸ä¸ªé误ãå½ä½ å¨ä»£ç éçå°ï¼ 255 256 vps_t a; 257 258 è¿ä»£è¡¨ä»ä¹ææå¢ï¼ 259 260 ç¸åï¼å¦ææ¯è¿æ · 261 262 struct virtual_container *a; 263 264 ä½ å°±ç¥éâaâæ¯ä»ä¹äºã 265 266 å¾å¤äººè®¤ä¸ºtypedefâè½æé«å¯è¯»æ§âãå®é 䏿¯è¿æ ·çãå®ä»¬åªå¨ä¸åæ åµä¸æç¨ï¼ 267 268 (a) å®å ¨ä¸éæç对象ï¼è¿ç§æ åµä¸è¦ä¸»å¨ä½¿ç¨typedefæ¥éèè¿ä¸ªå¯¹è±¡å®é 䏿¯ä»ä¹ï¼ã 269 270 ä¾å¦ï¼âpte_tâçä¸éæå¯¹è±¡ï¼ä½ åªè½ç¨åéç访é®å½æ°æ¥è®¿é®å®ä»¬ã 271 272 注æï¼ä¸éææ§åâ访é®å½æ°âæ¬èº«æ¯ä¸å¥½çãæä»¬ä½¿ç¨pte_tçç±»åçåå å¨äºççæ¯ 273 å®å ¨æ²¡æä»»ä½å ±ç¨çå¯è®¿é®ä¿¡æ¯ã 274 275 (b) æ¸ æ¥çæ´æ°ç±»åï¼å¦æ¤ï¼è¿å±æ½è±¡å°±å¯ä»¥å¸®å©æ¶é¤å°åºæ¯âintâè¿æ¯âlongâçæ··æ·ã 276 277 u8/u16/u32æ¯å®å ¨æ²¡æé®é¢çtypedefï¼ä¸è¿å®ä»¬æ´ç¬¦åç±»å«(d)è䏿¯è¿éã 278 279 忬¡æ³¨æï¼è¦è¿æ ·åï¼å¿ é¡»äºåºæå ã妿æä¸ªå鿝âunsigned longâï¼é£ä¹æ²¡æå¿ è¦ 280 281 typedef unsigned long myflags_t; 282 283 ä¸è¿å¦ææä¸ä¸ªæç¡®çåå ï¼æ¯å¦å®å¨æç§æ åµä¸å¯è½ä¼æ¯ä¸ä¸ªâunsigned intâèå¨ 284 å ¶ä»æ åµä¸å¯è½ä¸ºâunsigned longâï¼é£ä¹å°±ä¸è¦ç¹è±«ï¼è¯·å¡å¿ 使ç¨typedefã 285 286 (c) å½ä½ 使ç¨sparseæåé¢çå建ä¸ä¸ªæ°ç±»åæ¥åç±»åæ£æ¥çæ¶åã 287 288 (d) åæ åC99ç±»åç¸åçç±»åï¼å¨æäºä¾å¤çæ åµä¸ã 289 290 è½ç¶è®©ç¼çåèçæ¥éåºæ°çæ åç±»åæ¯å¦âuint32_tâä¸éè¦è±å¾å¤æ¶é´ï¼å¯æ¯æäº 291 人ä»ç¶æç»ä½¿ç¨å®ä»¬ã 292 293 å æ¤ï¼Linuxç¹æççåäºæ åç±»åçâu8/u16/u32/u64âç±»ååå®ä»¬çæç¬¦å·ç±»åæ¯è¢« 294 å 许çââ尽管å¨ä½ èªå·±çæ°ä»£ç ä¸ï¼å®ä»¬ä¸æ¯å¼ºå¶è¦æ±è¦ä½¿ç¨çã 295 296 å½ç¼è¾å·²ç»ä½¿ç¨äºæä¸ªç±»åéçå·²æä»£ç æ¶ï¼ä½ åºè¯¥éµå¾ªé£äºä»£ç ä¸å·²ç»ååºçéæ©ã 297 298 (e) å¯ä»¥å¨ç¨æ·ç©ºé´å®å ¨ä½¿ç¨çç±»åã 299 300 卿äºç¨æ·ç©ºé´å¯è§çç»æä½éï¼æä»¬ä¸è½è¦æ±C99ç±»åèä¸ä¸è½ç¨ä¸é¢æå°çâu32â 301 ç±»åãå æ¤ï¼æä»¬å¨ä¸ç¨æ·ç©ºé´å ±äº«çææç»æä½ä¸ä½¿ç¨__u32å类似çç±»åã 302 303 å¯è½è¿æå ¶ä»çæ åµï¼ä¸è¿åºæ¬çè§åæ¯æ°¸è¿ä¸è¦ä½¿ç¨typedefï¼é¤éä½ å¯ä»¥æç¡®çåºç¨ä¸ 304 è¿°æä¸ªè§åä¸çä¸ä¸ªã 305 306 æ»çæ¥è¯´ï¼å¦æä¸ä¸ªæéæè ä¸ä¸ªç»æä½éçå ç´ å¯ä»¥åççè¢«ç´æ¥è®¿é®å°ï¼é£ä¹å®ä»¬å°±ä¸ 307 åºè¯¥æ¯ä¸ä¸ªtypedefã 308 309 310 第å ç« ï¼å½æ° 311 312 彿°åºè¯¥ç®çèæ¼äº®ï¼å¹¶ä¸åªå®æä¸ä»¶äºæ ã彿°åºè¯¥å¯ä»¥ä¸å±æè 䏤屿¾ç¤ºå®ï¼æä»¬é½ç¥ 313 éISO/ANSIå±å¹å¤§å°æ¯80x24ï¼ï¼åªåä¸ä»¶äºæ ï¼è䏿å®å好ã 314 315 ä¸ä¸ªå½æ°çæå¤§é¿åº¦æ¯åè¯¥å½æ°çå¤æåº¦å缩è¿çº§æ°æåæ¯çãæä»¥ï¼å¦æä½ æä¸ä¸ªçè®ºä¸ 316 å¾ç®åçåªæä¸ä¸ªå¾é¿ï¼ä½æ¯ç®åï¼çcaseè¯å¥ç彿°ï¼èä¸ä½ éè¦å¨æ¯ä¸ªcaseéåå¾å¤å¾ 317 å°çäºæ ï¼è¿æ ·ç彿°å°½ç®¡å¾é¿ï¼ä½ä¹æ¯å¯ä»¥çã 318 319 ä¸è¿ï¼å¦æä½ æä¸ä¸ªå¤æç彿°ï¼èä¸ä½ æçä¸ä¸ªå¤©å䏿¯å¾é«çé«ä¸ä¸å¹´çº§å¦çå¯è½çè³ 320 æä¸æ¸ æ¥è¿ä¸ªå½æ°çç®çï¼ä½ åºè¯¥ä¸¥æ ¼çéµå®å颿å°çé¿åº¦éå¶ã使ç¨è¾ å©å½æ°ï¼å¹¶ä¸ºä¹ 321 åä¸ªå ·æè¿°æ§çååï¼å¦æä½ è§å¾å®ä»¬çæ§è½å¾éè¦çè¯ï¼å¯ä»¥è®©ç¼è¯å¨å èå®ä»¬ï¼è¿æ ·ç 322 ææå¾å¾ä¼æ¯ä½ åä¸ä¸ªå¤æå½æ°çææè¦å¥½ãï¼ 323 324 彿°çå¦å¤ä¸ä¸ªè¡¡éæ 忝æ¬å°åéçæ°éãæ¤æ°éä¸åºè¶ è¿5ï¼10个ï¼å¦åä½ ç彿°å°±æ 325 é®é¢äºãéæ°èèä¸ä¸ä½ ç彿°ï¼æå®åæææ´å°ç彿°ã人ç大èä¸è¬å¯ä»¥è½»æ¾çåæ¶è· 326 踪7个ä¸åçäºç©ï¼å¦æåå¢å¤çè¯ï¼å°±ä¼ç³æ¶äºãå³ä¾¿ä½ èªé¢è¿äººï¼ä½ ä¹å¯è½ä¼è®°ä¸æ¸ ä½ 2 327 个ææååè¿çäºæ ã 328 329 卿ºæä»¶éï¼ä½¿ç¨ç©ºè¡éå¼ä¸åç彿°ãå¦æè¯¥å½æ°éè¦è¢«å¯¼åºï¼å®çEXPORT*å®åºè¯¥ç´§è´´ 330 å¨å®çç»æå¤§æ¬å·ä¹ä¸ãæ¯å¦ï¼ 331 332 int system_is_up(void) 333 { 334 return system_state == SYSTEM_RUNNING; 335 } 336 EXPORT_SYMBOL(system_is_up); 337 338 å¨å½æ°ååä¸ï¼å å«å½æ°ååå®ä»¬çæ°æ®ç±»åãè½ç¶Cè¯è¨é没æè¿æ ·çè¦æ±ï¼å¨Linuxéè¿ 339 æ¯æå¡çåæ³ï¼å ä¸ºè¿æ ·å¯ä»¥å¾ç®åçç»è¯»è æä¾æ´å¤çæä»·å¼çä¿¡æ¯ã 340 341 342 第ä¸ç« ï¼éä¸ç彿°éåºéå¾ 343 344 è½ç¶è¢«æäºäººå£°ç§°å·²ç»è¿æ¶ï¼ä½æ¯gotoè¯å¥ççä»·ç©è¿æ¯ç»å¸¸è¢«ç¼è¯å¨æä½¿ç¨ï¼å ·ä½å½¢å¼æ¯ 345 æ æ¡ä»¶è·³è½¬æä»¤ã 346 347 å½ä¸ä¸ªå½æ°ä»å¤ä¸ªä½ç½®éåºå¹¶ä¸éè¦åä¸äºéç¨çæ¸ çå·¥ä½çæ¶åï¼gotoç好å¤å°±æ¾ç°åºæ¥ 348 äºã 349 350 çç±æ¯ï¼ 351 352 - æ æ¡ä»¶è¯å¥å®¹æçè§£åè·è¸ª 353 - åµå¥ç¨åº¦åå° 354 - å¯ä»¥é¿å ç±äºä¿®æ¹æ¶å¿è®°æ´æ°æä¸ªåç¬çéåºç¹è导è´çé误 355 - åè½»äºç¼è¯å¨çå·¥ä½ï¼æ éå é¤åä½ä»£ç ;) 356 357 int fun(int a) 358 { 359 int result = 0; 360 char *buffer = kmalloc(SIZE); 361 362 if (buffer == NULL) 363 return -ENOMEM; 364 365 if (condition1) { 366 while (loop1) { 367 ... 368 } 369 result = 1; 370 goto out; 371 } 372 ... 373 out: 374 kfree(buffer); 375 return result; 376 } 377 378 ç¬¬å «ç« ï¼æ³¨é 379 380 æ³¨éæ¯å¥½çï¼ä¸è¿æè¿åº¦æ³¨éçå±é©ãæ°¸è¿ä¸è¦å¨æ³¨ééè§£éä½ çä»£ç æ¯å¦ä½è¿ä½çï¼æ´å¥½ 381 çåæ³æ¯è®©å«äººä¸çä½ ç代ç å°±å¯ä»¥æç½ï¼è§£éåçå¾å·®çä»£ç æ¯æµªè´¹æ¶é´ã 382 383 ä¸è¬çï¼ä½ æ³è¦ä½ çæ³¨éåè¯å«äººä½ ç代ç åäºä»ä¹ï¼è䏿¯æä¹åçãä¹è¯·ä½ ä¸è¦ææ³¨é 384 æ¾å¨ä¸ä¸ªå½æ°ä½å é¨ï¼å¦æå½æ°å¤æå°ä½ éè¦ç¬ç«ç注éå ¶ä¸çä¸é¨åï¼ä½ å¾å¯è½éè¦åå° 385 第å ç« çä¸çãä½ å¯ä»¥åä¸äºå°æ³¨éæ¥æ³¨ææè¦åæäºå¾èªæï¼æè æ§½ç³ï¼çåæ³ï¼ä½ä¸è¦ 386 å 太å¤ãä½ åºè¯¥åçï¼æ¯ææ³¨éæ¾å¨å½æ°ç头é¨ï¼åè¯äººä»¬å®åäºä»ä¹ï¼ä¹å¯ä»¥å ä¸å®åè¿ 387 äºäºæ çåå ã 388 389 彿³¨éå æ ¸API彿°æ¶ï¼è¯·ä½¿ç¨kernel-docæ ¼å¼ã请ç 390 Documentation/kernel-doc-nano-HOWTO.txtåscripts/kernel-doc以è·å¾è¯¦ç»ä¿¡æ¯ã 391 392 Linuxçæ³¨é飿 ¼æ¯C89â/* ... */â飿 ¼ãä¸è¦ä½¿ç¨C99飿 ¼â// ...âæ³¨éã 393 394 é¿ï¼å¤è¡ï¼çé¦é注é飿 ¼æ¯ï¼ 395 396 /* 397 * This is the preferred style for multi-line 398 * comments in the Linux kernel source code. 399 * Please use it consistently. 400 * 401 * Description: A column of asterisks on the left side, 402 * with beginning and ending almost-blank lines. 403 */ 404 405 æ³¨éæ°æ®ä¹æ¯å¾éè¦çï¼ä¸ç®¡æ¯åºæ¬ç±»åè¿æ¯è¡çç±»åãä¸ºäºæ¹ä¾¿å®ç°è¿ä¸ç¹ï¼æ¯ä¸è¡åºåª 406 声æä¸ä¸ªæ°æ®ï¼ä¸è¦ä½¿ç¨éå·æ¥ä¸æ¬¡å£°æå¤ä¸ªæ°æ®ï¼ãè¿æ ·ä½ å°±æç©ºé´æ¥ä¸ºæ¯ä¸ªæ°æ®å䏿®µ 407 å°æ³¨éæ¥è§£éå®ä»¬çç¨éäºã 408 409 410 第ä¹ç« ï¼ä½ å·²ç»æäºæ å¼ç³äº 411 412 è¿æ²¡ä»ä¹ï¼æä»¬é½æ¯è¿æ ·ãå¯è½ä½ ç使ç¨äºå¾é¿æ¶é´Unixçæåå·²ç»åè¯ä½ âGNU emacsâè½ 413 èªå¨å¸®ä½ æ ¼å¼åCæºä»£ç ï¼èä¸ä½ 乿³¨æå°äºï¼ç¡®å®æ¯è¿æ ·ï¼ä¸è¿å®æä½¿ç¨çé»è®¤å¼åæä»¬ 414 æ³è¦çç¸å»çè¿ï¼å®é ä¸ï¼çè³æ¯éæºæçè¿è¦å·®ââæ æ°ä¸ªç´åå¨GNU emacséæåæ°¸è¿ä¸ 415 ä¼åé åºä¸ä¸ªå¥½ç¨åºï¼ï¼è¯æ³¨ï¼è¯·åèInfinite Monkey Theoremï¼ 416 417 æä»¥ä½ è¦ä¹æ¾å¼GNU emacsï¼è¦ä¹æ¹åå®è®©å®ä½¿ç¨æ´åçç设å®ãè¦éç¨åä¸ä¸ªæ¹æ¡ï¼ä½ å¯ 418 以æä¸é¢è¿æ®µç²è´´å°ä½ ç.emacsæä»¶éã 419 420 (defun linux-c-mode () 421 "C mode with adjusted defaults for use with the Linux kernel." 422 (interactive) 423 (c-mode) 424 (c-set-style "K&R") 425 (setq tab-width 8) 426 (setq indent-tabs-mode t) 427 (setq c-basic-offset 8)) 428 429 è¿æ ·å°±å®ä¹äºM-x linux-c-modeå½ä»¤ãå½ä½ hackä¸ä¸ªæ¨¡åçæ¶åï¼å¦æä½ æå符串 430 -*- linux-c -*-æ¾å¨å¤´ä¸¤è¡çæä¸ªä½ç½®ï¼è¿ä¸ªæ¨¡å¼å°ä¼è¢«èªå¨è°ç¨ãå¦æä½ å¸æå¨ä½ ä¿®æ¹ 431 /usr/src/linuxéçæä»¶æ¶éæ¯è¬èªå¨æå¼linux-c-modeçè¯ï¼ä½ ä¹å¯è½éè¦æ·»å 432 433 (setq auto-mode-alist (cons '("/usr/src/linux.*/.*\\.[ch]$" . linux-c-mode) 434 auto-mode-alist)) 435 436 å°ä½ ç.emacsæä»¶éã 437 438 ä¸è¿å°±ç®ä½ å°è¯è®©emacsæ£ç¡®çæ ¼å¼å代ç 失败äºï¼ä¹å¹¶ä¸æå³çä½ å¤±å»äºä¸åï¼è¿å¯ä»¥ç¨â 439 indentâã 440 441 ä¸è¿ï¼GNU indent乿åGNU emacs䏿 ·æé®é¢ç设å®ï¼æä»¥ä½ éè¦ç»å®ä¸äºå½ä»¤é项ãä¸ 442 è¿ï¼è¿è¿ä¸ç®å¤ªç³ç³ï¼å ä¸ºå°±ç®æ¯GNU indentçä½è ä¹è®¤åK&Rçæå¨æ§ï¼GNUçäººå¹¶ä¸æ¯å 443 人ï¼ä»ä»¬åªæ¯å¨è¿ä¸ªé®é¢ä¸è¢«ä¸¥éç误导äºï¼ï¼æä»¥ä½ åªè¦ç»indentæå®é项â-kr -i8â 444 ï¼ä»£è¡¨âK&Rï¼8个å符缩è¿âï¼ï¼æè 使ç¨âscripts/Lindentâï¼è¿æ ·å°±å¯ä»¥ä»¥ææ¶é«¦çæ¹å¼ 445 ç¼©è¿æºä»£ç ã 446 447 âindentâæå¾å¤é项ï¼ç¹å«æ¯éæ°æ ¼å¼å注éçæ¶åï¼ä½ å¯è½éè¦çä¸ä¸å®çæå页ãä¸è¿ 448 è®°ä½ï¼âindentâä¸è½ä¿®æ£åçç¼ç¨ä¹ æ¯ã 449 450 451 第åç« ï¼Kconfigé ç½®æä»¶ 452 453 对äºé叿ºç æ çææKconfig*é ç½®æä»¶æ¥è¯´ï¼å®ä»¬ç¼©è¿æ¹å¼ä¸C代ç ç¸æ¯ææä¸åãç´§æ¨ 454 å¨âconfigâå®ä¹ä¸é¢çè¡ç¼©è¿ä¸ä¸ªå¶è¡¨ç¬¦ï¼å¸®å©ä¿¡æ¯ååå¤ç¼©è¿2ä¸ªç©ºæ ¼ãæ¯å¦ï¼ 455 456 config AUDIT 457 bool "Auditing support" 458 depends on NET 459 help 460 Enable auditing infrastructure that can be used with another 461 kernel subsystem, such as SELinux (which requires this for 462 logging of avc messages output). Does not do system-call 463 auditing without CONFIG_AUDITSYSCALL. 464 465 ä»ç¶è¢«è®¤ä¸ºä¸å¤ç¨³å®çåè½åºè¯¥è¢«å®ä¹ä¸ºä¾èµäºâEXPERIMENTALâï¼ 466 467 config SLUB 468 depends on EXPERIMENTAL && !ARCH_USES_SLAB_PAGE_STRUCT 469 bool "SLUB (Unqueued Allocator)" 470 ... 471 472 èé£äºå±é©çåè½ï¼æ¯å¦æäºæä»¶ç³»ç»ç忝æï¼åºè¯¥å¨å®ä»¬çæç¤ºåç¬¦ä¸²éæ¾èç声æè¿ 473 ä¸ç¹ï¼ 474 475 config ADFS_FS_RW 476 bool "ADFS write support (DANGEROUS)" 477 depends on ADFS_FS 478 ... 479 480 è¦æ¥çé ç½®æä»¶ç宿´ææ¡£ï¼è¯·çDocumentation/kbuild/kconfig-language.txtã 481 482 483 第åä¸ç« ï¼æ°æ®ç»æ 484 485 妿ä¸ä¸ªæ°æ®ç»æï¼å¨å建å鿝å®çå线æ§è¡ç¯å¢ä¹å¤å¯è§ï¼é£ä¹å®å¿ é¡»è¦æä¸ä¸ªå¼ç¨è®¡ 486 æ°å¨ãå æ ¸é没æå徿¶éï¼å¹¶ä¸å æ ¸ä¹å¤çå徿¶éæ ¢ä¸æçä½ä¸ï¼ï¼è¿æå³çä½ ç»å¯¹é 487 è¦è®°å½ä½ 对è¿ç§æ°æ®ç»æçä½¿ç¨æ åµã 488 489 å¼ç¨è®¡æ°æå³çä½ è½å¤é¿å ä¸éï¼å¹¶ä¸å 许å¤ä¸ªç¨æ·å¹¶è¡è®¿é®è¿ä¸ªæ°æ®ç»æââèä¸éè¦æ å¿ 490 è¿ä¸ªæ°æ®ç»æä» ä» å ä¸ºææ¶ä¸è¢«ä½¿ç¨å°±æ¶å¤±äºï¼é£äºç¨æ·å¯è½ä¸è¿æ¯æ²ç¡äºä¸éµæè åäºä¸ 491 äºå ¶ä»äºæ èå·²ã 492 493 注æä¸éä¸è½å代å¼ç¨è®¡æ°ãä¸éæ¯ä¸ºäºä¿ææ°æ®ç»æçä¸è´æ§ï¼èå¼ç¨è®¡æ°æ¯ä¸ä¸ªå å管 494 çæå·§ãé常äºè é½éè¦ï¼ä¸è¦æä¸¤ä¸ªææ··äºã 495 496 å¾å¤æ°æ®ç»æå®é 䏿2级å¼ç¨è®¡æ°ï¼å®ä»¬é常æä¸åâç±»âçç¨æ·ãå类计æ°å¨ç»è®¡åç±»ç¨ 497 æ·çæ°éï¼æ¯å½å类计æ°å¨åè³é¶æ¶ï¼å ¨å±è®¡æ°å¨åä¸ã 498 499 è¿ç§âå¤çº§å¼ç¨è®¡æ°âçä¾åå¯ä»¥å¨å å管çï¼âstruct mm_structâï¼mm_usersåmm_countï¼ 500 åæä»¶ç³»ç»ï¼âstruct super_blockâï¼s_countås_activeï¼ä¸æ¾å°ã 501 502 è®°ä½ï¼å¦æå¦ä¸ä¸ªæ§è¡çº¿ç´¢å¯ä»¥æ¾å°ä½ çæ°æ®ç»æï¼ä½æ¯è¿ä¸ªæ°æ®ç»ææ²¡æå¼ç¨è®¡æ°å¨ï¼è¿ 503 éå ä¹è¯å®æ¯ä¸ä¸ªbugã 504 505 506 第åäºç« ï¼å®ï¼æä¸¾åRTL 507 508 ç¨äºå®ä¹å¸¸éçå®çåååæä¸¾éçæ ç¾éè¦å¤§åã 509 510 #define CONSTANT 0x12345 511 512 å¨å®ä¹å 个ç¸å ³çå¸¸éæ¶ï¼æå¥½ç¨æä¸¾ã 513 514 å®çåå请ç¨å¤§å忝ï¼ä¸è¿å½¢å¦å½æ°çå®çååå¯ä»¥ç¨å°å忝ã 515 516 ä¸è¬çï¼å¦æè½åæå è彿°å°±ä¸è¦åæå彿°çå®ã 517 518 嫿å¤ä¸ªè¯å¥çå®åºè¯¥è¢«å å«å¨ä¸ä¸ªdo-while代ç åéï¼ 519 520 #define macrofun(a, b, c) \ 521 do { \ 522 if (a == 5) \ 523 do_this(b, c); \ 524 } while (0) 525 526 使ç¨å®çæ¶ååºé¿å çäºæ ï¼ 527 528 1) 影忧嶿µç¨çå®ï¼ 529 530 #define FOO(x) \ 531 do { \ 532 if (blah(x) < 0) \ 533 return -EBUGGERED; \ 534 } while(0) 535 536 é常ä¸å¥½ãå®çèµ·æ¥åä¸ä¸ªå½æ°ï¼ä¸è¿å´è½å¯¼è´âè°ç¨âå®ç彿°éåºï¼ä¸è¦æä¹±è¯»è 大èé 537 çè¯æ³åæå¨ã 538 539 2) ä¾èµäºä¸ä¸ªåºå®ååçæ¬å°åéçå®ï¼ 540 541 #define FOO(val) bar(index, val) 542 543 å¯è½çèµ·æ¥åæ¯ä¸ªä¸éçä¸è¥¿ï¼ä¸è¿å®é常容ææè¯»ä»£ç ç人æç³æ¶ï¼èä¸å®¹æå¯¼è´çèµ·æ¥ 544 ä¸ç¸å ³çæ¹å¨å¸¦æ¥é误ã 545 546 3) ä½ä¸ºå·¦å¼ç另忰çå®ï¼ FOO(x) = yï¼å¦ææäººæFOOåæä¸ä¸ªå è彿°çè¯ï¼è¿ç§ç¨ 547 æ³å°±ä¼åºéäºã 548 549 4) å¿è®°äºä¼å 级ï¼ä½¿ç¨è¡¨è¾¾å¼å®ä¹å¸¸éçå®å¿ é¡»å°è¡¨è¾¾å¼ç½®äºä¸å¯¹å°æ¬å·ä¹å ã另忰ç 550 å®ä¹è¦æ³¨ææ¤ç±»é®é¢ã 551 552 #define CONSTANT 0x4000 553 #define CONSTEXP (CONSTANT | 3) 554 555 cppæå对å®ç讲解å¾è¯¦ç»ãGcc internalsæåä¹è¯¦ç»è®²è§£äºRTLï¼è¯æ³¨ï¼register 556 transfer languageï¼ï¼å æ ¸éçæ±ç¼è¯è¨ç»å¸¸ç¨å°å®ã 557 558 559 第åä¸ç« ï¼æå°å æ ¸æ¶æ¯ 560 561 å æ ¸å¼åè åºè¯¥æ¯åè¿è¯å¥½æè²çã请ä¸å®æ³¨æå æ ¸ä¿¡æ¯çæ¼åï¼ä»¥ç»äººä»¥å¥½çå°è±¡ãä¸è¦ 562 ç¨ä¸è§èçåè¯æ¯å¦âdontâï¼èè¦ç¨âdo notâæè âdon'tâãä¿è¯è¿äºä¿¡æ¯ç®åãæäºãæ 563 æ§ä¹ã 564 565 å æ ¸ä¿¡æ¯ä¸å¿ 以å¥å·ï¼è¯æ³¨ï¼è±æå¥å·ï¼å³ç¹ï¼ç»æã 566 567 å¨å°æ¬å·éæå°æ°å(%d)没æä»»ä½ä»·å¼ï¼åºè¯¥é¿å è¿æ ·åã 568 569 <linux/device.h>éæä¸äºé©±å¨æ¨¡åè¯æå®ï¼ä½ åºè¯¥ä½¿ç¨å®ä»¬ï¼ä»¥ç¡®ä¿ä¿¡æ¯å¯¹åºäºæ£ç¡®ç 570 设å¤å驱å¨ï¼å¹¶ä¸è¢«æ è®°äºæ£ç¡®çæ¶æ¯çº§å«ãè¿äºå®æï¼dev_err(), dev_warn(), 571 dev_info()ççã对äºé£äºä¸åæä¸ªç¹å®è®¾å¤ç¸å ³è¿çä¿¡æ¯ï¼<linux/kernel.h>å®ä¹äº 572 pr_debug()åpr_info()ã 573 574 ååºå¥½çè°è¯ä¿¡æ¯å¯ä»¥æ¯ä¸ä¸ªå¾å¤§çææï¼å½ä½ ååºæ¥ä¹åï¼è¿äºä¿¡æ¯å¨è¿ç¨é¤éçæ¶å 575 å°±ä¼æä¸ºæå¤§ç帮å©ãå½DEBUGç¬¦å·æ²¡æè¢«å®ä¹çæ¶åï¼è¿äºä¿¡æ¯ä¸åºè¯¥è¢«ç¼è¯è¿å æ ¸é 576 ï¼ä¹å°±æ¯è¯´ï¼é»è®¤å°ï¼å®ä»¬ä¸åºè¯¥è¢«å å«å¨å ï¼ãå¦æä½ ä½¿ç¨dev_dbg()æè pr_debug()ï¼ 577 å°±è½èªå¨è¾¾å°è¿ä¸ªææãå¾å¤åç³»ç»æ¥æKconfigé项æ¥å¯ç¨-DDEBUGãè¿æä¸ä¸ªç¸å ³çæ¯ä¾ 578 æ¯ä½¿ç¨VERBOSE_DEBUGæ¥æ·»å dev_vdbg()æ¶æ¯å°é£äºå·²ç»ç±DEBUGå¯ç¨çæ¶æ¯ä¹ä¸ã 579 580 581 第ååç« ï¼åé å å 582 583 å æ ¸æä¾äºä¸é¢çä¸è¬ç¨éçå ååé 彿°ï¼kmalloc()ï¼kzalloc()ï¼kcalloc()å 584 vmalloc()ã请åèAPIææ¡£ä»¥è·åæå ³å®ä»¬ç详ç»