.. _cn_stable_api_nonsense: .. include:: ../disclaimer-zh_CN.rst :Original: :ref:`Documentation/process/stable-api-nonsense.rst <stable_api_nonsense>` 译者:: ä¸æ–‡ç‰ˆç»´æŠ¤è€…: 钟宇 TripleX Chung <xxx.phy@gmail.com> ä¸æ–‡ç‰ˆç¿»è¯‘者: 钟宇 TripleX Chung <xxx.phy@gmail.com> ä¸æ–‡ç‰ˆæ ¡è¯‘者: æŽé˜³ Li Yang <leoyang.li@nxp.com> Linux å†…æ ¸é©±åŠ¨æŽ¥å£ ================== 写作本文档的目的,是为了解释为什么Linuxæ—¢æ²¡æœ‰äºŒè¿›åˆ¶å†…æ ¸æŽ¥å£ï¼Œä¹Ÿæ²¡æœ‰ç¨³å®š çš„å†…æ ¸æŽ¥å£ã€‚è¿™é‡Œæ‰€è¯´çš„å†…æ ¸æŽ¥å£ï¼Œæ˜¯æŒ‡å†…æ ¸é‡Œçš„æŽ¥å£ï¼Œè€Œä¸æ˜¯å†…æ ¸å’Œç”¨æˆ·ç©ºé—´ 的接å£ã€‚å†…æ ¸åˆ°ç”¨æˆ·ç©ºé—´çš„æŽ¥å£ï¼Œæ˜¯æ供给应用程åºä½¿ç”¨çš„系统调用,系统调用 在历å²ä¸Šå‡ 乎没有过å˜åŒ–,将æ¥ä¹Ÿä¸ä¼šæœ‰å˜åŒ–。我有一些è€åº”用程åºæ˜¯åœ¨0.9版本 æˆ–è€…æ›´æ—©ç‰ˆæœ¬çš„å†…æ ¸ä¸Šç¼–è¯‘çš„ï¼Œåœ¨ä½¿ç”¨2.6ç‰ˆæœ¬å†…æ ¸çš„Linuxå‘布上ä¾ç„¶ç”¨å¾—很好 。用户和应用程åºä½œè€…å¯ä»¥å°†è¿™ä¸ªæŽ¥å£çœ‹æˆæ˜¯ç¨³å®šçš„。 æ‰§è¡Œçº²è¦ -------- ä½ ä¹Ÿè®¸ä»¥ä¸ºè‡ªå·±æƒ³è¦ç¨³å®šçš„å†…æ ¸æŽ¥å£ï¼Œä½†æ˜¯ä½ ä¸æ¸…æ¥šä½ è¦çš„实际上ä¸æ˜¯å®ƒã€‚ä½ éœ€ è¦çš„其实是稳定的驱动程åºï¼Œè€Œä½ åªæœ‰å°†é©±åŠ¨ç¨‹åºæ”¾åˆ°å…¬ç‰ˆå†…æ ¸çš„æºä»£ç æ ‘é‡Œï¼Œ æ‰æœ‰å¯èƒ½è¾¾åˆ°è¿™ä¸ªç›®çš„ã€‚è€Œä¸”è¿™æ ·åšè¿˜æœ‰å¾ˆå¤šå…¶å®ƒå¥½å¤„,æ£æ˜¯å› 为这些好处使得 Linux能æˆä¸ºå¼ºå£®ï¼Œç¨³å®šï¼Œæˆç†Ÿçš„æ“ä½œç³»ç»Ÿï¼Œè¿™ä¹Ÿæ˜¯ä½ æœ€å¼€å§‹é€‰æ‹©Linuxçš„åŽŸå› ã€‚ 入门 ----- åªæœ‰é‚£äº›å†™é©±åŠ¨ç¨‹åºçš„“怪人â€æ‰ä¼šæ‹…å¿ƒå†…æ ¸æŽ¥å£çš„改å˜ï¼Œå¯¹å¹¿å¤§ç”¨æˆ·æ¥è¯´ï¼Œæ—¢ 看ä¸åˆ°å†…æ ¸æŽ¥å£ï¼Œä¹Ÿä¸éœ€è¦åŽ»å…³å¿ƒå®ƒã€‚ 首先,我ä¸æ‰“算讨论关于任何éžGPL许å¯çš„å†…æ ¸é©±åŠ¨çš„æ³•å¾‹é—®é¢˜ï¼Œè¿™äº›éžGPLè®¸å¯ çš„é©±åŠ¨ç¨‹åºåŒ…括ä¸å…¬å¼€æºä»£ç ,éšè—æºä»£ç ,二进制或者是用æºä»£ç 包装,或者 是其它任何形å¼çš„ä¸èƒ½ä»¥GPL许å¯å…¬å¼€æºä»£ç 的驱动程åºã€‚如果有法律问题,请咨 询律师,我åªæ˜¯ä¸€ä¸ªç¨‹åºå‘˜ï¼Œæ‰€ä»¥æˆ‘åªæ‰“算探讨技术问题(ä¸æ˜¯å°çœ‹æ³•å¾‹é—®é¢˜ï¼Œ 法律问题很实际,并且需è¦ä¸€ç›´å…³æ³¨ï¼‰ã€‚ 既然åªè°ˆæŠ€æœ¯é—®é¢˜ï¼Œæˆ‘们就有了下é¢ä¸¤ä¸ªä¸»é¢˜ï¼šäºŒè¿›åˆ¶å†…æ ¸æŽ¥å£å’Œç¨³å®šçš„å†…æ ¸æº ä»£ç 接å£ã€‚这两个问题是互相关è”的,让我们先解决掉二进制接å£çš„问题。 äºŒè¿›åˆ¶å†…æ ¸æŽ¥å£ -------------- å‡å¦‚æˆ‘ä»¬æœ‰ä¸€ä¸ªç¨³å®šçš„å†…æ ¸æºä»£ç 接å£ï¼Œé‚£ä¹ˆè‡ªç„¶è€Œç„¶çš„,我们就拥有了稳定的 二进制接å£ï¼Œæ˜¯è¿™æ ·çš„å—?错。让我们看看关于Linuxå†…æ ¸çš„å‡ ç‚¹äº‹å®žï¼š - å–决于所用的C编译器的版本,ä¸åŒçš„å†…æ ¸æ•°æ®ç»“构里的结构体的对é½æ–¹ å¼ä¼šæœ‰å·®åˆ«ï¼Œä»£ç ä¸ä¸åŒå‡½æ•°çš„表现形å¼ä¹Ÿä¸ä¸€æ ·ï¼ˆå‡½æ•°æ˜¯ä¸æ˜¯è¢«inline 编译å–决于编译器行为)。ä¸åŒçš„函数的表现形å¼å¹¶ä¸é‡è¦ï¼Œä½†æ˜¯æ•°æ® 结构内部的对é½æ–¹å¼å¾ˆå…³é”®ã€‚ - å–å†³äºŽå†…æ ¸çš„é…置选项,ä¸åŒçš„é€‰é¡¹ä¼šè®©å†…æ ¸çš„å¾ˆå¤šä¸œè¥¿å‘生改å˜ï¼š - åŒä¸€ä¸ªç»“构体å¯èƒ½åŒ…å«ä¸åŒçš„æˆå‘˜å˜é‡ - 有的函数å¯èƒ½æ ¹æœ¬ä¸ä¼šè¢«å®žçŽ°ï¼ˆæ¯”如编译的时候没有选择SMPæ”¯æŒ ä¸€äº›é”函数就会被定义æˆç©ºå‡½æ•°ï¼‰ã€‚ - å†…æ ¸ä½¿ç”¨çš„å†…å˜ä¼šä»¥ä¸åŒçš„æ–¹å¼å¯¹é½ï¼Œè¿™å–决于ä¸åŒçš„å†…æ ¸é…置选 项。 - Linuxå¯ä»¥åœ¨å¾ˆå¤šçš„ä¸åŒä½“系结构的处ç†å™¨ä¸Šè¿è¡Œã€‚在æŸä¸ªä½“系结构上编 译好的二进制驱动程åºï¼Œä¸å¯èƒ½åœ¨å¦å¤–一个体系结构上æ£ç¡®çš„è¿è¡Œã€‚ å¯¹äºŽä¸€ä¸ªç‰¹å®šçš„å†…æ ¸ï¼Œæ»¡è¶³è¿™äº›æ¡ä»¶å¹¶ä¸éš¾ï¼Œä½¿ç”¨åŒä¸€ä¸ªC编译器和åŒæ ·çš„å†…æ ¸é… ç½®é€‰é¡¹æ¥ç¼–译驱动程åºæ¨¡å—å°±å¯ä»¥äº†ã€‚这对于给一个特定Linuxå‘布的特定版本æ 供驱动程åºï¼Œæ˜¯å®Œå…¨å¯ä»¥æ»¡è¶³éœ€æ±‚çš„ã€‚ä½†æ˜¯å¦‚æžœä½ è¦ç»™ä¸åŒå‘布的ä¸åŒç‰ˆæœ¬éƒ½å‘ 布一个驱动程åºï¼Œå°±éœ€è¦åœ¨æ¯ä¸ªå‘布上用ä¸åŒçš„å†…æ ¸è®¾ç½®å‚æ•°éƒ½ç¼–è¯‘ä¸€æ¬¡å†…æ ¸ï¼Œ è¿™ç®€ç›´è·Ÿå™©æ¢¦ä¸€æ ·ã€‚è€Œä¸”è¿˜è¦æ³¨æ„到,æ¯ä¸ªLinuxå‘布还æä¾›ä¸åŒçš„Linuxå†…æ ¸ï¼Œ è¿™äº›å†…æ ¸éƒ½é’ˆå¯¹ä¸åŒçš„硬件类型进行了优化(有很多ç§ä¸åŒçš„处ç†å™¨ï¼Œè¿˜æœ‰ä¸åŒ çš„å†…æ ¸è®¾ç½®é€‰é¡¹ï¼‰ã€‚æ‰€ä»¥æ¯å‘布一次驱动程åºï¼Œéƒ½éœ€è¦æ供很多ä¸åŒç‰ˆæœ¬çš„å†…æ ¸ 模å—。 ç›¸ä¿¡æˆ‘ï¼Œå¦‚æžœä½ çœŸçš„è¦é‡‡å–è¿™ç§å‘布方å¼ï¼Œä¸€å®šä¼šæ…¢æ…¢ç–¯æŽ‰ï¼Œæˆ‘很久以å‰å°±æœ‰è¿‡ 深刻的教è®... ç¨³å®šçš„å†…æ ¸æºä»£ç æŽ¥å£ -------------------- 如果有人ä¸å°†ä»–çš„å†…æ ¸é©±åŠ¨ç¨‹åºï¼Œæ”¾å…¥å…¬ç‰ˆå†…æ ¸çš„æºä»£ç æ ‘ï¼Œè€Œåˆæƒ³è®©é©±åŠ¨ç¨‹åº 一直ä¿æŒåœ¨æœ€æ–°çš„å†…æ ¸ä¸å¯ç”¨ï¼Œé‚£ä¹ˆè¿™ä¸ªè¯é¢˜å°†ä¼šå˜å¾—没完没了。 å†…æ ¸å¼€å‘是æŒç»è€Œä¸”快节å¥çš„,从æ¥éƒ½ä¸ä¼šæ…¢ä¸‹æ¥ã€‚å†…æ ¸å¼€å‘人员在当å‰æŽ¥å£ä¸ 找到bug,或者找到更好的实现方å¼ã€‚一旦å‘现这些,他们就很快会去修改当å‰çš„ 接å£ã€‚修改接å£æ„味ç€ï¼Œå‡½æ•°åå¯èƒ½ä¼šæ”¹å˜ï¼Œç»“构体å¯èƒ½è¢«æ‰©å……æˆ–è€…åˆ å‡ï¼Œå‡½æ•° çš„å‚数也å¯èƒ½å‘生改å˜ã€‚一旦接å£è¢«ä¿®æ”¹ï¼Œå†…æ ¸ä¸ä½¿ç”¨è¿™äº›æŽ¥å£çš„地方需è¦åŒæ—¶ ä¿®æ£ï¼Œè¿™æ ·æ‰èƒ½ä¿è¯æ‰€æœ‰çš„东西继ç»å·¥ä½œã€‚ 举一个例åï¼Œå†…æ ¸çš„USB驱动程åºæŽ¥å£åœ¨USBå系统的整个生命周期ä¸ï¼Œè‡³å°‘ç»åŽ† 了三次é‡å†™ã€‚这些é‡å†™è§£å†³ä»¥ä¸‹é—®é¢˜ï¼š - 把数æ®æµä»ŽåŒæ¥æ¨¡å¼æ”¹æˆéžåŒæ¥æ¨¡å¼ï¼Œè¿™ä¸ªæ”¹åŠ¨å‡å°‘了一些驱动程åºçš„ å¤æ‚度,æ高了所有USB驱动程åºçš„åžåçŽ‡ï¼Œè¿™æ ·å‡ ä¹Žæ‰€æœ‰çš„USB设备都 能以最大速率工作了。 - 修改了USBæ ¸å¿ƒä»£ç ä¸ä¸ºUSB驱动分é…æ•°æ®åŒ…内å˜çš„æ–¹å¼ï¼Œæ‰€æœ‰çš„驱动都 需è¦æ供更多的å‚æ•°ç»™USBæ ¸å¿ƒï¼Œä»¥ä¿®æ£äº†å¾ˆå¤šå·²ç»è¢«è®°å½•åœ¨æ¡ˆçš„æ»é”。 这和一些å°é—æºä»£ç çš„æ“作系统形æˆé²œæ˜Žçš„对比,在那些æ“作系统上,ä¸å¾—ä¸é¢ 外的维护旧的USB接å£ã€‚这导致了一个å¯èƒ½æ€§ï¼Œæ–°çš„å¼€å‘者ä¾ç„¶ä¼šä¸å°å¿ƒä½¿ç”¨æ—§çš„ 接å£ï¼Œä»¥ä¸æ°å½“çš„æ–¹å¼ç¼–写代ç ,进而影å“到æ“作系统的稳定性。 在上é¢çš„例åä¸ï¼Œæ‰€æœ‰çš„å¼€å‘者都åŒæ„这些é‡è¦çš„æ”¹åŠ¨ï¼Œåœ¨è¿™æ ·çš„æƒ…å†µä¸‹ä¿®æ”¹ä»£ 价很低。如果Linuxä¿æŒä¸€ä¸ªç¨³å®šçš„å†…æ ¸æºä»£ç 接å£ï¼Œé‚£ä¹ˆå°±å¾—åˆ›å»ºä¸€ä¸ªæ–°çš„æŽ¥å£ ï¼›æ—§çš„ï¼Œæœ‰é—®é¢˜çš„æŽ¥å£å¿…须一直维护,给Linux USBå¼€å‘者带æ¥é¢å¤–的工作。既然 所有的Linux USB驱动的作者都是利用自己的时间工作,那么è¦æ±‚他们去åšæ¯«æ— æ„ ä¹‰çš„å…è´¹é¢å¤–工作,是ä¸å¯èƒ½çš„。 安全问题对Linuxæ¥è¯´å分é‡è¦ã€‚一个安全问题被å‘现,就会在çŸæ—¶é—´å†…得到修 æ£ã€‚在很多情况下,这将导致Linuxå†…æ ¸ä¸çš„一些接å£è¢«é‡å†™ï¼Œä»¥ä»Žæ ¹æœ¬ä¸Šé¿å…安 全问题。一旦接å£è¢«é‡å†™ï¼Œæ‰€æœ‰ä½¿ç”¨è¿™äº›æŽ¥å£çš„驱动程åºï¼Œå¿…é¡»åŒæ—¶å¾—到修æ£ï¼Œ 以确定安全问题已ç»å¾—到修å¤å¹¶ä¸”ä¸å¯èƒ½åœ¨æœªæ¥è¿˜æœ‰åŒæ ·çš„å®‰å…¨é—®é¢˜ã€‚å¦‚æžœå†…æ ¸ 内部接å£ä¸å…许改å˜ï¼Œé‚£ä¹ˆå°±ä¸å¯èƒ½ä¿®å¤è¿™æ ·çš„安全问题,也ä¸å¯èƒ½ç¡®è®¤è¿™æ ·çš„ 安全问题以åŽä¸ä¼šå‘生。 å¼€å‘者一直在清ç†å†…æ ¸æŽ¥å£ã€‚如果一个接å£æ²¡æœ‰äººåœ¨ä½¿ç”¨äº†ï¼Œå®ƒå°±ä¼šè¢«åˆ 除。这 æ ·å¯ä»¥ç¡®ä¿å†…æ ¸å°½å¯èƒ½çš„å°ï¼Œè€Œä¸”所有潜在的接å£éƒ½ä¼šå¾—到尽å¯èƒ½å®Œæ•´çš„测试 (没有人使用的接å£æ˜¯ä¸å¯èƒ½å¾—到良好的测试的)。 è¦åšä»€ä¹ˆ -------- å¦‚æžœä½ å†™äº†ä¸€ä¸ªLinuxå†…æ ¸é©±åŠ¨ï¼Œä½†æ˜¯å®ƒè¿˜ä¸åœ¨Linuxæºä»£ç æ ‘é‡Œï¼Œä½œä¸ºä¸€ä¸ªå¼€å‘ è€…ï¼Œä½ åº”è¯¥æ€Žä¹ˆåšï¼Ÿä¸ºæ¯ä¸ªå‘布的æ¯ä¸ªç‰ˆæœ¬æ供一个二进制驱动,那简直是一个 噩梦,è¦è·Ÿä¸Šæ°¸è¿œå¤„于å˜åŒ–之ä¸çš„å†…æ ¸æŽ¥å£ï¼Œä¹Ÿæ˜¯ä¸€ä»¶è¾›è‹¦æ´»ã€‚ 很简å•ï¼Œè®©ä½ çš„é©±åŠ¨è¿›å…¥å†…æ ¸æºä»£ç æ ‘ï¼ˆè¦è®°å¾—我们在谈论的是以GPL许å¯å‘è¡Œ çš„é©±åŠ¨ï¼Œå¦‚æžœä½ çš„ä»£ç ä¸ç¬¦åˆGPL,那么ç¥ä½ 好è¿ï¼Œä½ åªèƒ½è‡ªå·±è§£å†³è¿™ä¸ªé—®é¢˜äº†ï¼Œ ä½ è¿™ä¸ªå¸è¡€é¬¼<把Andrewå’ŒLinus对å¸è¡€é¬¼çš„定义链接到这里>ï¼‰ã€‚å½“ä½ çš„ä»£ç åŠ å…¥ å…¬ç‰ˆå†…æ ¸æºä»£ç æ ‘ä¹‹åŽï¼Œå¦‚æžœä¸€ä¸ªå†…æ ¸æŽ¥å£æ”¹å˜ï¼Œä½ 的驱动会直接被修改接å£çš„ 那个人修改。ä¿è¯ä½ 的驱动永远都å¯ä»¥ç¼–è¯‘é€šè¿‡ï¼Œå¹¶ä¸”ä¸€ç›´å·¥ä½œï¼Œä½ å‡ ä¹Žä¸éœ€è¦ åšä»€ä¹ˆäº‹æƒ…。 æŠŠé©±åŠ¨æ”¾åˆ°å†…æ ¸æºä»£ç æ ‘é‡Œä¼šæœ‰å¾ˆå¤šçš„å¥½å¤„ï¼š - 驱动的质é‡ä¼šæå‡ï¼Œè€Œç»´æŠ¤æˆæœ¬ï¼ˆå¯¹åŽŸå§‹ä½œè€…æ¥è¯´ï¼‰ä¼šä¸‹é™ã€‚ - å…¶ä»–äººä¼šç»™é©±åŠ¨æ·»åŠ æ–°ç‰¹æ€§ã€‚ - 其他人会找到驱动ä¸çš„bug并修å¤ã€‚ - 其他人会在驱动ä¸æ‰¾åˆ°æ€§èƒ½ä¼˜åŒ–的机会。 - 当外部的接å£çš„改å˜éœ€è¦ä¿®æ”¹é©±åŠ¨ç¨‹åºçš„æ—¶å€™ï¼Œå…¶ä»–äººä¼šä¿®æ”¹é©±åŠ¨ç¨‹åº - ä¸éœ€è¦è”系任何å‘行商,这个驱动会自动的éšç€æ‰€æœ‰çš„Linuxå‘å¸ƒä¸€èµ·å‘ å¸ƒã€‚ 和别的æ“作系统相比,Linux为更多ä¸åŒçš„设备æ供现æˆçš„é©±åŠ¨ï¼Œè€Œä¸”èƒ½åœ¨æ›´å¤šä¸ åŒä½“系结构的处ç†å™¨ä¸Šæ”¯æŒè¿™äº›è®¾å¤‡ã€‚这个ç»è¿‡è€ƒéªŒçš„å¼€å‘模å¼ï¼Œå¿…然是错ä¸äº† çš„ :) æ„Ÿè°¢ ---- æ„Ÿè°¢ Randy Dunlap, Andrew Morton, David Brownell, Hanna Linder, Robert Love, and Nishanth Aravamudan 对于本文档早期版本的评审和建议。 英文版维护者: Greg Kroah-Hartman <greg@kroah.com>