Linux:从32位用户模式程序中检测64位内核(长模式)

ato*_*ice 5 linux kernel 32-bit mode

检测32位用户模式程序是否在64位内核上运行(即系统是否处于"长模式")的最佳和最可靠的方法是什么?如果可能的话,我宁愿不调用外部程序(或者必须加载任何内核模块).

注意:我想检测是否正在使用64位内核(或者实际上,CPU是否处于长模式),而不仅仅是因为存在64位处理器(/proc/cpuinfo告诉我但不是64位)能力正在被使用).

如果uname编译为32位或者如果setarch i686使用,则内核伪造32位处理器.

tro*_*foe 6

调用该uname()函数并检查返回的machine字符串,该字符串将x86_64用于64位Intel平台.

扭转使用效果的一种方法setarch是重置个性:

#include <stdio.h>
#include <sys/utsname.h>
#include <sys/personality.h>

int main()
{
    struct utsname u;

    personality(PER_LINUX);

    uname(&u);
    puts(u.machine);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这在32位模式下编译并在64位系统上运行时显示正确的结果:

$ gcc -m32 -o u u.c
$ ./u
x86_64
$ setarch i686 ./u
x86_64
Run Code Online (Sandbox Code Playgroud)

编辑:固定代码以扭转效果setarch.

参考.