Подтвердить что ты не робот

Для чего предназначен модификатор asmlinkage?

Я прочитал, что он используется для функций, реализующих системные вызовы в Linux. Например:

asmlinkage long sys_getjiffies( void )
{
  return (long)get_jiffies_64();
}

и что он сообщает компилятору передать все аргументы функции в стек. Но разве это не так? Аргументы функции обычно передаются путем нажатия их только на стек. Или мы говорим о передаче аргументов функции через регистры здесь?

4b9b3361

Ответ 1

Здесь FAQ:

Тег asmlinkage - это еще одна вещь, которую мы должны наблюдать эта простая функция. Это #define для некоторой магии gcc, которая сообщает компилятор, чтобы функция не ожидала найти какую-либо ее аргументы в регистрах (общая оптимизация), но только на процессорах стек. Вспомним наше предыдущее утверждение о том, что system_call потребляет первый аргумент, номер системного вызова и позволяет до четырех аргументы, которые передаются вместе с реальным системным вызовом. system_call достигает этого подвига, просто оставив другие аргументы (которые были передается в регистры) в стеке. Все системные вызовы отмечены с тегом asmlinkage, поэтому все они смотрят на стек для аргументов. Конечно, в случае sys_ni_syscall это не имеет никакого значения, потому что sys_ni_syscall не принимает никаких аргументов, но это проблема для большинства других системных вызовов. И, поскольку вы увидите asmlinkageперед многими другими функциями я думал, что вы должны знать, что это был около.

Он также используется для вызова функции из файлов сборки.