我刚检查了我的linux盒子的配置文件/ boot / config _ $(uname -r),我发现这两个标志都已定义:
CONFIG_X86_64=y
CONFIG_X86=y
这两个标志不应该互相排斥吗?
另外,我想知道这两个标志是否只应该在内核中使用,因为我看到很多
#ifdef CONFIG_X86_64
在内核源代码中。用户空间应用程序也可以使用此标志吗?
此外,由于处理器可以从64位模式更改为兼容模式。如果发生这种变化,依赖于CONFIG_X86_64的代码在运行时都会失败,对吧?应用程序(内核或用户空间)如何检测机器是64位还是兼容模式?
感谢。
答案 0 :(得分:2)
CONFIG_X86
是目标架构的标志,整个x86系列。
这包括32位和64位处理器。
通过查看最新的内核(编写本文时为4.15.1)可以看出这一点Kconfig file 1
# SPDX-License-Identifier: GPL-2.0
# Select 32 or 64 bit
config 64BIT
bool "64-bit kernel" if ARCH = "x86"
default ARCH != "i386"
---help---
Say yes to build a 64-bit kernel - formerly known as x86_64
Say no to build a 32-bit kernel - formerly known as i386
config X86_32
def_bool y
depends on !64BIT
#... other options removed
config X86_64
def_bool y
depends on 64BIT
在此文件中,配置选项将被删除CONFIG_
前缀
定义了CONFIG_X86_64
,{i}定义CONFIG_64BIT
,否则CONFIG_X86_32
查看depends on
声明以查看它。
在64位内核中,此命令cat /boot/config-$(uname -r) | grep 'CONFIG_64BIT'
应返回CONFIG_64BIT=y
。
在this answer中也确认了如何将32位配置转换为64位配置的问题。
CONFIG_X86_64
的反义词因此CONFIG_X86_32
。
TL; DR CONFIG_X86
是为所有x86处理器定义的,或者是位数。 CONFIG_X86_64
仅针对支持AMD64 / IA32e的x86处理器的子集定义。
1 此链接可能随时更改。请参阅this。