Замена системных вызовов (системных вызовов) в Linux 2.6+ - PullRequest
2 голосов
/ 19 июня 2011

Я пытаюсь написать пользовательскую библиотеку потоков , поскольку в этой области, похоже, нет активной работы, и я считаю, что C ++ 0x обещания и фьючерсы могут дать этой модели некоторую мощность. К сожалению, для того, чтобы эта модель работала, важно обеспечить переключение контекста при блокировке вызовов. Поэтому я хотел бы перехватить каждый системный вызов, чтобы заменить его асинхронной версией. Есть несколько предостережений:

  • Я знаю, что асинхронные системные вызовы существуют почти для каждого регулярного системного вызова, но по причинам обратной совместимости это нереальное решение.
  • Я знаю, что в Linux 2.4 или более ранней версии можно было напрямую изменить таблицу sys_call_table, но это исчезло.
  • Поскольку я хотел бы, чтобы моя библиотека была статически связана при желании, трюк LD_PRELOAD не является жизнеспособным.
  • Аналогично, модули ядра не являются опцией, поскольку предполагается, что это библиотека пользовательского интерфейса.
  • Наконец, ptrace () также не подходит по аналогичным причинам. У меня не может быть, чтобы моя библиотека разветвляла новый процесс только для того, чтобы его использовали.

Возможно ли это?

1 Ответ

1 голос
/ 23 сентября 2011

Я пытаюсь написать библиотеку потоков пользователя, поскольку в этой области, похоже, нет активной работы

Возможно, вы захотите взглянуть на библиотеки потоков Marcel (и его публикации ) и MPC , которые реализуют гибридные (ядро и пользовательского уровня) потоки, главным образом для целей высокого уровня.Performance Computing, поэтому им пришлось найти какое-то решение для этой блокировки системных вызовов.

Чтобы избежать блокировки потоков ядра, когда приложение выполняет блокировку системных вызовов, Марсель использует Планировщик активаций когда они доступны или просто перехватывают такие блокирующие вызовы на уровне динамических символов.

...