Реализация copyout() во FreeBSD

Где определение функции copyout() во FreeBSD для AMD64?

(http://www.unix.com/man-page/FreeBSD/9/copyout/)

Единственное место, которое я могу найти, это sys/sys/systm.h.

Определение/декларация:

int     copyout(const void * __restrict kaddr, void * __restrict udaddr,
        size_t len) __nonnull(1) __nonnull(2);

Это декларация или определение? Что означают __nonnull(1) и __nonnull(2)?


person WindChaser    schedule 05.06.2015    source источник


Ответы (1)


Это прототип функции, также известный как декларация. Реализация (определение, если хотите) находится в исходниках ядра. Вы можете найти эти в Интернете или (если вы решили установить исходники) на вашем локальном Машина FreeBSD (под /usr/src/sys). На самом деле копий несколько, в зависимости от железа, для которого скомпилировано ядро. (Названия функций, кстати, "старые", я встречал их в середине 1980-х, и в то время они были хорошо известны).

Исходный код ядра содержит несколько реализаций этих функций, в зависимости от аппаратной платформы. Например, во FreeBSD 10 версия для amd64 написана на языке ассемблера (см. SVN в /usr/src/sys/amd64/amd64/support.S, например). В том же выпуске я нашел только одну реализацию, написанную на C (в поддереве powerpc), а в текущем исходном коде эта была переписана. Таким образом, чтобы узнать, «где» находится источник, вы должны провести небольшое исследование и найти соответствующий источник для вашей аппаратной платформы и версии FreeBSD.

__nonnull — это директива компилятора, говорящая ему, что данные параметры не являются явно нулевыми указателями. См., например, эти комментарии списка рассылки:

person Thomas Dickey    schedule 05.06.2015
comment
Знаете ли вы, где находится фактическое тело функции copyout() для AMD64, FreeBSD 10.1? Я знаю, что он должен быть в каких-то файлах, но не могу его найти. - person WindChaser; 05.06.2015
comment
Это в sys/amd64/amd64/support.S , см., например. здесь fxr.watson.org/fxr/source/amd64/amd64 /support.S#L227 - person nos; 05.06.2015
comment
Любой простой способ перехватить (записать или изменить скопированные байты) функцию copyout()? Перехватить его на ассемблере (%rdi, %rsi, %rdx) кажется затруднительным. - person WindChaser; 06.06.2015
comment
Если вы можете скомпилировать собственное ядро, вы можете переименовать точки входа в файле .S и вставить функцию языка Си, которая вызывает переименованные точки входа. - person Thomas Dickey; 06.06.2015