我正在用 Java 编写一个程序,我需要确定编译 Linux 的体系结构。
我需要类似的东西uname -m
,但不运行任何程序,而是来自/proc
pseduo-fs。
什么是可靠的阅读来源?
答案1
由于您可以在 64 位计算机上安装 32 位 Linux,因此更安全的方法似乎是验证 CPU 功能。对于 Intel 和兼容处理器:
grep -o -w 'lm' /proc/cpuinfo
http://www.unixtutorial.org/2009/05/how-to-confirm-if-your-cpu-is-32bit-or-64bit/
您正在寻找的是以下标志:lm。它代表 X86_FEATURE_LM,即长模式(64 位)支持。如果您可以在 CPU 标志中找到“lm”标志,则意味着您正在寻找支持 64 位的处理器。
答案2
我所看到的一切都告诉我,uname
二进制文件只是进行了系统调用来uname()
获取其信息,因此这可能比您想要的更困难。如果您愿意实现一些 JNI,我建议您这样做并发出系统调用。/proc
我能找到的最有价值的伪文件是/proc/sys/kernel/osrelease
,在我的系统上它的内容为4.2.3-300.fc23.x86_64
.这会随着版本的不同而变化,并且可能会在 Linux 的风格之间发生巨大的变化,因此它可能不像您需要的那么可靠。
答案3
看起来没有包含uname -m
输出行的文件,即x86_64
或ppc64le
. Arch 既不存储/proc/cpuinfo
在/proc/sys/kernel/
.
但也许比解析/proc/cpuinfo
(Rui F Ribeiro 的 xaccepted 答案)稍微好一点的是解析/sys/devices/system/cpu/modalias
:
$ cat /sys/devices/system/cpu/modalias # x86_64
cpu:type:x86,ven0000fam0006mod005E:feature:,0000,0001,0002,0003...
$ cat /sys/devices/system/cpu/modalias # s390x
cpu:type:z13:feature:,0000,0001,0002,0003,0004,0005,0006,0007,0008,0009,000A,000B
但接下来的问题是如何映射这些。
顺便说一句,在内核中它的定义UTS_MACHINE := $(ARCH)
如下生成文件
如果需要通过拱门进行调整:
ifeq ($(CONFIG_X86_32),y)
...
UTS_MACHINE := i386
...
else
...
UTS_MACHINE := x86_64
...
UTS_MACHINE := $(subst $(space),,$(machine-y))
UTS_MACHINE := s390x
架构64:
ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
...
UTS_MACHINE := aarch64_be
else
...
UTS_MACHINE := aarch64
endif
答案4
尝试 uname 命令。
$ 男人 uname
或者
$ uname -a
再见,