首页 > 其他分享 >Symbol Namespaces (符号命名空间)(翻译 by chatgpt)

Symbol Namespaces (符号命名空间)(翻译 by chatgpt)

时间:2023-12-07 23:13:06浏览次数:34  
标签:模块 符号 Symbol 空间 导入 Namespaces 命名 chatgpt SYMBOL

原文:https://www.kernel.org/doc/html/latest/core-api/symbol-namespaces.html

以下文件描述了如何使用符号命名空间来构造通过EXPORT_SYMBOL()宏系列导出的内核符号的导出表面。

1. 介绍

符号命名空间被引入作为结构化内核API导出表面的一种手段。它允许子系统维护者将其导出的符号分成单独的命名空间。这对于文档目的(比如SUBSYSTEM_DEBUG命名空间)以及限制一组符号在内核其他部分的使用范围都很有用。截至目前,使用导出到命名空间的符号的模块需要导入该命名空间。否则,内核将根据其配置拒绝加载模块或警告缺少导入。

2. 如何定义符号命名空间

可以使用不同的方法将符号导出到命名空间。所有这些方法都会改变EXPORT_SYMBOL及其相关宏的工作方式,以创建ksymtab条目。

2.1 使用EXPORT_SYMBOL宏

除了允许将内核符号导出到内核符号表的EXPORT_SYMBOL()EXPORT_SYMBOL_GPL()宏之外,还有这些宏的变体可用于将符号导出到特定命名空间:EXPORT_SYMBOL_NS()EXPORT_SYMBOL_NS_GPL()。它们需要一个额外的参数:命名空间。请注意,由于宏展开,该参数需要是一个预处理符号。例如,要将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(最好使用allmodconfig以覆盖所有内核模块)
  • 注意modpost关于缺少导入的警告
  • 运行make nsdeps将导入添加到正确的代码位置

也可以为外部模块构建运行nsdeps。典型用法是:

$ make -C <path_to_kernel_src> M=$PWD nsdeps

标签:模块,符号,Symbol,空间,导入,Namespaces,命名,chatgpt,SYMBOL
From: https://www.cnblogs.com/pengdonglin137/p/17868464.html

相关文章

  • How to get printk format specifiers right (如何正确使用printk格式说明符)(翻译 by
    原文:https://www.kernel.org/doc/html/latest/core-api/printk-formats.html#printk-specifiers如何正确使用printk格式说明符整数类型如果变量是Type类型,则使用printk格式说明符:signedchar%d或%hhxunsignedchar%u或%xchar......
  • 是什么让 ChatGPT 如此特别?
    “所以我听说RLHF使ChatGPT变得非常智能。”“ChatGPT使用强化学习,这就是它如此智能的原因。”嗯……有点。截至撰写本文时,人们对RLHF(即人类反馈强化学习)感到非常兴奋。我们做了一些事情来特别训练ChatGPT(以及越来越多的其他大型语言模型)。它们并不是全新的,但在ChatGPT发......
  • 在科技行业的热门趋势中,你必定无法忽视日益增长的人工智能大模型的影响力。无论是你热
    在科技行业的热门趋势中,你必定无法忽视日益增长的人工智能大模型的影响力。无论是你热衷浏览的短视频还是见不得的“AI绘画”,或者是你的朋友圈中充斥的“虚拟试衣”和智能聊天软件ChatGPT,这些都在告诉你,AI大模型正在为日常生活带来革命性的改变。今天,我们就来探讨如何使用AI大模型......
  • 文心一言 VS 讯飞星火 VS chatgpt (130)-- 算法导论11.2 2题
    二、用go语言,对于一个用链接法解决冲突的散列表,说明将关键字5,28,19,15,20,33,12,17,10插入到该表中的过程。设该表中有9个槽位,并设其散列函数为h(k)=kmod9。文心一言:在这个问题中,我们使用Go语言来解决一个散列(Hash)表的问题,该问题需要我们使用链接法解决冲突。我们的散列......
  • ChatGPT全线大崩溃!奥特曼亲自致歉:流量远超预期
    OpenAI前脚科技春晚炸翻全球,后脚自家院子却没能守住。原因无他,就是火爆......
  • 文心一言 VS 讯飞星火 VS chatgpt (129)-- 算法导论11.1 4题
    四、用go语言,我们希望在一个非常大的数组上,通过利用直接寻址的方式来实现一个字典。开始时该数组中可能包含一些无用信息,但要对整个数组进行初始化是不太实际的,因为该数组的规模太大。请给出在大数组上实现直接寻址字典的方案。每个存储对象占用O(1)空间;SEARCH、INSERT和DELETE操......
  • 爆料!马斯克 xAI 打造的ChatGPT竞品被曝光!
    作者|王二狗马斯克旗下公司xAI的第一款AI模型曝光!名为:Grōk ,有望成为ChatGPT最强竞品!Grōk是什么意思呢?二狗我问了一下GPT-4:GrōkAI曝光12项功能这次Grōk模型都曝光了什么内容呢?推特热心网友“小互”帮忙做了一个总结:1.超长prompt(SuperPrompt):GrōkAI能够处理长达25,000个......
  • 文心一言 VS 讯飞星火 VS chatgpt (150)-- 算法导论12.2 6题
    六、用go语言,考虑一棵二叉搜索树T,其关键字互不相同。证明:如果T中一个结点x的右子树为空,且x有一个后继y,那么y一定是x的最底层祖先,并且其左孩子也是x的祖先。(注意到,每个结点都是它自己的祖先。)文心一言,代码正常运行:灵捷3.5。为了证明上述命题,我们需要定义几个......
  • 文心一言 VS 讯飞星火 VS chatgpt (150)-- 算法导论12.2 6题
    六、用go语言,考虑一棵二叉搜索树T,其关键字互不相同。证明:如果T中一个结点x的右子树为空,且x有一个后继y,那么y一定是x的最底层祖先,并且其左孩子也是x的祖先。(注意到,每个结点都是它自己的祖先。)文心一言,代码正常运行:灵捷3.5。为了证明上述命题,我们需要定义几个辅助......
  • Unevictable LRU Infrastructure (翻译 by chatgpt)
    原文:https://www.kernel.org/doc/html/latest/mm/unevictable-lru.htmlIntroductionThisdocumentdescribestheLinuxmemorymanager's"UnevictableLRU"infrastructureandtheuseofthistomanageseveraltypesof"unevictable"folios......