LINUX.ORG.RU

спецификатор в функции


0

0

Плиз подскажите, что означает asmlinkage при определении функции.
Часто встречается в ядре и модулях. Поиск по gcc сайту ни к чему не
привел.
Спасибо.

anonymous

Это макрос, определённый в файле linux/include/linux/linkage.h.
Для i386 имеет значение __attribute__((regparm(0))), атрибут regparm можно найти в документации к gcc, он указывает, сколько параметров функции может передаваться в регистрах.

http://lxr.linux.no/source/include/linux/linkage.h

justme
()

2justme:Спасибо за разъяснение. А не вкурсе почему так в ядре и
модулях любят параметры функции через стэк передавать?
и почему кроме __attribute__ есть еще и attribute, да еще и то что
в скобках тоже с двумя __ полно, например
__attribute__((__section__(".text.init"))) вместо
__attribute__((section(".text.init"))) или
attribute((section(".text.init")))?

anonymous
()

Скорее всего, потому, что для передачи параметров в регистрах нет стандарта. Почему есть attribute - не знаю, в документации я его не нашёл. Два знака подчёркивания в начале нужны для того, чтобы не было конфликтов имён, два '_' в конце строго говоря не нужны, очевидно они там для симметрии.

justme
()

Вот что пишут в gcc:

5.25 Declaring Attributes of Functions

In GNU C, you declare certain things about functions called in your program which help the compiler optimize function calls and check your code more carefully.

The keyword __attribute__ allows you to specify special attributes when making a declaration. This keyword is followed by an attribute specification inside double parentheses. Fourteen
attributes, noreturn, pure, const, format, format_arg, no_instrument_function, section, constructor, destructor, unused, weak, malloc, alias and no_check_memory_usage are currently
defined for functions. Several other attributes are defined for functions on particular target systems. Other attributes, including section are supported for variables declarations (see section 5.32
Specifying Attributes of Variables) and for types (see section 5.33 Specifying Attributes of Types).

You may also specify attributes with `__' preceding and following each keyword. This allows you to use them in header files without being concerned about a possible macro of the same name.
For example, you may use __noreturn__ instead of noreturn.

Я так понял что эти ключевые слова не являются зарезервированными и
поэтому мы можем даже сделать так:
int attribute;
А два подчерка пишется, чтоб небыло проблем с этим.
//----------------------------------------------------------------

А по поводу функций: непонятно почему они все тогда не объявляют
как asmlinkage, неужели после оптимизации компилятор что-либо через
регистры передает :) И зачем вообще asmlinkage нужен, ведь параметры
итак через стек передаются, Я сам дизассемблировал и проверял.

Как ты уже понял мозги у меня всякой ерундой забиты :)

anonymous
()

Я точно не знаю, зачем им это. Где-то в той же документации к gcc написано, что regparm имеет по умолчанию значение 0. Скорее всего, в linux'е это указано явно на всякий случай. Вообще передавать параметры через регистры эффективнее, и gcc может когда-нибудь перейти на этот способ.

Есть ещё объяснение тут: http://kernelnewbies.org/faq/index.php3#asmlinkage.xml, но я лично ничего из него не понял...

justme
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.