From: Zhang Le <[EMAIL PROTECTED]>
Signed-off-by: Zhang Le <[EMAIL PROTECTED]>
Signed-off-by: Li Yang <[EMAIL PROTECTED]>
Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
---
Documentation/zh_CN/CodingStyle | 701 +++++++++++++++++++++++++++++++++++++++
1 files changed, 701 insertions(+), 0 deletions(-)
create mode 100644 Documentation/zh_CN/CodingStyle
diff --git a/Documentation/zh_CN/CodingStyle b/Documentation/zh_CN/CodingStyle
new file mode 100644
index 0000000..ecd9307
--- /dev/null
+++ b/Documentation/zh_CN/CodingStyle
@@ -0,0 +1,701 @@
+Chinese translated version of Documentation/CodingStyle
+
+If you have any comment or update to the content, please post to LKML directly.
+However, if you have problem communicating in English you can also ask the
+Chinese maintainer for help. Contact the Chinese maintainer, if this
+translation is outdated or there is problem with translation.
+
+Chinese maintainer: Zhang Le <[EMAIL PROTECTED]>
+---------------------------------------------------------------------
+Documentation/CodingStyleçä¸æç¿»è¯
+
+妿æ³è¯è®ºææ´æ°æ¬æçå
容ï¼è¯·ç´æ¥åä¿¡å°LKMLãå¦æä½ ä½¿ç¨è±æäº¤æµæå°é¾çè¯ï¼ä¹å¯
+以å䏿çç»´æ¤è
æ±å©ã妿æ¬ç¿»è¯æ´æ°ä¸åæ¶æè
ç¿»è¯åå¨é®é¢ï¼è¯·èç³»ä¸æçç»´æ¤è
ã
+
+䏿çç»´æ¤è
ï¼ å¼ ä¹ Zhang Le <[EMAIL PROTECTED]>
+䏿çç¿»è¯è
ï¼ å¼ ä¹ Zhang Le <[EMAIL PROTECTED]>
+ä¸æçæ ¡è¯è
ï¼ çèª Wang Cong <[EMAIL PROTECTED]>
+ wheelz <[EMAIL PROTECTED]>
+ 管æä¸ Xudong Guan <[EMAIL PROTECTED]>
+ Li Zefan <[EMAIL PROTECTED]>
+ Wang Chen <[EMAIL PROTECTED]>
+以ä¸ä¸ºæ£æ
+---------------------------------------------------------------------
+
+ Linuxå
æ ¸ä»£ç 飿 ¼
+
+è¿æ¯ä¸ä¸ªç®ççææ¡£ï¼æè¿°äºlinuxå
æ ¸çé¦é代ç 飿 ¼ã代ç 飿 ¼æ¯å 人èå¼çï¼è䏿
+䏿¿æææçè§ç¹å¼ºå ç»ä»»ä½äººï¼ä¸è¿è¿éæè®²è¿°çæ¯æå¿
é¡»è¦ç»´æ¤çä»£ç æéµå®ç飿 ¼ï¼
+并䏿ä¹å¸æç»å¤§å¤æ°å
¶ä»ä»£ç ä¹è½éµå®è¿ä¸ªé£æ ¼ã请å¨åä»£ç æ¶è³å°èèä¸ä¸æ¬ææè¿°ç
+飿 ¼ã
+
+é¦å
ï¼æå»ºè®®ä½ æå°ä¸ä»½GNU代ç è§èï¼ç¶åä¸è¦è¯»å®ãç§äºå®ï¼è¿æ¯ä¸ä¸ªå
·æéå¤§è±¡å¾æ§
+æä¹çå¨ä½ã
+
+ä¸ç®¡ææ ·ï¼ç°å¨æä»¬å¼å§ï¼
+
+
+ 第ä¸ç« ï¼ç¼©è¿
+
+å¶è¡¨ç¬¦æ¯8个åç¬¦ï¼æä»¥ç¼©è¿ä¹æ¯8个å符ãæäºå¼ç«¯è¿å¨è¯å¾å°ç¼©è¿å为4ï¼ä¹è³2ï¼ä¸ªå符
+æ·±ï¼è¿å ä¹ç¸å½äºå°è¯å°åå¨ççå¼å®ä¹ä¸º3ã
+
+çç±ï¼ç¼©è¿çå
¨é¨æä¹å°±å¨äºæ¸
æ¥çå®ä¹ä¸ä¸ªæ§å¶åèµ·æ¢äºä½å¤ãå°¤å
¶æ¯å½ä½ ç¯çä½ çå±å¹
+è¿ç»çäº20å°æ¶ä¹åï¼ä½ å°ä¼åç°å¤§ä¸ç¹ç缩è¿ä¼ä½¿ä½ æ´å®¹æå辨缩è¿ã
+
+ç°å¨ï¼æäºäººä¼æ±æ¨8个å符ç缩è¿ä¼ä½¿ä»£ç åå³è¾¹ç§»å¨ç太è¿ï¼å¨80个å符çç»ç«¯å±å¹ä¸
+å°±å¾é¾è¯»è¿æ ·ç代ç ãè¿ä¸ªé®é¢ççæ¡æ¯ï¼å¦æä½ éè¦3级以ä¸ç缩è¿ï¼ä¸ç®¡ç¨ä½ç§æ¹å¼ä½
+ç代ç å·²ç»æé®é¢äºï¼åºè¯¥ä¿®æ£ä½ çç¨åºã
+
+ç®èè¨ä¹ï¼8个å符ç缩è¿å¯ä»¥è®©ä»£ç æ´å®¹æé
读ï¼è¿æä¸ä¸ªå¥½å¤æ¯å½ä½ ç彿°åµå¥å¤ªæ·±ç
+æ¶åå¯ä»¥ç»ä½ è¦åãçå¿è¿ä¸ªè¦åã
+
+å¨switchè¯å¥ä¸æ¶é¤å¤çº§ç¼©è¿çé¦éçæ¹å¼æ¯è®©âswitchâåä»å±äºå®çâcaseâæ ç¾å¯¹é½äºå
+ä¸åï¼èä¸è¦â两次缩è¿ââcaseâæ ç¾ãæ¯å¦ï¼
+
+ switch (suffix) {
+ case 'G':
+ case 'g':
+ mem <<= 30;
+ break;
+ case 'M':
+ case 'm':
+ mem <<= 20;
+ break;
+ case 'K':
+ case 'k':
+ mem <<= 10;
+ /* fall through */
+ default:
+ break;
+ }
+
+
+ä¸è¦æå¤ä¸ªè¯å¥æ¾å¨ä¸è¡éï¼é¤éä½ æä»ä¹ä¸è¥¿è¦éèï¼
+
+ if (condition) do_this;
+ do_something_everytime;
+
+ä¹ä¸è¦å¨ä¸è¡éæ¾å¤ä¸ªèµå¼è¯å¥ãå
æ ¸ä»£ç 飿 ¼è¶
级ç®åãå°±æ¯é¿å
å¯è½å¯¼è´å«äººè¯¯è¯»ç表
+è¾¾å¼ã
+
+é¤äºæ³¨éãææ¡£åKconfigä¹å¤ï¼ä¸è¦ä½¿ç¨ç©ºæ ¼æ¥ç¼©è¿ï¼åé¢çä¾åæ¯ä¾å¤ï¼æ¯ææä¸ºä¹ã
+
+éç¨ä¸ä¸ªå¥½çç¼è¾å¨ï¼ä¸è¦å¨è¡å°¾çç©ºæ ¼ã
+
+
+ 第äºç« ï¼æé¿çè¡ååç¬¦ä¸²ææ£
+
+代ç 飿 ¼çæä¹å°±å¨äºä½¿ç¨å¹³å¸¸ä½¿ç¨çå·¥å
·æ¥ç»´æä»£ç çå¯è¯»æ§åå¯ç»´æ¤æ§ã
+
+æ¯ä¸è¡çé¿åº¦çéå¶æ¯80åï¼æä»¬å¼ºç建议æ¨éµå®è¿ä¸ªæ¯ä¾ã
+
+é¿äº80åçè¯å¥è¦ææ£æææä¹ççæ®µãæ¯ä¸ªçæ®µè¦ææ¾çäºåæ¥çè¯å¥ï¼è䏿¾ç½®çä½ç½®
+乿æ¾çé å³ãåæ ·çè§åä¹éç¨äºæå¾é¿åæ°å表ç彿°å¤´ãé¿å符串ä¹è¦ææ£æè¾çç
+å符串ãå¯ä¸çä¾å¤æ¯è¶
è¿80åå¯ä»¥å¤§å¹
度æé«å¯è¯»æ§å¹¶ä¸ä¸ä¼éèä¿¡æ¯çæ
åµã
+
+void fun(int a, int b, int c)
+{
+ if (condition)
+ printk(KERN_WARNING "Warning this is a long printk with "
+ "3 parameters a: %u b: %u "
+ "c: %u \n", a, b, c);
+ else
+ next_statement;
+}
+
+ 第ä¸ç« ï¼å¤§æ¬å·åç©ºæ ¼çæ¾ç½®
+
+Cè¯è¨é£æ ¼ä¸å¦å¤ä¸ä¸ªå¸¸è§é®é¢æ¯å¤§æ¬å·çæ¾ç½®ãå缩è¿å¤§å°ä¸åï¼éæ©æå¼ç¨æç§æ¾ç½®ç
+ç¥å¹¶æ²¡æå¤å°ææ¯ä¸çåå ï¼ä¸è¿é¦éçæ¹å¼ï¼å°±åKernighanåRitchieå±ç¤ºç»æä»¬çï¼æ¯
+æèµ·å§å¤§æ¬å·æ¾å¨è¡å°¾ï¼èæç»æå¤§æ¬å·æ¾å¨è¡é¦ï¼æä»¥ï¼
+
+ if (x is true) {
+ we do y
+ }
+
+è¿éç¨äºææçé彿°è¯å¥åï¼ifãswitchãforãwhileãdoï¼ãæ¯å¦ï¼
+
+ switch (action) {
+ case KOBJ_ADD:
+ return "add";
+ case KOBJ_REMOVE:
+ return "remove";
+ case KOBJ_CHANGE:
+ return "change";
+ default:
+ return NULL;
+ }
+
+ä¸è¿ï¼æä¸ä¸ªä¾å¤ï¼é£å°±æ¯å½æ°ï¼å½æ°çèµ·å§å¤§æ¬å·æ¾ç½®äºä¸ä¸è¡çå¼å¤´ï¼æä»¥ï¼
+
+ int function(int x)
+ {
+ body of function
+ }
+
+å
¨ä¸ççå¼ç«¯å¯è½ä¼æ±æ¨è¿ä¸ªä¸ä¸è´æ§æ¯â¦â¦åâ¦â¦ä¸ä¸è´çï¼ä¸è¿æææç»´å¥å
¨ç人é½ç¥éï¼
+aï¼K&Ræ¯_æ£ç¡®ç_ï¼å¹¶ä¸ï¼bï¼K&Ræ¯æ£ç¡®çãæ¤å¤ï¼ä¸ç®¡ææ ·å½æ°é½æ¯ç¹æ®çï¼å¨Cè¯è¨ä¸
+ï¼å½æ°æ¯ä¸è½åµå¥çï¼ã
+
+注æç»æå¤§æ¬å·ç¬èªå æ®ä¸è¡ï¼é¤éå®åé¢è·çåä¸ä¸ªè¯å¥çå©ä½é¨åï¼ä¹å°±æ¯doè¯å¥ä¸ç
+âwhileâæè
ifè¯å¥ä¸çâelseâï¼åè¿æ ·ï¼
+
+ do {
+ body of do-loop
+ } while (condition);
+
+å
+
+ if (x == y) {
+ ..
+ } else if (x > y) {
+ ...
+ } else {
+ ....
+ }
+
+çç±ï¼K&Rã
+
+ä¹è¯·æ³¨æè¿ç§å¤§æ¬å·çæ¾ç½®æ¹å¼ä¹è½ä½¿ç©ºï¼æè
å·®ä¸å¤ç©ºçï¼è¡çæ°éæå°åï¼åæ¶ä¸å¤±å¯
+读æ§ãå æ¤ï¼ç±äºä½ çå±å¹ä¸çæ°è¡æ¯ä¸å¯åçèµæºï¼æ³æ³25è¡çç»ç«¯å±å¹ï¼ï¼ä½ å°ä¼ææ´
+å¤çç©ºè¡æ¥æ¾ç½®æ³¨éã
+
+å½åªæä¸ä¸ªåç¬çè¯å¥çæ¶åï¼ä¸ç¨å ä¸å¿
è¦ç大æ¬å·ã
+
+if (condition)
+ action();
+
+è¿ç¹ä¸éç¨äºæ¬èº«ä¸ºæä¸ªæ¡ä»¶è¯å¥çä¸ä¸ªåæ¯çåç¬è¯å¥ãè¿æ¶éè¦å¨ä¸¤ä¸ªåæ¯éé½ä½¿ç¨å¤§
+æ¬å·ã
+
+if (condition) {
+ do_this();
+ do_that();
+} else {
+ otherwise();
+}
+
+ 3.1ï¼ç©ºæ ¼
+
+Linuxå
æ ¸çç©ºæ ¼ä½¿ç¨æ¹å¼ï¼ä¸»è¦ï¼åå³äºå®æ¯ç¨äºå½æ°è¿æ¯å
³é®åãï¼å¤§å¤æ°ï¼å
³é®åå
+è¦å ä¸ä¸ªç©ºæ ¼ãå¼å¾æ³¨æçä¾å¤æ¯sizeofãtypeofãalignofå__attribute__ï¼è¿äºå
³é®å
+æäºç¨åº¦ä¸çèµ·æ¥æ´å彿°ï¼å®ä»¬å¨Linuxéä¹å¸¸å¸¸ä¼´éå°æ¬å·è使ç¨ï¼å°½ç®¡å¨Cè¯è¨éè¿æ ·
+çå°æ¬å·ä¸æ¯å¿
éçï¼å°±åâstruct fileinfo
infoâ声æè¿åçâsizeof infoâï¼ã
+
+æä»¥å¨è¿äºå
³é®åä¹åæ¾ä¸ä¸ªç©ºæ ¼ï¼
+ if, switch, case, for, do, while
+使¯ä¸è¦å¨sizeofãtypeofãalignofæè
__attribute__è¿äºå
³é®åä¹åæ¾ç©ºæ ¼ãä¾å¦ï¼
+ s = sizeof(struct file);
+
+ä¸è¦å¨å°æ¬å·éç表达å¼ä¸¤ä¾§å ç©ºæ ¼ãè¿æ¯ä¸ä¸ªåä¾ï¼
+
+ s = sizeof( struct file );
+
+å½å£°ææéç±»åæè
è¿åæéç±»åç彿°æ¶ï¼â*âçé¦éä½¿ç¨æ¹å¼æ¯ä½¿ä¹é è¿åéåæè
å½
+æ°åï¼è䏿¯é è¿ç±»ååãä¾åï¼
+
+ char *linux_banner;
+ unsigned long long memparse(char *ptr, char **retptr);
+ char *match_strdup(substring_t *s);
+
+å¨å¤§å¤æ°äºå
åä¸å
æä½ç¬¦ä¸¤ä¾§ä½¿ç¨ä¸ä¸ªç©ºæ ¼ï¼ä¾å¦ä¸é¢ææè¿äºæä½ç¬¦ï¼
+
+ = + - < > * / % | & ^ <= >= == != ? :
+
+使¯ä¸å
æä½ç¬¦åä¸è¦å ç©ºæ ¼ï¼
+ & * + - ~ ! sizeof typeof alignof __attribute__ defined
+
+åç¼èªå åèªåä¸å
æä½ç¬¦åä¸å ç©ºæ ¼ï¼
+ ++ --
+
+åç¼èªå åèªåä¸å
æä½ç¬¦åä¸å ç©ºæ ¼ï¼
+ ++ --
+
+â.âåâ->âç»æä½æåæä½ç¬¦ååä¸å ç©ºæ ¼ã
+
+ä¸è¦å¨è¡å°¾ç空ç½ãæäºå¯ä»¥èªå¨ç¼©è¿çç¼è¾å¨ä¼å¨æ°è¡çè¡é¦å å
¥ééç空ç½ï¼ç¶åä½
+å°±å¯ä»¥ç´æ¥å¨é£ä¸è¡è¾å
¥ä»£ç ãä¸è¿åå¦ä½ æå没æå¨é£ä¸è¡è¾å
¥ä»£ç ï¼æäºç¼è¾å¨å°±ä¸
+ä¼ç§»é¤å·²ç»å å
¥ç空ç½ï¼å°±åä½ æ
æçä¸ä¸ä¸ªåªæç©ºç½çè¡ãå
å«è¡å°¾ç©ºç½çè¡å°±è¿æ ·äº§
+çäºã
+
+å½gitåç°è¡¥ä¸å
å«äºè¡å°¾ç©ºç½çæ¶åä¼è¦åä½ ï¼å¹¶ä¸å¯ä»¥åºä½ çè¦æ±å»æè¡å°¾ç©ºç½ï¼ä¸è¿
+å¦æä½ æ¯æ£å¨æä¸ç³»åè¡¥ä¸ï¼è¿æ ·åä¼å¯¼è´åé¢çè¡¥ä¸å¤±è´¥ï¼å ä¸ºä½ æ¹åäºè¡¥ä¸çä¸ä¸æã
+
+
+ 第åç« ï¼å½å
+
+Cæ¯ä¸ä¸ªç®æ´çè¯è¨ï¼ä½ çå½åä¹åºè¯¥è¿æ ·ãåModula-2åPascalç¨åºåä¸åï¼Cç¨åºåä¸ä½¿
+ç¨ç±»ä¼¼ThisVariableIsATemporaryCounterè¿æ ·å丽çååãCç¨åºåä¼ç§°é£ä¸ªåé为âtmpâ
+ï¼è¿æ ·åèµ·æ¥ä¼æ´å®¹æï¼èä¸è³å°ä¸ä¼ä»¤å
¶é¾äºçè§£ã
+
+ä¸è¿ï¼è½ç¶æ··ç¨å¤§å°åçå忝䏿å¡ä½¿ç¨çï¼ä½æ¯å
¨å±åéè¿æ¯éè¦ä¸ä¸ªå
·æè¿°æ§çåå
+ãç§°ä¸ä¸ªå
¨å±å½æ°ä¸ºâfooâæ¯ä¸ä¸ªé¾ä»¥é¥¶æçé误ã
+
+å
¨å±åéï¼åªæå½ä½ çæ£éè¦å®ä»¬çæ¶ååç¨å®ï¼éè¦æä¸ä¸ªå
·æè¿°æ§çååï¼å°±åå
¨å±å½
+æ°ãå¦æä½ æä¸ä¸ªå¯ä»¥è®¡ç®æ´»å¨ç¨æ·æ°éç彿°ï¼ä½ åºè¯¥å«å®âcount_active_users()âæè
+类似çååï¼ä½ ä¸åºè¯¥å«å®âcntuser()âã
+
+å¨å½æ°åä¸å
å«å½æ°ç±»åï¼æè°çåçå©å½åæ³ï¼æ¯èååºäºé®é¢ââç¼è¯å¨ç¥éé£äºç±»åè
+ä¸è½å¤æ£æ¥é£äºç±»åï¼è¿æ ·ååªè½æç¨åºåå¼ç³æ¶äºã龿ªå¾®è½¯æ»æ¯å¶é åºæé®é¢çç¨åºã
+
+æ¬å°åéååºè¯¥ç®çï¼èä¸è½å¤è¡¨è¾¾ç¸å
³çå«ä¹ãå¦æä½ æä¸äºéæºçæ´æ°åç循ç¯è®¡æ°å¨
+ï¼å®åºè¯¥è¢«ç§°ä¸ºâiâãå«å®âloop_counterâå¹¶æ çå¤ï¼å¦æå®æ²¡æè¢«è¯¯è§£çå¯è½çè¯ã类似
+çï¼âtmpâå¯ä»¥ç¨æ¥ç§°å¼ä»»æç±»åç临æ¶åéã
+
+å¦æä½ ææ··æ·äºä½ çæ¬å°åéåï¼ä½ å°±éå°å¦ä¸ä¸ªé®é¢äºï¼å«å彿°å¢é¿è·å°è失衡综åç
+ã请ç第å
ç« ï¼å½æ°ï¼ã
+
+
+ 第äºç« ï¼Typedef
+
+ä¸è¦ä½¿ç¨ç±»ä¼¼âvps_tâä¹ç±»çä¸è¥¿ã
+
+å¯¹ç»æä½åæé使ç¨typedefæ¯ä¸ä¸ªé误ãå½ä½ å¨ä»£ç éçå°ï¼
+
+ vps_t a;
+
+è¿ä»£è¡¨ä»ä¹ææå¢ï¼
+
+ç¸åï¼å¦ææ¯è¿æ ·
+
+ struct virtual_container *a;
+
+ä½ å°±ç¥éâaâæ¯ä»ä¹äºã
+
+å¾å¤äººè®¤ä¸ºtypedefâè½æé«å¯è¯»æ§âãå®é
䏿¯è¿æ ·çãå®ä»¬åªå¨ä¸åæ
åµä¸æç¨ï¼
+
+ (a)
å®å
¨ä¸éæç对象ï¼è¿ç§æ
åµä¸è¦ä¸»å¨ä½¿ç¨typedefæ¥éèè¿ä¸ªå¯¹è±¡å®é
䏿¯ä»ä¹ï¼ã
+
+
ä¾å¦ï¼âpte_tâçä¸éæå¯¹è±¡ï¼ä½ åªè½ç¨åéç访é®å½æ°æ¥è®¿é®å®ä»¬ã
+
+
注æï¼ä¸éææ§åâ访é®å½æ°âæ¬èº«æ¯ä¸å¥½çãæä»¬ä½¿ç¨pte_tçç±»åçåå å¨äºççæ¯
+ å®å
¨æ²¡æä»»ä½å
±ç¨çå¯è®¿é®ä¿¡æ¯ã
+
+ (b)
æ¸
æ¥çæ´æ°ç±»åï¼å¦æ¤ï¼è¿å±æ½è±¡å°±å¯ä»¥å¸®å©æ¶é¤å°åºæ¯âintâè¿æ¯âlongâçæ··æ·ã
+
+
u8/u16/u32æ¯å®å
¨æ²¡æé®é¢çtypedefï¼ä¸è¿å®ä»¬æ´ç¬¦åç±»å«(d)è䏿¯è¿éã
+
+
忬¡æ³¨æï¼è¦è¿æ ·åï¼å¿
é¡»äºåºæå ã妿æä¸ªå鿝âunsigned
longâï¼é£ä¹æ²¡æå¿
è¦
+
+ typedef unsigned long myflags_t;
+
+
ä¸è¿å¦ææä¸ä¸ªæç¡®çåå ï¼æ¯å¦å®å¨æç§æ
åµä¸å¯è½ä¼æ¯ä¸ä¸ªâunsigned
intâèå¨
+ å
¶ä»æ
åµä¸å¯è½ä¸ºâunsigned
longâï¼é£ä¹å°±ä¸è¦ç¹è±«ï¼è¯·å¡å¿
使ç¨typedefã
+
+ (c)
å½ä½ 使ç¨sparseæåé¢çå建ä¸ä¸ªæ°ç±»åæ¥åç±»åæ£æ¥çæ¶åã
+
+ (d) åæ åC99ç±»åç¸åçç±»åï¼å¨æäºä¾å¤çæ
åµä¸ã
+
+
è½ç¶è®©ç¼çåèçæ¥éåºæ°çæ åç±»åæ¯å¦âuint32_tâä¸éè¦è±å¾å¤æ¶é´ï¼å¯æ¯æäº
+ 人ä»ç¶æç»ä½¿ç¨å®ä»¬ã
+
+
å æ¤ï¼Linuxç¹æççåäºæ åç±»åçâu8/u16/u32/u64âç±»ååå®ä»¬çæç¬¦å·ç±»åæ¯è¢«
+
å
许çââ尽管å¨ä½ èªå·±çæ°ä»£ç ä¸ï¼å®ä»¬ä¸æ¯å¼ºå¶è¦æ±è¦ä½¿ç¨çã
+
+
å½ç¼è¾å·²ç»ä½¿ç¨äºæä¸ªç±»åéçå·²æä»£ç æ¶ï¼ä½ åºè¯¥éµå¾ªé£äºä»£ç ä¸å·²ç»ååºçéæ©ã
+
+ (e) å¯ä»¥å¨ç¨æ·ç©ºé´å®å
¨ä½¿ç¨çç±»åã
+
+
卿äºç¨æ·ç©ºé´å¯è§çç»æä½éï¼æä»¬ä¸è½è¦æ±C99ç±»åèä¸ä¸è½ç¨ä¸é¢æå°çâu32â
+
ç±»åãå æ¤ï¼æä»¬å¨ä¸ç¨æ·ç©ºé´å
±äº«çææç»æä½ä¸ä½¿ç¨__u32å类似çç±»åã
+
+å¯è½è¿æå
¶ä»çæ
åµï¼ä¸è¿åºæ¬çè§åæ¯æ°¸è¿ä¸è¦ä½¿ç¨typedefï¼é¤éä½ å¯ä»¥æç¡®çåºç¨ä¸
+è¿°æä¸ªè§åä¸çä¸ä¸ªã
+
+æ»çæ¥è¯´ï¼å¦æä¸ä¸ªæéæè
ä¸ä¸ªç»æä½éçå
ç´ å¯ä»¥åççè¢«ç´æ¥è®¿é®å°ï¼é£ä¹å®ä»¬å°±ä¸
+åºè¯¥æ¯ä¸ä¸ªtypedefã
+
+
+ 第å
ç« ï¼å½æ°
+
+彿°åºè¯¥ç®çèæ¼äº®ï¼å¹¶ä¸åªå®æä¸ä»¶äºæ
ã彿°åºè¯¥å¯ä»¥ä¸å±æè
䏤屿¾ç¤ºå®ï¼æä»¬é½ç¥
+éISO/ANSIå±å¹å¤§å°æ¯80x24ï¼ï¼åªåä¸ä»¶äºæ
ï¼è䏿å®å好ã
+
+ä¸ä¸ªå½æ°çæå¤§é¿åº¦æ¯åè¯¥å½æ°çå¤æåº¦å缩è¿çº§æ°æåæ¯çãæä»¥ï¼å¦æä½ æä¸ä¸ªç论ä¸
+å¾ç®åçåªæä¸ä¸ªå¾é¿ï¼ä½æ¯ç®åï¼çcaseè¯å¥ç彿°ï¼èä¸ä½ éè¦å¨æ¯ä¸ªcaseéåå¾å¤å¾
+å°çäºæ
ï¼è¿æ ·ç彿°å°½ç®¡å¾é¿ï¼ä½ä¹æ¯å¯ä»¥çã
+
+ä¸è¿ï¼å¦æä½ æä¸ä¸ªå¤æç彿°ï¼èä¸ä½ æçä¸ä¸ªå¤©å䏿¯å¾é«çé«ä¸ä¸å¹´çº§å¦çå¯è½çè³
+æä¸æ¸
æ¥è¿ä¸ªå½æ°çç®çï¼ä½ åºè¯¥ä¸¥æ ¼çéµå®å颿å°çé¿åº¦éå¶ã使ç¨è¾
å©å½æ°ï¼å¹¶ä¸ºä¹
+å个å
·æè¿°æ§çååï¼å¦æä½ è§å¾å®ä»¬çæ§è½å¾éè¦çè¯ï¼å¯ä»¥è®©ç¼è¯å¨å
èå®ä»¬ï¼è¿æ ·ç
+ææå¾å¾ä¼æ¯ä½ åä¸ä¸ªå¤æå½æ°çææè¦å¥½ãï¼
+
+彿°çå¦å¤ä¸ä¸ªè¡¡éæ 忝æ¬å°åéçæ°éãæ¤æ°éä¸åºè¶
è¿5ï¼10个ï¼å¦åä½ ç彿°å°±æ
+é®é¢äºãéæ°èèä¸ä¸ä½ ç彿°ï¼æå®åæææ´å°ç彿°ã人ç大èä¸è¬å¯ä»¥è½»æ¾çåæ¶è·
+踪7个ä¸åçäºç©ï¼å¦æåå¢å¤çè¯ï¼å°±ä¼ç³æ¶äºãå³ä¾¿ä½ èªé¢è¿äººï¼ä½ ä¹å¯è½ä¼è®°ä¸æ¸
ä½ 2
+个ææååè¿çäºæ
ã
+
+卿ºæä»¶éï¼ä½¿ç¨ç©ºè¡éå¼ä¸åç彿°ãå¦æè¯¥å½æ°éè¦è¢«å¯¼åºï¼å®çEXPORT*å®åºè¯¥ç´§è´´
+å¨å®çç»æå¤§æ¬å·ä¹ä¸ãæ¯å¦ï¼
+
+int system_is_up(void)
+{
+ return system_state == SYSTEM_RUNNING;
+}
+EXPORT_SYMBOL(system_is_up);
+
+å¨å½æ°ååä¸ï¼å
å«å½æ°ååå®ä»¬çæ°æ®ç±»åãè½ç¶Cè¯è¨é没æè¿æ ·çè¦æ±ï¼å¨Linuxéè¿
+æ¯æå¡çåæ³ï¼å ä¸ºè¿æ ·å¯ä»¥å¾ç®åçç»è¯»è
æä¾æ´å¤çæä»·å¼çä¿¡æ¯ã
+
+
+ 第ä¸ç« ï¼éä¸ç彿°éåºéå¾
+
+è½ç¶è¢«æäºäººå£°ç§°å·²ç»è¿æ¶ï¼ä½æ¯gotoè¯å¥ççä»·ç©è¿æ¯ç»å¸¸è¢«ç¼è¯å¨æä½¿ç¨ï¼å
·ä½å½¢å¼æ¯
+æ æ¡ä»¶è·³è½¬æä»¤ã
+
+å½ä¸ä¸ªå½æ°ä»å¤ä¸ªä½ç½®éåºå¹¶ä¸éè¦åä¸äºéç¨çæ¸
çå·¥ä½çæ¶åï¼gotoç好å¤å°±æ¾ç°åºæ¥
+äºã
+
+çç±æ¯ï¼
+
+- æ æ¡ä»¶è¯å¥å®¹æçè§£åè·è¸ª
+- åµå¥ç¨åº¦åå°
+-
å¯ä»¥é¿å
ç±äºä¿®æ¹æ¶å¿è®°æ´æ°æä¸ªåç¬çéåºç¹è导è´çé误
+- åè½»äºç¼è¯å¨çå·¥ä½ï¼æ éå é¤åä½ä»£ç ;)
+
+int fun(int a)
+{
+ int result = 0;
+ char *buffer = kmalloc(SIZE);
+
+ if (buffer == NULL)
+ return -ENOMEM;
+
+ if (condition1) {
+ while (loop1) {
+ ...
+ }
+ result = 1;
+ goto out;
+ }
+ ...
+out:
+ kfree(buffer);
+ return result;
+}
+
+ 第å
«ç« ï¼æ³¨é
+
+æ³¨éæ¯å¥½çï¼ä¸è¿æè¿åº¦æ³¨éçå±é©ãæ°¸è¿ä¸è¦å¨æ³¨ééè§£éä½ çä»£ç æ¯å¦ä½è¿ä½çï¼æ´å¥½
+çåæ³æ¯è®©å«äººä¸çä½ ç代ç å°±å¯ä»¥æç½ï¼è§£éåçå¾å·®çä»£ç æ¯æµªè´¹æ¶é´ã
+
+ä¸è¬çï¼ä½ æ³è¦ä½ çæ³¨éåè¯å«äººä½ ç代ç åäºä»ä¹ï¼è䏿¯æä¹åçãä¹è¯·ä½ ä¸è¦ææ³¨é
+æ¾å¨ä¸ä¸ªå½æ°ä½å
é¨ï¼å¦æå½æ°å¤æå°ä½ éè¦ç¬ç«ç注éå
¶ä¸çä¸é¨åï¼ä½ å¾å¯è½éè¦åå°
+第å
ç« çä¸çãä½ å¯ä»¥åä¸äºå°æ³¨éæ¥æ³¨ææè¦åæäºå¾èªæï¼æè
æ§½ç³ï¼çåæ³ï¼ä½ä¸è¦
+å 太å¤ãä½ åºè¯¥åçï¼æ¯ææ³¨éæ¾å¨å½æ°ç头é¨ï¼åè¯äººä»¬å®åäºä»ä¹ï¼ä¹å¯ä»¥å ä¸å®åè¿
+äºäºæ
çåå ã
+
+彿³¨éå
æ ¸API彿°æ¶ï¼è¯·ä½¿ç¨kernel-docæ ¼å¼ã请ç
+Documentation/kernel-doc-nano-HOWTO.txtåscripts/kernel-doc以è·å¾è¯¦ç»ä¿¡æ¯ã
+
+Linuxçæ³¨é飿 ¼æ¯C89â/* ... */â飿 ¼ãä¸è¦ä½¿ç¨C99飿 ¼â//
...âæ³¨éã
+
+é¿ï¼å¤è¡ï¼çé¦é注é飿 ¼æ¯ï¼
+
+ /*
+ * 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.
+ */
+
+æ³¨éæ°æ®ä¹æ¯å¾éè¦çï¼ä¸ç®¡æ¯åºæ¬ç±»åè¿æ¯è¡çç±»åãä¸ºäºæ¹ä¾¿å®ç°è¿ä¸ç¹ï¼æ¯ä¸è¡åºåª
+声æä¸ä¸ªæ°æ®ï¼ä¸è¦ä½¿ç¨éå·æ¥ä¸æ¬¡å£°æå¤ä¸ªæ°æ®ï¼ãè¿æ ·ä½ å°±æç©ºé´æ¥ä¸ºæ¯ä¸ªæ°æ®å䏿®µ
+å°æ³¨éæ¥è§£éå®ä»¬çç¨éäºã
+
+
+ 第ä¹ç« ï¼ä½ å·²ç»æäºæ
å¼ç³äº
+
+è¿æ²¡ä»ä¹ï¼æä»¬é½æ¯è¿æ ·ãå¯è½ä½ ç使ç¨äºå¾é¿æ¶é´Unixçæåå·²ç»åè¯ä½ âGNU
emacsâè½
+èªå¨å¸®ä½ æ ¼å¼åCæºä»£ç ï¼èä¸ä½ 乿³¨æå°äºï¼ç¡®å®æ¯è¿æ ·ï¼ä¸è¿å®æä½¿ç¨çé»è®¤å¼åæä»¬
+æ³è¦çç¸å»çè¿ï¼å®é
ä¸ï¼çè³æ¯éæºæçè¿è¦å·®ââæ æ°ä¸ªç´åå¨GNU
emacséæåæ°¸è¿ä¸
+ä¼åé åºä¸ä¸ªå¥½ç¨åºï¼ï¼è¯æ³¨ï¼è¯·åèInfinite Monkey Theoremï¼
+
+æä»¥ä½ è¦ä¹æ¾å¼GNU
emacsï¼è¦ä¹æ¹åå®è®©å®ä½¿ç¨æ´åçç设å®ãè¦éç¨åä¸ä¸ªæ¹æ¡ï¼ä½ å¯
+以æä¸é¢è¿æ®µç²è´´å°ä½ ç.emacsæä»¶éã
+
+(defun linux-c-mode ()
+ "C mode with adjusted defaults for use with the Linux kernel."
+ (interactive)
+ (c-mode)
+ (c-set-style "K&R")
+ (setq tab-width 8)
+ (setq indent-tabs-mode t)
+ (setq c-basic-offset 8))
+
+è¿æ ·å°±å®ä¹äºM-x
linux-c-modeå½ä»¤ãå½ä½ hackä¸ä¸ªæ¨¡åçæ¶åï¼å¦æä½ æå符串
+-*- linux-c
-*-æ¾å¨å¤´ä¸¤è¡çæä¸ªä½ç½®ï¼è¿ä¸ªæ¨¡å¼å°ä¼è¢«èªå¨è°ç¨ãå¦æä½ å¸æå¨ä½ ä¿®æ¹
+/usr/src/linuxéçæä»¶æ¶éæ¯è¬èªå¨æå¼linux-c-modeçè¯ï¼ä½ ä¹å¯è½éè¦æ·»å
+
+(setq auto-mode-alist (cons '("/usr/src/linux.*/.*\\.[ch]$" . linux-c-mode)
+ auto-mode-alist))
+
+å°ä½ ç.emacsæä»¶éã
+
+ä¸è¿å°±ç®ä½ å°è¯è®©emacsæ£ç¡®çæ ¼å¼å代ç 失败äºï¼ä¹å¹¶ä¸æå³çä½ å¤±å»äºä¸åï¼è¿å¯ä»¥ç¨â
+indentâã
+
+ä¸è¿ï¼GNU indent乿åGNU
emacs䏿 ·æé®é¢ç设å®ï¼æä»¥ä½ éè¦ç»å®ä¸äºå½ä»¤é项ãä¸
+è¿ï¼è¿è¿ä¸ç®å¤ªç³ç³ï¼å ä¸ºå°±ç®æ¯GNU
indentçä½è
ä¹è®¤åK&Rçæå¨æ§ï¼GNUçäººå¹¶ä¸æ¯å
+人ï¼ä»ä»¬åªæ¯å¨è¿ä¸ªé®é¢ä¸è¢«ä¸¥éç误导äºï¼ï¼æä»¥ä½ åªè¦ç»indentæå®é项â-kr
-i8â
+ï¼ä»£è¡¨âK&Rï¼8个å符缩è¿âï¼ï¼æè
使ç¨âscripts/Lindentâï¼è¿æ ·å°±å¯ä»¥ä»¥ææ¶é«¦çæ¹å¼
+ç¼©è¿æºä»£ç ã
+
+âindentâæå¾å¤é项ï¼ç¹å«æ¯éæ°æ ¼å¼å注éçæ¶åï¼ä½ å¯è½éè¦çä¸ä¸å®çæå页ãä¸è¿
+è®°ä½ï¼âindentâä¸è½ä¿®æ£åçç¼ç¨ä¹ æ¯ã
+
+
+ 第åç« ï¼Kconfigé
ç½®æä»¶
+
+对äºé叿ºç æ çææKconfig*é
ç½®æä»¶æ¥è¯´ï¼å®ä»¬ç¼©è¿æ¹å¼ä¸C代ç ç¸æ¯ææä¸åãç´§æ¨
+å¨âconfigâå®ä¹ä¸é¢çè¡ç¼©è¿ä¸ä¸ªå¶è¡¨ç¬¦ï¼å¸®å©ä¿¡æ¯ååå¤ç¼©è¿2ä¸ªç©ºæ ¼ãæ¯å¦ï¼
+
+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.
+
+ä»ç¶è¢«è®¤ä¸ºä¸å¤ç¨³å®çåè½åºè¯¥è¢«å®ä¹ä¸ºä¾èµäºâEXPERIMENTALâï¼
+
+config SLUB
+ depends on EXPERIMENTAL && !ARCH_USES_SLAB_PAGE_STRUCT
+ bool "SLUB (Unqueued Allocator)"
+ ...
+
+èé£äºå±é©çåè½ï¼æ¯å¦æäºæä»¶ç³»ç»ç忝æï¼åºè¯¥å¨å®ä»¬çæç¤ºåç¬¦ä¸²éæ¾èç声æè¿
+ä¸ç¹ï¼
+
+config ADFS_FS_RW
+ bool "ADFS write support (DANGEROUS)"
+ depends on ADFS_FS
+ ...
+
+è¦æ¥çé
ç½®æä»¶ç宿´ææ¡£ï¼è¯·çDocumentation/kbuild/kconfig-language.txtã
+
+
+ 第åä¸ç« ï¼æ°æ®ç»æ
+
+妿ä¸ä¸ªæ°æ®ç»æï¼å¨å建å鿝å®çå线æ§è¡ç¯å¢ä¹å¤å¯è§ï¼é£ä¹å®å¿
é¡»è¦æä¸ä¸ªå¼ç¨è®¡
+æ°å¨ãå
æ ¸éæ²¡æå徿¶éï¼å¹¶ä¸å
æ ¸ä¹å¤çå徿¶éæ
¢ä¸æçä½ä¸ï¼ï¼è¿æå³çä½ ç»å¯¹é
+è¦è®°å½ä½ 对è¿ç§æ°æ®ç»æçä½¿ç¨æ
åµã
+
+å¼ç¨è®¡æ°æå³çä½ è½å¤é¿å
ä¸éï¼å¹¶ä¸å
许å¤ä¸ªç¨æ·å¹¶è¡è®¿é®è¿ä¸ªæ°æ®ç»æââèä¸éè¦æ
å¿
+è¿ä¸ªæ°æ®ç»æä»
ä»
å ä¸ºææ¶ä¸è¢«ä½¿ç¨å°±æ¶å¤±äºï¼é£äºç¨æ·å¯è½ä¸è¿æ¯æ²ç¡äºä¸éµæè
åäºä¸
+äºå
¶ä»äºæ
èå·²ã
+
+注æä¸éä¸è½å代å¼ç¨è®¡æ°ãä¸éæ¯ä¸ºäºä¿ææ°æ®ç»æçä¸è´æ§ï¼èå¼ç¨è®¡æ°æ¯ä¸ä¸ªå
å管
+çæå·§ãé常äºè
é½éè¦ï¼ä¸è¦æä¸¤ä¸ªææ··äºã
+
+å¾å¤æ°æ®ç»æå®é
䏿2级å¼ç¨è®¡æ°ï¼å®ä»¬é常æä¸åâç±»âçç¨æ·ãå类计æ°å¨ç»è®¡åç±»ç¨
+æ·çæ°éï¼æ¯å½å类计æ°å¨åè³é¶æ¶ï¼å
¨å±è®¡æ°å¨åä¸ã
+
+è¿ç§âå¤çº§å¼ç¨è®¡æ°âçä¾åå¯ä»¥å¨å
å管çï¼âstruct
mm_structâï¼mm_usersåmm_countï¼
+åæä»¶ç³»ç»ï¼âstruct super_blockâï¼s_countås_activeï¼ä¸æ¾å°ã
+
+è®°ä½ï¼å¦æå¦ä¸ä¸ªæ§è¡çº¿ç´¢å¯ä»¥æ¾å°ä½ çæ°æ®ç»æï¼ä½æ¯è¿ä¸ªæ°æ®ç»ææ²¡æå¼ç¨è®¡æ°å¨ï¼è¿
+éå ä¹è¯å®æ¯ä¸ä¸ªbugã
+
+
+ 第åäºç« ï¼å®ï¼æä¸¾åRTL
+
+ç¨äºå®ä¹å¸¸éçå®çåååæä¸¾éçæ ç¾éè¦å¤§åã
+
+#define CONSTANT 0x12345
+
+å¨å®ä¹å 个ç¸å
³çå¸¸éæ¶ï¼æå¥½ç¨æä¸¾ã
+
+å®çåå请ç¨å¤§å忝ï¼ä¸è¿å½¢å¦å½æ°çå®çååå¯ä»¥ç¨å°å忝ã
+
+ä¸è¬çï¼å¦æè½åæå
è彿°å°±ä¸è¦åæå彿°çå®ã
+
+嫿å¤ä¸ªè¯å¥çå®åºè¯¥è¢«å
å«å¨ä¸ä¸ªdo-while代ç åéï¼
+
+#define macrofun(a, b, c) \
+ do { \
+ if (a == 5) \
+ do_this(b, c); \
+ } while (0)
+
+使ç¨å®çæ¶ååºé¿å
çäºæ
ï¼
+
+1) 影忧嶿µç¨çå®ï¼
+
+#define FOO(x) \
+ do { \
+ if (blah(x) < 0) \
+ return -EBUGGERED; \
+ } while(0)
+
+é常ä¸å¥½ãå®çèµ·æ¥åä¸ä¸ªå½æ°ï¼ä¸è¿å´è½å¯¼è´âè°ç¨âå®ç彿°éåºï¼ä¸è¦æä¹±è¯»è
大èé
+çè¯æ³åæå¨ã
+
+2) ä¾èµäºä¸ä¸ªåºå®ååçæ¬å°åéçå®ï¼
+
+#define FOO(val) bar(index, val)
+
+å¯è½çèµ·æ¥åæ¯ä¸ªä¸éçä¸è¥¿ï¼ä¸è¿å®é常容ææè¯»ä»£ç ç人æç³æ¶ï¼èä¸å®¹æå¯¼è´çèµ·æ¥
+ä¸ç¸å
³çæ¹å¨å¸¦æ¥é误ã
+
+3) ä½ä¸ºå·¦å¼ç另忰çå®ï¼ FOO(x) =
yï¼å¦ææäººæFOOåæä¸ä¸ªå
è彿°çè¯ï¼è¿ç§ç¨
+æ³å°±ä¼åºéäºã
+
+4)
å¿è®°äºä¼å
级ï¼ä½¿ç¨è¡¨è¾¾å¼å®ä¹å¸¸éçå®å¿
é¡»å°è¡¨è¾¾å¼ç½®äºä¸å¯¹å°æ¬å·ä¹å
ã另忰ç
+å®ä¹è¦æ³¨ææ¤ç±»é®é¢ã
+
+#define CONSTANT 0x4000
+#define CONSTEXP (CONSTANT | 3)
+
+cppæå对å®ç讲解å¾è¯¦ç»ãGcc
internalsæåä¹è¯¦ç»è®²è§£äºRTLï¼è¯æ³¨ï¼register
+transfer languageï¼ï¼å
æ ¸éçæ±ç¼è¯è¨ç»å¸¸ç¨å°å®ã
+
+
+ 第åä¸ç« ï¼æå°å
æ ¸æ¶æ¯
+
+å
æ ¸å¼åè
åºè¯¥æ¯åè¿è¯å¥½æè²çã请ä¸å®æ³¨æå
æ ¸ä¿¡æ¯çæ¼åï¼ä»¥ç»äººä»¥å¥½çå°è±¡ãä¸è¦
+ç¨ä¸è§èçåè¯æ¯å¦âdontâï¼èè¦ç¨âdo
notâæè
âdon'tâãä¿è¯è¿äºä¿¡æ¯ç®åãæäºãæ
+æ§ä¹ã
+
+å
æ ¸ä¿¡æ¯ä¸å¿
以å¥å·ï¼è¯æ³¨ï¼è±æå¥å·ï¼å³ç¹ï¼ç»æã
+
+å¨å°æ¬å·éæå°æ°å(%d)没æä»»ä½ä»·å¼ï¼åºè¯¥é¿å
è¿æ ·åã
+
+<linux/device.h>éæä¸äºé©±å¨æ¨¡åè¯æå®ï¼ä½ åºè¯¥ä½¿ç¨å®ä»¬ï¼ä»¥ç¡®ä¿ä¿¡æ¯å¯¹åºäºæ£ç¡®ç
+设å¤å驱å¨ï¼å¹¶ä¸è¢«æ è®°äºæ£ç¡®çæ¶æ¯çº§å«ãè¿äºå®æï¼dev_err(),
dev_warn(),
+dev_info()ççã对äºé£äºä¸åæä¸ªç¹å®è®¾å¤ç¸å
³è¿çä¿¡æ¯ï¼<linux/kernel.h>å®ä¹äº
+pr_debug()åpr_info()ã
+
+ååºå¥½çè°è¯ä¿¡æ¯å¯ä»¥æ¯ä¸ä¸ªå¾å¤§çææï¼å½ä½ ååºæ¥ä¹åï¼è¿äºä¿¡æ¯å¨è¿ç¨é¤éçæ¶å
+å°±ä¼æä¸ºæå¤§ç帮å©ãå½DEBUGç¬¦å·æ²¡æè¢«å®ä¹çæ¶åï¼è¿äºä¿¡æ¯ä¸åºè¯¥è¢«ç¼è¯è¿å
æ ¸é
+ï¼ä¹å°±æ¯è¯´ï¼é»è®¤å°ï¼å®ä»¬ä¸åºè¯¥è¢«å
å«å¨å
ï¼ãå¦æä½ ä½¿ç¨dev_dbg()æè
pr_debug()ï¼
+å°±è½èªå¨è¾¾å°è¿ä¸ªææãå¾å¤åç³»ç»æ¥æKconfigé项æ¥å¯ç¨-DDEBUGãè¿æä¸ä¸ªç¸å
³çæ¯ä¾
+æ¯ä½¿ç¨VERBOSE_DEBUGæ¥æ·»å dev_vdbg()æ¶æ¯å°é£äºå·²ç»ç±DEBUGå¯ç¨çæ¶æ¯ä¹ä¸ã
+
+
+ 第ååç« ï¼åé
å
å
+
+å
æ ¸æä¾äºä¸é¢çä¸è¬ç¨éçå
ååé
彿°ï¼kmalloc()ï¼kzalloc()ï¼kcalloc()å
+vmalloc()ã请åèAPIææ¡£ä»¥è·åæå
³å®ä»¬ç详ç»ä¿¡æ¯ã
+
+ä¼ éç»æä½å¤§å°çé¦é形弿¯è¿æ ·çï¼
+
+ p = kmalloc(sizeof(*p), ...);
+
+å¦å¤ä¸ç§ä¼ éæ¹å¼ä¸ï¼sizeofçæä½æ°æ¯ç»æä½çååï¼è¿æ ·ä¼éä½å¯è¯»æ§ï¼å¹¶ä¸å¯è½ä¼å¼
+å
¥bugãæå¯è½æéåéç±»å被æ¹åæ¶ï¼è对åºçä¼ éç»å
ååé
彿°çsizeofçç»æä¸åã
+
+强å¶è½¬æ¢ä¸ä¸ªvoidæéè¿å弿¯å¤ä½çãCè¯è¨æ¬èº«ä¿è¯äºä»voidæéå°å
¶ä»ä»»ä½æéç±»å
+çè½¬æ¢æ¯æ²¡æé®é¢çã
+
+
+ 第åäºç« ï¼å
èå¼ç
+
+æä¸ä¸ªå¸¸è§ç误解æ¯å
è彿°æ¯gccæä¾çå¯ä»¥è®©ä»£ç è¿è¡æ´å¿«çä¸ä¸ªé项ãè½ç¶ä½¿ç¨å
è
+彿°ææ¶åæ¯æ°å½çï¼æ¯å¦ä½ä¸ºä¸ç§æ¿ä»£å®çæ¹å¼ï¼è¯·ç第åäºç« ï¼ï¼ä¸è¿å¾å¤æ
åµä¸ä¸æ¯
+è¿æ ·ãinlineå
³é®åçè¿åº¦ä½¿ç¨ä¼ä½¿å
æ ¸å大ï¼ä»è使æ´ä¸ªç³»ç»è¿è¡é度åæ
¢ãå 为大å
æ ¸
+ä¼å ç¨æ´å¤çæä»¤é«éç¼åï¼è¯æ³¨ï¼ä¸çº§ç¼åéå¸¸æ¯æä»¤ç¼ååæ°æ®ç¼ååå¼çï¼èä¸ä¼å¯¼
+è´pagecacheçå¯ç¨å
ååå°ãæ³è±¡ä¸ä¸ï¼ä¸æ¬¡pagecacheæªå½ä¸å°±ä¼å¯¼è´ä¸æ¬¡ç£ç寻åï¼å°
+èæ¶5毫ç§ã5毫ç§çæ¶é´å
CPUè½æ§è¡å¾å¤å¾å¤æä»¤ã
+
+ä¸ä¸ªåºæ¬çå忝妿ä¸ä¸ªå½æ°æ3è¡ä»¥ä¸ï¼å°±ä¸è¦æå®åæå
è彿°ãè¿ä¸ªååçä¸ä¸ªä¾
+夿¯ï¼å¦æä½ ç¥éæä¸ªåæ°æ¯ä¸ä¸ªç¼è¯æ¶å¸¸éï¼èä¸å 为è¿ä¸ªå¸¸éä½ ç¡®å®ç¼è¯å¨å¨ç¼è¯æ¶è½
+ä¼åæä½ ç彿°ç大é¨å代ç ï¼é£ä»ç¶å¯ä»¥ç»å®å ä¸inlineå
³é®åãkmalloc()å
è彿°å°±
+æ¯ä¸ä¸ªå¾å¥½çä¾åã
+
+人们ç»å¸¸ä¸»å¼ ç»staticçèä¸åªç¨äºä¸æ¬¡ç彿°å ä¸inlineï¼å¦æ¤ä¸ä¼æä»»ä½æå¤±ï¼å 为没
+æä»ä¹å¥½æè¡¡çãè½ç¶ä»ææ¯ä¸è¯´è¿æ¯æ£ç¡®çï¼ä½æ¯å®é
ä¸è¿ç§æ
åµä¸å³ä½¿ä¸å inline
gcc
+ä¹å¯ä»¥èªå¨ä½¿å
¶å
èãèä¸å
¶ä»ç¨æ·å¯è½ä¼è¦æ±ç§»é¤inlineï¼ç±æ¤èæ¥çäºè®ºä¼æµæ¶inline
+èªèº«çæ½å¨ä»·å¼ï¼å¾ä¸å¿å¤±ã
+
+
+ 第åå
ç« ï¼å½æ°è¿åå¼åå½å
+
+彿°å¯ä»¥è¿åå¾å¤ç§ä¸åç±»åçå¼ï¼æå¸¸è§çä¸ç§æ¯è¡¨æå½æ°æ§è¡æåæè
失败çå¼ãè¿æ ·
+çä¸ä¸ªå¼å¯ä»¥è¡¨ç¤ºä¸ºä¸ä¸ªéè¯¯ä»£ç æ´æ°ï¼-Exxxï¼å¤±è´¥ï¼0ï¼æåï¼æè
ä¸ä¸ªâæåâå¸å°å¼ï¼
+0ï¼å¤±è´¥ï¼é0ï¼æåï¼ã
+
+æ··å使ç¨è¿ä¸¤ç§è¡¨è¾¾æ¹å¼æ¯é¾äºåç°çbugçæ¥æºã妿Cè¯è¨æ¬èº«ä¸¥æ ¼åºåæ´å½¢åå¸å°åå
+éï¼é£ä¹ç¼è¯å¨å°±è½å¤å¸®æä»¬åç°è¿äºé误â¦â¦ä¸è¿Cè¯è¨ä¸åºåã为äºé¿å
产çè¿ç§bugï¼è¯·
+éµå¾ªä¸é¢çæ¯ä¾ï¼
+
+
妿彿°çå忝ä¸ä¸ªå¨ä½æè
å¼ºå¶æ§çå½ä»¤ï¼é£ä¹è¿ä¸ªå½æ°åºè¯¥è¿åéè¯¯ä»£ç æ´
+
æ°ã妿æ¯ä¸ä¸ªå¤æï¼é£ä¹å½æ°åºè¯¥è¿åä¸ä¸ªâæåâå¸å°å¼ã
+
+æ¯å¦ï¼âadd
workâæ¯ä¸ä¸ªå½ä»¤ï¼æä»¥add_work()彿°å¨æåæ¶è¿å0ï¼å¨å¤±è´¥æ¶è¿å-EBUSYã
+类似çï¼å 为âPCI device
presentâæ¯ä¸ä¸ªå¤æï¼æä»¥pci_dev_present()彿°å¨æåæ¾å°
+ä¸ä¸ªå¹é
çè®¾å¤æ¶åºè¯¥è¿å1ï¼å¦ææ¾ä¸å°æ¶åºè¯¥è¿å0ã
+
+ææå¯¼åºï¼è¯æ³¨ï¼EXPORTï¼ç彿°é½å¿
é¡»éµå®è¿ä¸ªæ¯ä¾ï¼ææçå
Œ
±å½æ°ä¹é½åºè¯¥å¦æ¤ãç§
+æï¼staticï¼å½æ°ä¸éè¦å¦æ¤ï¼ä½æ¯æä»¬ä¹æ¨èè¿æ ·åã
+
+è¿å弿¯å®é
计ç®ç»æè䏿¯è®¡ç®æ¯å¦æåçæ å¿ç彿°ä¸åæ¤æ¯ä¾çéå¶ãä¸è¬çï¼ä»ä»¬
+éè¿è¿åä¸äºæ£å¸¸å¼èå´ä¹å¤çç»ææ¥è¡¨ç¤ºåºéãå
¸åçä¾åæ¯è¿åæéç彿°ï¼ä»ä»¬ä½¿ç¨
+NULLæè
ERR_PTRæºå¶æ¥æ¥åé误ã
+
+
+ 第åä¸ç« ï¼ä¸è¦éæ°åæå
æ ¸å®
+
+头æä»¶include/linux/kernel.hå
å«äºä¸äºå®ï¼ä½ åºè¯¥ä½¿ç¨å®ä»¬ï¼èä¸è¦èªå·±åä¸äºå®ä»¬ç
+åç§ãæ¯å¦ï¼å¦æä½ éè¦è®¡ç®ä¸ä¸ªæ°ç»çé¿åº¦ï¼ä½¿ç¨è¿ä¸ªå®
+
+ #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+
+类似çï¼å¦æä½ è¦è®¡ç®æç»æä½æåç大å°ï¼ä½¿ç¨
+
+ #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
+
+è¿æå¯ä»¥åä¸¥æ ¼çç±»åæ£æ¥çmin()åmax()å®ï¼å¦æä½ éè¦å¯ä»¥ä½¿ç¨å®ä»¬ãä½ å¯ä»¥èªå·±çç
+é£ä¸ªå¤´æä»¶éè¿å®ä¹äºä»ä¹ä½ å¯ä»¥æ¿æ¥ç¨çä¸è¥¿ï¼å¦ææå®ä¹çè¯ï¼ä½ å°±ä¸åºå¨ä½ ç代ç é
+èªå·±éæ°å®ä¹ã
+
+
+ 第åå
«ç« ï¼ç¼è¾å¨æ¨¡å¼è¡åå
¶ä»éè¦ç½å¦çäºæ
+
+æä¸äºç¼è¾å¨å¯ä»¥è§£éåµå
¥å¨æºæä»¶éçç±ä¸äºç¹æ®æ è®°æ æçé
置信æ¯ãæ¯å¦ï¼emacs
+è½å¤è§£é被æ è®°æè¿æ ·çè¡ï¼
+
+-*- mode: c -*-
+
+æè
è¿æ ·çï¼
+
+/*
+Local Variables:
+compile-command: "gcc -DMAGIC_DEBUG_FLAG foo.c"
+End:
+*/
+
+Vimè½å¤è§£éè¿æ ·çæ è®°ï¼
+
+/* vim:set sw=8 noet */
+
+ä¸è¦å¨æºä»£ç ä¸å
å«ä»»ä½è¿æ ·çå
å®¹ãæ¯ä¸ªäººé½æä»èªå·±çç¼è¾å¨é
ç½®ï¼ä½ çæºæä»¶ä¸åº
+该è¦çå«äººçé
ç½®ãè¿å
æ¬æå
³ç¼©è¿å模å¼é
ç½®çæ è®°ã人们å¯ä»¥ä½¿ç¨ä»ä»¬èªå·±å®å¶ç模
+å¼ï¼æè
使ç¨å
¶ä»å¯ä»¥äº§çæ£ç¡®ç缩è¿ç巧妿¹æ³ã
+
+
+
+ éå½ Iï¼åè
+
+The C Programming Language, 第äºç, ä½è
Brian W. KernighanåDenni
+M. Ritchie. Prentice Hall, Inc., 1988. ISBN 0-13-110362-8 (软ç®),
+0-13-110370-9 (硬ç®). URL: http://cm.bell-labs.com/cm/cs/cbook/
+
+The Practice of Programming ä½è
Brian W. KernighanåRob Pike.
Addison-Wesley,
+Inc., 1999. ISBN 0-201-61586-X. URL: http://cm.bell-labs.com/cm/cs/tpop/
+
+cppï¼gccï¼gcc
internalsåindentçGNUæåââåK&R忬æç¸ç¬¦åçé¨åï¼å
¨é¨å¯ä»¥å¨
+http://www.gnu.org/manual/æ¾å°
+
+WG14æ¯Cè¯è¨çå½é
æ ååå·¥ä½ç»ï¼URL:
http://www.open-std.org/JTC1/SC22/WG14/
+
+Kernel [EMAIL PROTECTED] 2002ï¼
+http://www.kroah.com/linux/talks/ols_2002_kernel_codingstyle_talk/html/
+
+--
+æåæ´æ°äº2007å¹´7æ13æ¥ã
--
1.5.3.8
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/