Внутреннее устройство ядра Linux 2.4




Высокоуровневая инициализация


Под "высокоуровневой инициализацией" следует понимать действия, непосредственно не связанные с начальной загрузкой, даже не смотря на то, что часть кода, выполняющая ее, написана на ассемблере, а именно в файле arch/i386/kernel/head.S, который является началом декомпрессированного ядра. При инициализации выполняются следующие действия:

  • Устанавливаются сегментные регистры (%ds = %es = %fs = %gs = __KERNEL_DS = 0x18).
  • Инициализируются таблицы страниц.
  • Разрешается листание страниц, установкой бита PG в %cr0.
  • Обнуляется BSS (для SMP (мультипроцессорных систем (прим. перев.)), это действие выполняет только первый CPU).
  • Копируются первые 2k bootup параметров (kernel commandline).
  • Проверяется тип CPU, используя EFLAGS и, если возможно, cpuid, позволяющие обнаружить процессор 386 и выше.
  • Первый CPU вызывает start_kernel(), все остальные - arch/i386/kernel/smpboot.c:initialize_secondary(), если переменная ready=1, которая только переустанавливает esp/eip.
  • Функция init/main.c:start_kernel() написана на C и выполняет следующие действия:

  • Выполняется глобальная блокировка (необходимая для того, чтобы через процесс инициализации проходил только один CPU)
  • Выполняются платформо-зависимые настройки (анализируется раскладка памяти, копируется командная строка и пр.).
  • Вывод "баннера" ядра, который содержит версию, компилятор, использованные при сборке, и пр., в кольцевой буфер для сообщений. Текст "баннера" задается в переменной linux_banner, определенной в init/version.c. Текст этот можно вывести на экран командой cat /proc/version.
  • Инициализация ловушек.
  • Инициализация аппаратных прерываний (irqs).
  • Инициализация данных для планировщика.
  • Инициализация данных хранения времени.
  • Инициализация подсистемы программных прерываний (softirq).
  • Разбор параметров командной строки.
  • Инициализация консоли.
  • Если ядро было скомпилировано с поддержкой загружаемых модулей, инициализируется подсистема динамической загрузки модулей.
  • Инициализируются профилирующие буферы, если командная строка содержит указание "profile=".



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