EXPORT_SYMBOL

EXPORT_SYMBOL

EXPORT_SYMBOL,Linux内核源码的函数声明

/* For every exported symbol, place a struct in the __ksymtab section */
#define __EXPORT_SYMBOL(sym, sec)				\
	extern typeof(sym) sym;					\
	__CRC_SYMBOL(sym, sec)					\
	static const char __kstrtab_##sym[]			\
	__attribute__((section("__ksymtab_strings")))		\
	= MODULE_SYMBOL_PREFIX #sym;                    	\
	static const struct kernel_symbol __ksymtab_##sym	\
	__attribute_used__					\
	__attribute__((section("__ksymtab" sec), unused))	\
	= { (unsigned long)&sym, __kstrtab_##sym }

#define EXPORT_SYMBOL(sym)					\
	__EXPORT_SYMBOL(sym, "")
  • #define __EXPORT_SYMBOL(sym, sec) 定义了一个宏,用于声明和设置符号的导出属性。其中,sym是要导出的符号名称,sec是该符号在内核符号表中的节(section)名称,用于控制符号的可见性和访问权限。
  • extern typeof(sym) sym 这一行声明了符号sym的类型并声明为外部符号,意味着该符号将在其他地方定义。typeof(sym)用于获取sym的实际数据类型,确保声明的类型与定义处的类型一致。
  • __CRC_SYMBOL(sym, sec) 这一行调用了另一个宏__CRC_SYMBOL,用于生成符号的CRC校验值,这是内核安全和完整性检查的一部分,但在这个宏定义中具体的实现细节没有给出。
  • static const char _kstrtab##sym[] 定义了一个字符数组,用于存储符号名称的字符串表示。MODULE_SYMBOL_PREFIX是一个宏,通常用于在模块导出的符号前加上特定前缀,以避免全局命名冲突。
  • attribute((section(“__ksymtab_strings”)))将这个字符串放在名为
  • __ksymtab_strings的特殊节中,这是内核符号表字符串池的一部分。
  • static const struct kernel_symbol ksymtab##sym 定义了一个kernel_symbol结构体的实例,该结构体包含了符号的地址(通过(unsigned long)&sym获取)和对应的字符串表项(即上面定义的__kstrtab##sym)。这个结构体被放在__ksymtab节中,具体节名称通过sec参数决定,同时使用__attribute_used__确保编译器不会优化掉这个结构体,即使它可能未直接使用。attribute((unused))是矛盾的,通常用于防止编译器警告,这里可能是为了兼容性或者历史遗留原因。

和普通的用户程序的函数签名声明的区别是?

作用域与可见性

在用户程序中,当你在一个头文件中声明一个函数或全局变量,这通常是为了解决跨多个源文件共享该声明的需求。这种声明是语言级别的,帮助编译器理解函数或变量的类型和名称,以便在不同源文件间正确编译和链接。
VS
__EXPORT_SYMBOL宏则是内核级别的一种机制,专门用于导出内核空间的符号,使其对其他内核模块可见。这是系统级的交互,与用户空间的程序完全隔离。

生命周期与运行环境

用户程序中的符号声明适用于进程的生命周期。每个用户进程都有自己的地址空间,其内的符号独立于其他进程。
VS
内核符号通过__EXPORT_SYMBOL导出后,在整个内核生命周期中都是有效的,并且对所有加载的内核模块共享。内核空间与用户空间分离,内核模块之间通过这种方式共享函数和数据,运行在比用户程序更高的特权级别上。

链接与加载方式

用户程序在链接阶段会解决所有声明的外部符号,链接器会查找并绑定到相应的库函数或全局变量定义。
VS
内核模块则是在加载时动态解析这些导出符号。当一个新的内核模块需要使用另一个模块或内核核心导出的函数时,内核模块加载器会负责查找并绑定这些符号引用,这一过程更加灵活且发生在运行时。

安全性与权限管理

用户程序的符号一般不涉及特别的安全考虑,除非涉及到动态库的加载与卸载,以及潜在的DLL注入等高级话题。
VS
内核中的符号导出则紧密关联到系统安全,因为错误地导出符号可能会暴露敏感的内核功能给恶意模块,增加被攻击的风险。因此,内核对导出符号有严格的控制,如通过特定节划分、权限控制等手段来增强安全性。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 17:50:03       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 17:50:03       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 17:50:03       62 阅读
  4. Python语言-面向对象

    2024-07-13 17:50:03       72 阅读

热门阅读

  1. 【车载开发系列】汽车开发常见概念理解

    2024-07-13 17:50:03       21 阅读
  2. 深入理解Spring Boot中的定时任务调度

    2024-07-13 17:50:03       19 阅读
  3. 大数据平台建设概要

    2024-07-13 17:50:03       21 阅读
  4. python文件

    2024-07-13 17:50:03       23 阅读
  5. python运行环境在新旧电脑间迁移

    2024-07-13 17:50:03       21 阅读
  6. LeetCode题练习与总结:最小栈--155

    2024-07-13 17:50:03       19 阅读
  7. C++catch (...)陈述

    2024-07-13 17:50:03       17 阅读
  8. git切换远程仓库地址

    2024-07-13 17:50:03       24 阅读
  9. 自动发送每日电子邮件报告的 Python 脚本

    2024-07-13 17:50:03       18 阅读