.. include:: ../disclaimer-zh_CN.rst :Original: Documentation/core-api/symbol-namespaces.rst :翻译: å¸å»¶è…¾ Yanteng Si <siyanteng@loongson.cn> .. _cn_symbol-namespaces.rst: ================================= 符å·å‘½å空间(Symbol Namespaces) ================================= 本文档æ述了如何使用符å·å‘½å空间æ¥æž„é€ é€šè¿‡EXPORT_SYMBOL()系列å®å¯¼å‡ºçš„å†…æ ¸å†…ç¬¦å·çš„导出é¢ã€‚ .. 目录 === 1 简介 === 2 如何定义符å·å‘½å空间 --- 2.1 使用EXPORT_SYMBOLå® --- 2.2 使用DEFAULT_SYMBOL_NAMESPACE定义 === 3 如何使用命å空间ä¸å¯¼å‡ºçš„ç¬¦å· === 4 åŠ è½½ä½¿ç”¨å‘½å空间符å·çš„æ¨¡å— === 5 自动创建MODULE_IMPORT_NS声明 1. 简介 ======= 符å·å‘½å空间已ç»è¢«å¼•å…¥ï¼Œä½œä¸ºæž„é€ å†…æ ¸å†…API的导出é¢çš„一ç§æ‰‹æ®µã€‚它å…许å系统维护者将 他们导出的符å·åˆ’分进独立的命å空间。这对于文档的编写éžå¸¸æœ‰ç”¨ï¼ˆæƒ³æƒ³SUBSYSTEM_DEBUG 命å空间),也å¯ä»¥é™åˆ¶ä¸€ç»„符å·åœ¨å†…æ ¸å…¶ä»–éƒ¨åˆ†çš„ä½¿ç”¨ã€‚ä»ŠåŽï¼Œä½¿ç”¨å¯¼å‡ºåˆ°å‘½åç©ºé—´çš„ç¬¦å· çš„æ¨¡å—必须导入命å空间。å¦åˆ™ï¼Œå†…æ ¸å°†æ ¹æ®å…¶é…置,拒ç»åŠ 载该模å—或è¦å‘Šè¯´ç¼ºå°‘ 导入。 2. 如何定义符å·å‘½å空间 ======================= 符å·å¯ä»¥ç”¨ä¸åŒçš„方法导出到命åç©ºé—´ã€‚æ‰€æœ‰è¿™äº›éƒ½åœ¨æ”¹å˜ EXPORT_SYMBOL å’Œä¸Žä¹‹ç±»ä¼¼çš„é‚£äº›å® è¢«æ£€æµ‹åˆ°çš„æ–¹å¼ï¼Œä»¥åˆ›å»º ksymtab æ¡ç›®ã€‚ 2.1 使用EXPORT_SYMBOLå® ======================= 除了å…è®¸å°†å†…æ ¸ç¬¦å·å¯¼å‡ºåˆ°å†…æ ¸ç¬¦å·è¡¨çš„å®EXPORT_SYMBOL()å’ŒEXPORT_SYMBOL_GPL()之外, 这些å®çš„å˜ä½“还å¯ä»¥å°†ç¬¦å·å¯¼å‡ºåˆ°æŸä¸ªå‘½å空间:EXPORT_SYMBOL_NS() å’Œ EXPORT_SYMBOL_NS_GPL()。 它们需è¦ä¸€ä¸ªé¢å¤–çš„å‚数:命å空间(the namespace)。请注æ„,由于å®æ‰©å±•ï¼Œè¯¥å‚数需 è¦æ˜¯ä¸€ä¸ªé¢„处ç†å™¨ç¬¦å·ã€‚例如,è¦æŠŠç¬¦å· ``usb_stor_suspend`` 导出到命å空间 ``USB_STORAGE``, 请使用:: EXPORT_SYMBOL_NS(usb_stor_suspend, USB_STORAGE); 相应的 ksymtab æ¡ç›®ç»“构体 ``kernel_symbol`` 将有相应的æˆå‘˜ ``命å空间`` 集。 导出时未指明命å空间的符å·å°†æŒ‡å‘ ``NULL`` 。如果没有定义命å空间,则默认没有。 ``modpost`` å’Œkernel/module/main.c分别在构建时或模å—åŠ è½½æ—¶ä½¿ç”¨å称空间。 2.2 使用DEFAULT_SYMBOL_NAMESPACE定义 ==================================== 为一个å系统的所有符å·å®šä¹‰å‘½å空间å¯èƒ½ä¼šéžå¸¸å†—长,并å¯èƒ½å˜å¾—éš¾ä»¥ç»´æŠ¤ã€‚å› æ¤ï¼Œæˆ‘ 们æ供了一个默认定义(DEFAULT_SYMBOL_NAMESPACE),如果设置了这个定义, å®ƒå°†æˆ ä¸ºæ‰€æœ‰æ²¡æœ‰æŒ‡å®šå‘½å空间的 EXPORT_SYMBOL() å’Œ EXPORT_SYMBOL_GPL() å®æ‰©å±•çš„默认 定义。 有多ç§æ–¹æ³•æ¥æŒ‡å®šè¿™ä¸ªå®šä¹‰ï¼Œä½¿ç”¨å“ªç§æ–¹æ³•å–决于å系统和维护者的喜好。第一ç§æ–¹æ³•æ˜¯åœ¨ å系统的 ``Makefile`` ä¸å®šä¹‰é»˜è®¤å‘½å空间。例如,如果è¦å°†usb-commonä¸å®šä¹‰çš„所有符å·å¯¼ 出到USB_COMMON命å空间,å¯ä»¥åœ¨drivers/usb/common/Makefileä¸æ·»åŠ è¿™æ ·ä¸€è¡Œ:: ccflags-y += -DDEFAULT_SYMBOL_NAMESPACE=USB_COMMON 这将影å“所有 EXPORT_SYMBOL() å’Œ EXPORT_SYMBOL_GPL() è¯å¥ã€‚当这个定义å˜åœ¨æ—¶ï¼Œ 用EXPORT_SYMBOL_NS()导出的符å·ä»ç„¶ä¼šè¢«å¯¼å‡ºåˆ°ä½œä¸ºå‘½å空间å‚æ•°ä¼ é€’çš„å‘½å空间ä¸ï¼Œ å› ä¸ºè¿™ä¸ªå‚数优先于默认的符å·å‘½å空间。 定义默认命å空间的第二个选项是直接在编译å•å…ƒä¸ä½œä¸ºé¢„处ç†å£°æ˜Žã€‚上é¢çš„例åå°±ä¼šå˜ æˆ:: #undef DEFAULT_SYMBOL_NAMESPACE #define DEFAULT_SYMBOL_NAMESPACE USB_COMMON 应置于相关编译å•å…ƒä¸ä»»ä½• EXPORT_SYMBOL å®ä¹‹å‰ 3. 如何使用命å空间ä¸å¯¼å‡ºçš„ç¬¦å· =============================== 为了使用被导出到命å空间的符å·ï¼Œå†…æ ¸æ¨¡å—需è¦æ˜Žç¡®åœ°å¯¼å…¥è¿™äº›å‘½å空间。 å¦åˆ™å†…æ ¸å¯èƒ½ä¼šæ‹’ç»åŠ 载该模å—。模å—代ç 需è¦ä½¿ç”¨å®MODULE_IMPORT_NSæ¥ è¡¨ç¤ºå®ƒæ‰€ä½¿ç”¨çš„å‘½å空间的符å·ã€‚例如,一个使用usb_stor_suspend符å·çš„ 模å—,需è¦ä½¿ç”¨å¦‚下è¯å¥å¯¼å…¥å‘½å空间USB_STORAGE:: MODULE_IMPORT_NS(USB_STORAGE); 这将在模å—ä¸ä¸ºæ¯ä¸ªå¯¼å…¥çš„命å空间创建一个 ``modinfo`` æ ‡ç¾ã€‚这也顺带 使得å¯ä»¥ç”¨modinfo检查模å—已导入的命å空间:: $ modinfo drivers/usb/storage/ums-karma.ko [...] import_ns: USB_STORAGE [...] 建议将 MODULE_IMPORT_NS() è¯å¥æ·»åŠ 到é 近其他模å—元数æ®å®šä¹‰çš„地方, 如 MODULE_AUTHOR() 或 MODULE_LICENSE() 。关于自动创建缺失的导入 è¯å¥çš„方法,请å‚考第5节。 4. åŠ è½½ä½¿ç”¨å‘½å空间符å·çš„æ¨¡å— ============================= 在模å—åŠ è½½æ—¶ï¼ˆæ¯”å¦‚ ``insmod`` ï¼‰ï¼Œå†…æ ¸å°†æ£€æŸ¥æ¯ä¸ªä»Žæ¨¡å—ä¸å¼•ç”¨çš„符å·æ˜¯å¦å¯ 用,以åŠå®ƒå¯èƒ½è¢«å¯¼å‡ºåˆ°çš„åå—空间是å¦è¢«æ¨¡å—å¯¼å…¥ã€‚å†…æ ¸çš„é»˜è®¤è¡Œä¸ºæ˜¯æ‹’ç» åŠ è½½é‚£äº›æ²¡æœ‰æŒ‡æ˜Žè¶³ä»¥å¯¼å…¥çš„æ¨¡å—。æ¤é”™è¯¯ä¼šè¢«è®°å½•ä¸‹æ¥ï¼Œå¹¶ä¸”åŠ è½½å°†ä»¥ EINVALæ–¹å¼å¤±è´¥ã€‚è¦å…è®¸åŠ è½½ä¸æ»¡è¶³è¿™ä¸ªå‰ææ¡ä»¶çš„模å—,å¯ä»¥ä½¿ç”¨æ¤é…置选项: 设置 MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=y å°†ä½¿åŠ è½½ä¸å—å½±å“,但会 å‘出è¦å‘Šã€‚ 5. 自动创建MODULE_IMPORT_NS声明 =============================== 缺少命å空间的导入å¯ä»¥åœ¨æž„å»ºæ—¶å¾ˆå®¹æ˜“è¢«æ£€æµ‹åˆ°ã€‚äº‹å®žä¸Šï¼Œå¦‚æžœä¸€ä¸ªæ¨¡å— ä½¿ç”¨äº†ä¸€ä¸ªå‘½å空间的符å·è€Œæ²¡æœ‰å¯¼å…¥å®ƒï¼Œmodpost会å‘出è¦å‘Šã€‚ MODULE_IMPORT_NS()è¯å¥é€šå¸¸ä¼šè¢«æ·»åŠ 到一个明确的ä½ç½®ï¼ˆå’Œå…¶ä»–模å—å…ƒ æ•°æ®ä¸€èµ·ï¼‰ã€‚为了使模å—作者(和åç³»ç»Ÿç»´æŠ¤è€…ï¼‰çš„ç”Ÿæ´»æ›´åŠ è½»æ¾ï¼Œæˆ‘们æ 供了一个脚本和makeç›®æ ‡æ¥ä¿®å¤ä¸¢å¤±çš„导入。修å¤ä¸¢å¤±çš„导入å¯ä»¥ç”¨:: $ make nsdeps 对模å—作者æ¥è¯´ï¼Œä»¥ä¸‹æƒ…况å¯èƒ½å¾ˆå…¸åž‹:: - 编写ä¾èµ–未导入命å空间的符å·çš„代ç - ``make`` - æ³¨æ„ ``modpost`` çš„è¦å‘Šï¼Œæé†’ä½ æœ‰ä¸€ä¸ªä¸¢å¤±çš„å¯¼å…¥ã€‚ - è¿è¡Œ ``make nsdeps``å°†å¯¼å…¥æ·»åŠ åˆ°æ£ç¡®çš„代ç ä½ç½®ã€‚ 对于引入命å空间的å系统维护者æ¥è¯´ï¼Œå…¶æ¥éª¤éžå¸¸ç›¸ä¼¼ã€‚åŒæ ·ï¼Œmake nsdeps最终将 ä¸ºæ ‘å†…æ¨¡å—æ·»åŠ ç¼ºå¤±çš„å‘½å空间导入:: - å‘命åç©ºé—´è½¬ç§»æˆ–æ·»åŠ ç¬¦å·ï¼ˆä¾‹å¦‚,使用EXPORT_SYMBOL_NS())。 - `make e`(最好是用allmodconfigæ¥è¦†ç›–æ‰€æœ‰çš„å†…æ ¸æ¨¡å—)。 - æ³¨æ„ ``modpost`` çš„è¦å‘Šï¼Œæé†’ä½ æœ‰ä¸€ä¸ªä¸¢å¤±çš„å¯¼å…¥ã€‚ - è¿è¡Œ ``maknsdeps``å°†å¯¼å…¥æ·»åŠ åˆ°æ£ç¡®çš„代ç ä½ç½®ã€‚ ä½ ä¹Ÿå¯ä»¥ä¸ºå¤–部模å—的构建è¿è¡Œnsdeps。典型的用法是:: $ make -C <path_to_kernel_src> M=$PWD nsdeps