getunwind - копирует раскрученные данные в буфер вызывающего
getunwind(2)
копирует раскрученные данные в буфер вызывающего
ОБЗОР
#include <syscall.h>
#include <linux/unwind.h>
long getunwind(void *buf, size_t buf_size);
Замечание: в glibc нет обёрточной функции для данного системного вызова;
смотрите
ЗАМЕЧАНИЯ.
ОПИСАНИЕ
Замечание: этот вызов устарел.
Специальный системный вызов getunwind() для IA-64 копирует раскрученные
данные кадра вызова ядра в буфер, указанный в buf, и возвращает размер
раскрученных данных; эти данные описывают шлюзовую страницу (gate page, код
ядра, который отображается в адресное пространство пользователя).
Размер буфера buf задаётся в buf_size. Данные копируются только, если
значение buf_size больше или равно размеру раскрученных данных и значение
buf не равно NULL; в противном случае, данные не копируются и вызов
завершается без ошибки, возвращая размер, который необходим для хранения
раскрученных данных.
В начале раскрученных данных содержится таблица раскрутки. После неё
хранится связанная с раскруткой информация в произвольном порядке. В таблице
раскрутки содержатся записи в следующем виде:
u64 start; (64-битный адрес начала функции)
u64 end; (64-битный адрес конца функции)
u64 info; (смещение относительно BUF на раскрученную информацию)
Запись, у которой значение start равно нулю, указывает на конец
таблицы. Подробности формата смотрите в руководстве IA-64 Software
Conventions and Runtime Architecture.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении
getunwind() возвращает размер раскрученных
данных. При ошибке возвращается -1, а в
errno задаётся причина ошибки.
ОШИБКИ
Вызов
getunwind() завершается с ошибкой
EFAULT, если раскрученную
информацию невозможно сохранить в пространство, указанное
buf.
ВЕРСИИ
Данный системный вызов доступен в Linux начиная с версии 2.4.
СООТВЕТСТВИЕ СТАНДАРТАМ
Данный системный вызов есть только в Linux и доступен только на архитектуре
IA-64.
ЗАМЕЧАНИЯ
Данный системный вызов устарел. Современным способом получить раскрученные
данные ядра является шлюз DSO. Адрес заголовка ELF этого DSO передаётся на
уровень пользователя через
AT_SYSINFO_EHDR (смотрите
getauxval(3)).
В glibc нет обёрточной функции для данного системного вызова; в
маловероятном случае, когда вам нужно использовать его, используйте
syscall(2).