Ядро Linux
Ядро выполняет множество полезной работы. Думаю, что правильно охарактеризовать его задачу можно так: оно заставляет железо выполнять задания программ точно, надежно и эффективно.
Процессор может единовременно выполнять только одну инструкцию, однако в системе Linux выполняются одновременно множество вещей. Ядро достигает этого быстрым переключением с задачи на задачу. Это приводит к лучшему использованию процессора, т.к. ядро отслеживает какие процессы готовы активно выполняться, а какие ожидают чего-либо вроде записи в файл или ввода с клавиатуры. Эта задача ядра называется scheduling.
Если программа ничего не делает -- её не надо держать в оперативной памяти. Если даже она что-то делает, могут найтись части, которые не делают ничего. Адресное пространство каждого процесса разделено на страницы. Ядро следит за тем, какие страницы каких процессов используются чаще. Редко используемые страницы могут быть перемещены в своп-раздел. Когда они понадобятся снова, другие неиспользуемые страницы перемещаются в своп, освобождая место в памяти. Это называется управлением виртуальной памятью.
Если вы уже компилировали своё собственное ядро, вы должны были заметить множество опций для различных устройств. Ядро содержит множество специального кода для взаимодействия с разнообразными видами железа и представляет все это для приложений достаточно простым и стандартным способом.
Ядро также управляет файловой системой, межпроцессным взаимодействием и всей этой сетевой кухней.
Будучи загруженным в память, первой задачей ядра является поиск и запуск программы init.