【发布时间】:2012-11-30 07:01:08
【问题描述】:
这是交易。我想编写一个取决于内核类型(32 位或 64 位)的内核模块。 当且仅当内核为 32 位时,我希望将某些代码行包含在模块中,并且当内核为 64 位时应包含某些代码行。
对于这种情况,是否有类似 #if LINUX_VERSION_CODE
【问题讨论】:
标签: c linux linux-kernel operating-system kernel
这是交易。我想编写一个取决于内核类型(32 位或 64 位)的内核模块。 当且仅当内核为 32 位时,我希望将某些代码行包含在模块中,并且当内核为 64 位时应包含某些代码行。
对于这种情况,是否有类似 #if LINUX_VERSION_CODE
【问题讨论】:
标签: c linux linux-kernel operating-system kernel
您可以检查 CONFIG_X86_64 和 CONFIG_X86_32 - 如果架构是 x86。对于其他架构,也有类似的 CONFIG 选项。
【讨论】:
CONFIG_64BIT 浮现在脑海中。
CONFIG_X86_X32。
在终端上查看
$ uname -m
x86_64
检查二进制文件以确定系统上
$ file /usr/bin/file
/usr/bin/file: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.8, dynamically linked (uses shared libs), stripped
如果系统是multilib,当然可以在64-bit 系统上运行32-bit 应用程序。但是您可以查看系统本身的某些部分来验证它是64-bit。比如这样
$file /sbin/init
/sbin/init: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.16, dynamically linked (uses shared libs), stripped
引用自
【讨论】:
如果使用gcc,您可以测试_LP64 或__LP64__ 是否为#define'ed 为1:
这些宏被定义为值为 1,如果(且仅当)编译是针对 long int 和 pointer 都 使用 64 位 和 int 的目标使用 32 位。
对于gcc的预定义宏,请阅读这里:http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
【讨论】: