Это отрицательное число, так что это одно слово перед базой FS. Вам необходим базовый адрес FS, который равен , а не значению селектора в регистре сегмента FS, которое можно увидеть с помощью отладчика.
Возможно, ваш процесс совершил системный вызов, чтобы попросить ОС установите его или, возможно, использовали инструкцию wrfsbase
в некоторых точках в системах, которые ее поддерживают.
Обратите внимание, что по крайней мере за пределами Go, Linux обычно использует FS для потока локальное хранилище.
(Я не уверен, что стандартный способ на самом деле найти базу FS; это, очевидно, зависит от ОС, чтобы сделать это в пользовательском пространстве, где rdmsr
недоступен; FS и База GS выставляется как MSR, поэтому ОС используют вместо фактического изменения записи GDT или LDT. rdfsbase
должно быть включено ядром, установив бит в CR4 на процессорах которые поддерживают расширение ISA FSGSBASE, поэтому вы не можете рассчитывать на это.)
@ MargaretBloom предполагает, что пользовательское пространство может вызвать ошибку неверной страницы; большинство ОС сообщают о сбойном виртуальном адресе обратно в пространство пользователя. Например, в Linux SIGSEGV имеет адрес. (Или SIGBUS, если он был неканоническим, IIR C. То есть не в младших или старших 47 битах виртуального адресного пространства, а в «дыре», где адрес не является расширением знака младших 48. )
Таким образом, вы хотите установить обработчики сигналов для этих сигналов и попробовать загрузку со смещением, которое (с 0 основанием) будет в середине пространства ядра, или что-то в этом роде. Если по какой-либо причине это не является ошибкой, увеличьте виртуальный адрес на 1 ТБ или что-то в al oop. Обычно MMIO не отображается в виртуальном адресном пространстве пользовательского пространства, поэтому побочных эффектов для простого чтения нет.