我正在使用"英特尔至强处理器(Skylake,IBRS)"的服务器上运行代码.我在底部列出了cpu标志.我得到了一个内核转储,在gdb中运行它,发现非法的指令是\uu builtin\u ia32\u wrfsbase64(我称为内在的\u writefsbase\u u64)__内置ia32\U rdfsbase64也会导致非法指令.它支持fsgsbase标志,所以我不知道为什么会出现问题

标志:fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse2 syscall nx pdpe1gb rdtscp lm CONTANT\U tsc rep\U good nopl xtopology cpuid tsc\U known\U freq pni pclmulqdq ssse3 fma cx16 pcid sse4\U 1 sse4\U 2 x2apic movbe POPCNTC tsc\U DETAILD\U计时器aes XSAVX f16c rdrand hypervisor lahf\U lm abm cpuid INVID\U fault U单pti ssbd ibrs ibpb fsgsbase bmi1 hleavx2 smep bmi2 erms invpcid rtm avx512f avx512dq clwb avx512cd avx512bw avx512vl xsaveopt arat pku ospke

推荐答案

FSGSBASE指令需要操作系统和硬件的支持.操作系统必须意识到,用户代码可以在不通知操作系统的情况下更改基址寄存器;较旧的操作系统可能会假设只有在用户进行显式系统调用时才能更改寄存器.CR4中有一个位确定是否允许非特权代码执行这些指令,默认情况下,它是未设置的.其 idea 是,只有包含适当支持的操作系统才能启用此位.详见Intel's guidelines.

在Linux中,这种支持是在内核版本5.9(changelog)中添加的.根据您的 comments ,您使用的是较旧的内核,因此无法使用这些指令,必须使用arch_prctl系统调用来请求更新FS或GS基址寄存器.或者升级内核/操作系统.

ELF AUX向量中有一个位,您的程序可以在运行时进行测试,以确定FSGSBASE指令是否可用.请参阅"FSGSBASE指令启用"下的https://www.kernel.org/doc/html/latest/x86/x86_64/fsgs.html.

Linux相关问答推荐

如何检测文件系统是否支持权限?

ln命令报错target not a directory

从 curl 命令输出中获取值

如何让 Flutter 用鼠标拖动而不是滚轮滚动? (Linux)

在 SLURM 作业(job)脚本中设置和传递字符串变量

如何重新安装最新的 cmake 版本?

Linux 进程在后台 - 在作业(job)中 Stopped停止?

如何判断 Ubuntu 12.04 LTS 上是否安装了多个版本的 PHP?

具体来说,fork() 如何处理 Linux 中 malloc() 动态分配的内存?

通过 VM 的 Centos - 镜像列表中没有 URL

如何通过 ssh 判断 ubuntu 服务器上是否存在 php 和 apache

为什么可执行文件操作系统依赖于?

为什么 JVM 报告的已提交内存比 linux 进程驻留集大小更多?

是否有一个 linux 命令来确定与给定进程 ID 关联的窗口 ID?

*nix 系统上是否有与 COM 等效的功能?如果不是,那么 *nix 的可重用性方法是什么?

如何知道linux调度器时间片?

如何显示正在运行的进程列表 Python?

以 qsub 开头的 shell 脚本的参数

将默认 Python 版本从 2.4 更改为 2.6

当我已经 ssh 进入远程机器时,如何 scp 回到本地?