C 如何从运行的内核模块确定linux内核是32位还是64位

C 如何从运行的内核模块确定linux内核是32位还是64位,c,linux,linux-kernel,operating-system,kernel,C,Linux,Linux Kernel,Operating System,Kernel,这是交易。我想写一个内核模块,它取决于内核类型(32位或64位)。 当且仅当内核是32位时,我想在模块中包含一些代码行,当内核是64位时,应该包含一些代码行 对于这种情况,是否有类似于“如果LINUX版本代码

这是交易。我想写一个内核模块,它取决于内核类型(32位或64位)。 当且仅当内核是32位时,我想在模块中包含一些代码行,当内核是64位时,应该包含一些代码行


对于这种情况,是否有类似于“如果LINUX版本代码<内核版本(2,6,26)]的东西?

您可以检查CONFIG_X86_64和CONFIG_X86_32-如果arch是X86。对于其他架构,也有类似的配置选项。

在终端上检查此选项

$ 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
如果系统是
multi-lib
,那么人们当然可以在
64位
系统上运行
32位
应用程序。但您可以查看系统本身的某些部分,以验证它是否为
64位
。比如像这样

 $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
,您可以测试
\u LP64
\u LP64\u
是否为
,定义为
1

如果(且仅当)编译针对的是长int和指针都使用64位和int使用32位的目标,则定义这些宏,值为1


对于
gcc
的预定义宏,请阅读此处:

因为从问题来看,他正在制作内核模块,需要进行编译时检查,这是最好的选择。此外,还有一些可能与此相关的选项,因为不清楚它是否仅限于X86或
CONFIG_64BIT
。人们现在也需要注意。这是一个很好的解决方案,因为它只依赖于内核源代码树,您无论如何都需要编译一个模块。@Steve-o:不适用于内核模块。没有X32内核这样的东西。Linux内核是32位或64位的。X32仅为userland,在64位内核上运行。@jlliagre有趣的是,thx,如果模块与用户空间通信,是否有远程机会需要了解X32?这听起来不是解决问题的好办法,而且检查二进制文件也不可靠,因为在64位内核上可以有32位用户空间。