Что означает значение Bad RIP?

Вы можете использовать zdbдля определения подобной информации -просто получить индексный дескриптор и набор данных. Например, если ваш набор данных называется tank/foo, вы можете использовать ls -iдля определения номера инода, а затем zdb -ddddd tank/foo $INODEдля вывода информации.

Вот пример на моей машине:

# cd /var/tmp
# mkfile 13104 file1
# ls -i file1
  4125 file1
# zdb -ddddd rpool/VARSHARE/tmp 4125
Dataset rpool/VARSHARE/tmp [ZPL], ID 4128, cr_txg 928175, 8.24G, 1223 objects, rootbp DVA[0]=<0:1f62907a00:200:STD:1> DVA[1]=<0:f4a2eda00:200:STD:1> [L0 DMU objset] fletcher4 lzjb LE unique unencrypted size=800L/200P birth=14962025L/14962025P fill=1223 contiguous 2-copy cksum=1b152e5f60:7b661ed2ecb:1445f97091785:278e0e37baf85b

    Object  lvl   iblk   dblk  dsize  lsize   %full  type
      4125    1    16K  13.0K  13.0K  13.0K  100.00  ZFS plain file
                                        168   bonus  System attributes
        dnode flags: USED_BYTES USERUSED_ACCOUNTED 
        dnode maxblkid: 0
        path    /file1
        uid     0
        gid     0
        atime   Fri Sep  7 18:48:00 2018
        mtime   Fri Sep  7 18:48:00 2018
        ctime   Fri Sep  7 18:48:00 2018
        crtime  Fri Sep  7 18:48:00 2018
        gen     14962023
        mode    0100600
        size    13104
        parent  4
        links   1
        pflags  0x40800000204
Indirect blocks:
                 0 L0 0:0x1f55eb0200:0x3400 0x3400L/0x3400P F=1 B=14962023/14962023 ---

                segment [000000000000000000, 0x0000000000003400) size 13.0K
#

Это позволит вам узнать размер данных и количество метаданных (, помеченных как «косвенные блоки» ), которые использует ваш файл.

В данном случае он точно выделил блок размером 13 КБ и использует один непрямой блок размером 16 КБ. Итак, он использует 29 КБ для хранения файла 13 КБ. Я предполагаю, что ваши цифры будут похожи.

Обратите внимание, что 16-килобайтный «iblk», скорее всего, сжат, поэтому можно поспорить, что физически он занимает всего 4 килобайта.

1
03.12.2020, 08:44
1 ответ

«RIP» — это 64-битный -регистр указателя инструкций ЦП. Его значение определяет адрес, по которому ЦП будет получать следующую команду для выполнения.

(В архитектуре x64 исходный 16-битный -указатель инструкции был (и до сих пор )называется IP; когда архитектура была расширена до 32 -бит, префикс E был добавлен к именам регистров для обозначения доступа к 32 -битам, а с x86 _64 был добавлен префикс R для обозначения полного 64 -бита. ] битовый доступ.)

«Неверное значение RIP» будет означать, что регистр указателя команд указывает на адрес, который не содержит исполняемой памяти. Это предполагает ошибки, такие как неправильная инициализация указателя на функцию перед попыткой ее использования или, возможно, перезапись адреса возврата функции в стеке, поэтому инструкция машинного кода RETв конечном итоге попытается вернуться по неправильному адресу.

4
18.03.2021, 22:45

Теги

Похожие вопросы