为什么不应该在 linux 内核中将全局变量初始化为 0 / NULL / false?
Why globals shouldn't be initialized at 0 / NULL / false in the linux kernel?
我正在为我自己的固件使用 linux 内核中的 checkpatch.pl 脚本,因为我使用相同的编码风格(我喜欢)。
只是有个错误,我不太了解全局变量:
do not initialise globals to 0
当然我想尽可能避免使用全局变量,但不知道为什么这是一个样式错误?
是因为一些 编译器不把这样的全局变量放在.BSS 中吗?
(通常他们足够聪明)
首先,它是冗余的,并且增加了内核的大小(不是最终加载的内容,而是通过向 linker 提供不必要的明确指令)。
这是一个更大问题的一部分:
假设您有两个不同的目标文件 link 在一起,并且对如何初始化它们有不同的想法。然后 linker 必须检测到并产生符号冲突错误。脚本也与此有关。
进一步阅读:
- .bss vs COMMON: what goes where?
- Uninitialised global data in C – .bss section vs common symbols
- Shared Libraries Redux(伊恩·兰斯·泰勒)
我正在为我自己的固件使用 linux 内核中的 checkpatch.pl 脚本,因为我使用相同的编码风格(我喜欢)。
只是有个错误,我不太了解全局变量:
do not initialise globals to 0
当然我想尽可能避免使用全局变量,但不知道为什么这是一个样式错误?
是因为一些 编译器不把这样的全局变量放在.BSS 中吗? (通常他们足够聪明)
首先,它是冗余的,并且增加了内核的大小(不是最终加载的内容,而是通过向 linker 提供不必要的明确指令)。
这是一个更大问题的一部分: 假设您有两个不同的目标文件 link 在一起,并且对如何初始化它们有不同的想法。然后 linker 必须检测到并产生符号冲突错误。脚本也与此有关。
进一步阅读:
- .bss vs COMMON: what goes where?
- Uninitialised global data in C – .bss section vs common symbols
- Shared Libraries Redux(伊恩·兰斯·泰勒)