2015-09-28 8 views
0

У меня есть требование написать драйвер устройства Linux в пользовательском пространстве.Как улавливать системные вызовы в библиотеке пользовательского пространства в Linux?

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

Приложение должно быть в состоянии использовать open(), read(), write(), ioctl() на таких устройствах, как /dev/mydev0, но эти вызовы должны прекратить в пользовательском пространстве библиотеки вместо модуля ядра.

Просьба сообщить, если это возможно и как я могу это достичь.

+1

Вы можете подстерегать C оберток таких системных вызовов, используя обычные 'LD_PRELOAD' трюки; вы не можете напрямую захватить инструкции 'int 80' /' sysenter' (т. е. если кто-то называет «вручную» syscall, не проходя через оболочку libc) так же легко. –

+0

Привет, Не могли бы вы рассказать о том, как эти «трюки» LD_PRELOAD работают? Это может быть что-то, что я могу использовать. –

+0

http://superuser.com/a/370054/25859 –

ответ

1

Linux - это монолитное ядро ​​, что в общем означает, что вы спрашиваете, невозможно; вы не можете записывать произвольные драйверы в пользовательском режиме.

Вы мог (как ваше название намекает), использовать ptrace(2) в ловушке на системные вызовы, и в основном перенаправить их функции в библиотеке. Однако это не простое, простое решение.

Смотрите также:

FUSE (Filesystem в UserSpace) может быть то, что вы ищете. Это механизм, который позволяет специально создавать драйверы файловой системы через процесс пользовательского пространства. Так реализуется, например, sshfs.

Ресурсы:

Смежные вопросы