Ядро воспроизводит весь набор функций, предоставляемых libc, статически внутри себя.
Как и в программировании на C в пользовательском режиме, функция может быть определена в одном модуле компиляции, а другой модуль может просто ссылаться на нее (обычно через файл заголовка), компилятор сделает ее неопределенной ссылкой, а компоновщик свяжет это с единицей компиляции, которая фактически предоставляет символ.
Загрузка модулей ядра работает по тому же принципу, что и динамическая загрузка , и она описана здесь: http://www.tldp.org/LDP/tlk/modules/modules .html