Начало: start_kernel()

Вызов mem_init()

Строка 457
Как на х86, так и на РРС вызов mem_init () ищет свободные страницы и посылает информацию о них на консоль. Вспомните из гл. 4, что ядро Linux разбивает доступную память на зоны. На данный момент у Linux есть три зоны:
• Zone_DMA. Память меньше 16 Мб.
• Zone_Normal. Память начиная с 16 Мб и меньше 896 Мб. (Ядро использует последние 128 Мб.)
• ZoneHIGHMEM. Память больше 1 Гб.

Настройка initrd

Эта инструкция #def ine выполняет проверку initrd - начального загрузочного диска.
Система, использующая initrd, загружает ядро и монтирует начальный диск в памяти как корневую файловую систему. Программы могут запускаться с диска в памяти и, когда приходит время для новой корневой файловой системы, как и в случае с жестким диском, могут быть смонтированы, а диск в памяти размонтирован.
Эта операция просто проверяет корректность указанного диска в памяти. Если это не так, мы устанавливаем initrd_start в 0, т. е. указываем ядру не использовать диск в памяти.

Вызов localJrq_enable()

Строка 448
Функция local_irq_enable () позволяет прерывания текущего процессора. Обычно является парной для функции local_irq_disable (). В предыдущих версиях ядра для этих целей использовались пары sti () и cli {). Несмотря на то, что эти макросы до сих пор ссылаются на sti () и cli (), ключевым словом здесь является local. Они действуют только на текущий работающий процессор:
include\asm-i386\system.h
446 tdefine local_irq_disable() _asm
447 #define local_irg_enable() asm
volatile ("cli": : :"memory")
volatile ("sti": : :"memory")
Строки 446-447

Вызов profile_init()

Строка 447
prof ile_in.it () выделяет память для хранения ядром данных профилирования. Профиль в терминах компьютерных наук используется для описания набора данных во время работы программы. Данные профилирования применяются для анализа производительности и изучения работы программы (в нашем случае самого ядра Linux).

kernel/profile.с
3 0 void init profile_init(void)
31 {
32 unsigned int size;
33
34 if (!prof_on)
35 return;
37 /* профилируется только текст */
38 prof_len = _etext - _stext;
3 9 prof_len »= prof_shiЈt;
40

Вызов consoleJnit()

Строка 444
Компьютерная консоль - это устройство, куда ядро (и другие компоненты системы) выводит сообщения. Также она употребляется для регистрации пользователя. В зависимости от системы консоль может быть монитором или просто последовательным портом. Функция console_init () вызывается для предварительной инициализации устройства консоли, что позволяет сообщать о статусе загрузки системы.

drivers/char/tty_io.с
2347 void init console_init(void)
2348 {
2349 initcall_t *call;
2352 (void) tty_register_ldisc (N_TTY, &tty_ldisc_N_TTY) ,-
23 58 #ifdef CONFIG_EARLY_PRINTK

Вызов time_init()

Строка 437

Вызов sofrirq_init()

Строка 436
Функция sof tirq_init () подготавливает загрузочный процессор к приему уведомлений оттасклетов. Рассмотрим содержимое sof tirq_init ().

kernel/softirq.с
317 void init softirq_init(void)
318 {

319 open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL);
320 open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL);
321 }
327 void init softirq_init(void)
328 {

329 open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL);
330 open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL);
331 tasklet_cpu_notify(&tasklet_nb, (unsigned long)CPU_UP_PREPARE,

Вызов init_IRQ()

Строка 433
Функция init_IRQ() в arch/i386/kernel/i8259. с инициализирует контроллер аппаратных прерываний, таблицу векторов прерываний и системный таймер для х86. В гл. 3 приводится подробное обсуждение прерываний как для х86, так и для РРС, с использованием в качестве примера прерывания часов реального времени.

arch/i386/kernel/i8259.с
410 void init init_IRQ(void)
411 {
412 int i;
422 for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) {
423 int vector = FIRST_EXTERNAL_VECTOR + i;
424 if (i >= NR_IRQS)
425 break;
430 if (vector != SYSCALL_VECTOR)

Вызов rcu_init()

Строка 432
Функция rcu_init () инициализирует Read-Copy-Update (RCU)1 ядра Linux 2.6. RCU контролирует доступ к критическим разделам кода и включает обоюдное исключение в системе за счет получения блокировки в зависимости от скорости чипа. Реализация RCU в Linux выходит за пределы рассмотрения этой книги. Мы уже мимоходом упоминали вызовы к подсистеме RCU при анализе нашего кода, но в подробности мы вдаваться не будем. (Более подробную информацию о подсистеме RCU Linux см. в странице Linux Scalability Effort в http://lse. source-forge . net/locking/rcupdate. html.)

Вызов trap_init()

Строка 431
В гл. 3 мы представляли вашему вниманию исключения и прерывания. Функция trap_init () специфична для обработки прерываний на архитектуре х86. Коротко говоря, эта функция инициализирует таблицу связи х86 с аппаратурой. Каждый элемент в таблице имеет функцию для обработки ядром связанных с пользователем вещей, таких, как неправильные инструкции или связь с не находящимися в памяти страницами. Несмотря на то что на PowerPC существуют аналогичные вещи, его архитектура обрабатывает их по-другому. (Это уже обсуждалось в гл. 3.)

RSS-материал