【问题标题】:How to determine whether a linux kernel is 32bit or 64bit from a running kernel module如何从正在运行的内核模块中确定 linux 内核是 32 位还是 64 位
【发布时间】:2012-11-30 07:01:08
【问题描述】:

这是交易。我想编写一个取决于内核类型(32 位或 64 位)的内核模块。 当且仅当内核为 32 位时,我希望将某些代码行包​​含在模块中,并且当内核为 64 位时应包含某些代码行。

对于这种情况,是否有类似 #if LINUX_VERSION_CODE

【问题讨论】:

    标签: c linux linux-kernel operating-system kernel


    【解决方案1】:

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

    【讨论】:

    • 从问题来看,他正在制作内核模块并且需要编译时检查,这是最好的选择。还有一些可能相关的选项,因为不清楚它是否仅限于 X86 或不是 CONFIG_64BIT 浮现在脑海中。
    • 现在也需要注意CONFIG_X86_X32
    • 很好的解决方案,因为它只依赖于内核源代码树,无论如何你都需要编译一个模块。
    • @Steve-o:不适用于内核模块。没有 X32 内核这样的东西。 Linux 内核是 32 位或 64 位的。 X32 仅是用户态,在 64 位内核上运行。
    • @jlliagre 很有趣,谢谢,如果模块与用户空间通信,它是否需要注意 X32?
    【解决方案2】:

    在终端上查看

    $ 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
    

    引用自

    http://www.linuxquestions.org/questions/linux-general-1/how-to-check-linux-kernel-is-32-bit-or-64-bit-612352/

    【讨论】:

    • 这听起来不是解决问题的好方法,而且检查二进制文件也不可靠,因为您可以在 64 位内核上拥有 32 位用户空间。
    【解决方案3】:

    如果使用gcc,您可以测试_LP64__LP64__ 是否为#define'ed 为1

    这些宏被定义为值为 1,如果(且仅当)编译是针对 long int 和 pointer使用 64 位 和 int 的目标使用 32 位。

    对于gcc的预定义宏,请阅读这里:http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-01
      • 2011-04-19
      • 2017-06-29
      • 2010-09-19
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      • 2012-08-14
      相关资源
      最近更新 更多