Что видит программист, начиная работать с языком C? Он видит fopen
, printf
, scanf
и ещё много других функций. Видит он и всякие open
и mmap
— казалось бы, зачем их выделять? Но, в отличие от первой группы, эти две функции при выполнении на ядре Linux являются системными вызовами (на самом деле нет, почти никогда системный вызов нельзя просто вызвать как функцию, и поэтому libc
содержит обёртки, перепаковывающие аргументы и иногда, как в случае с тем же open
, заменяющие старые системные вызовы более общими новыми). Вообще, в отличие от тысяч библиотечных функций, доступных на типичной GNU/Linux системе, интерфейс ядра имеет довольно ограниченное количество точек входа — порядка нескольких сотен, зато то, что для user space — crash (например, обращение к отсутствующей странице), для ядра — default mode of operation.
В этой статье я расскажу некоторые интересные на мой взгляд факты. В ней не будет futex
-ов и прочих скучных (наверное) деталей реализации. Будет преимущественно то, что вызывало у меня реакцию «А что, так можно было?!?».