Ядро Linux в комментариях



Start_kernel - часть 3


Разрешение аппаратных прерываний путем вызова sti (строка для однопроцессорных компьютеров; более подробно эта тема рассматривается в ). Необходимо, чтобы прерывания по таймеру были активны, поэтому следующее обращение к calibrate_delay (строка ) вычислит BogoMIPS для данного компьютера (см. ). Поскольку значение BogoMIPS требуется для некоторых драйверов устройств, ядро должно определить эту величину перед инициализацией большинства оборудования, файловой системы и т.д.

Тестирует ЦП на предмет наличия определенных ошибок, например, ошибка Pentium F00F (см. ), и сохраняет информацию о найденных ошибках для остальных частей ядра, обеспечивая им возможность обходить ошибки. (Ради экономии бумаги код функции check_bugs не приводится.)

Вызов функции smp_init (строка ), которая, в свою очередь, обращается к другим функциям, активизирующим дополнительные ЦП в мультипроцессорной системе: для случая платформы х86 функция smp_boot_cpus (строка ) инициализирует определенные структуры данных ядра, которые отслеживают дополнительные ЦП и переводят их в режим ожидания; дальнейшее обращение к smp_commence (строка ) разрешает функционирование этих ЦП.

Инициирует выполнение функции init как поток ядра. Дополнительную информацию по этому поводу можно найти далее в главе.

Взводит флаг need_resched ожидающего процесса по причинам, на данный момент пока не вполне очевидным. Все станет ясно по прочтении глав , и . До возникновения следующего прерывания по таймеру (см. ) функция system_call (строка , обсуждаемая в ) убеждается, что флаг need_resched ожидающего процесса взведен и вызывает schedule (строка , обсуждаемая в ) для того, чтобы переключить ЦП на другой процесс.

Завершив инициализацию ядра (во всяком случае, передав ответственность за это функции init), все что осталось — это войти в цикл ожидания и отбирать у ЦП неиспользуемые циклы. Поэтому в данной строке производится обращение к cpu_idle (строка ), представляющей собой цикл ожидания. Из кода cpu_idle видно, что возврата из функции никогда не происходит. Однако, любая реальная задача эту функцию вытесняет.

Несложно заметить, что cpu_idle периодически выполняет системный вызов idle (системные вызовы рассматриваются в ), который проходит через sys_idle (строка ) для организации реального цикла ожидания — это видно из строки для однопроцессорной и строки для симметричной мультипроцессорной версии. Здесь производится вызов оператора hlt (останов), переводящего ЦП в «спящее» состояние, характеризующееся снижением энергопотребления. Такой режим означает, что ЦП не выполняет никакой реальной работы.




Содержание  Назад  Вперед