Вызов trap_init()

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

Вызов parse_args()

Строка 427
Функция parse_args () выполняет парсинг аргументов, передаваемых в ядро Linux.
Например, nf sroot - это параметр ядра, устанавливающий корень файловой системы NFS для систем без диска. (Вы можете найти полный список параметров ядра в Documentation/kernel-parameters . txt.)
Строки 116-125
В parse_args () передаются следующие параметры:
• name. Строка символов, отображаемая при возникновении ошибки, когда ядро пытается выполнить парсинг аргументов параметров ядра. В стандартной операции это означает, что отображается сообщение «Booting kernel: Unknown parameter X».

Вызов page_alloc_init

Строка 425
Функция page_alloc_init () просто регистрирует функцию в цепи уведомлений1. Зарегистрированная функция page_alloc_cpu_notify () является функцией утечки страниц , связанной с динамической настройкой процессора.

Вызов build_all_zonelists()

Строка 424
Функция build_all_zonelists () разделяет память в зависимости от типа зоны ZONE_DMA, ZONE_NORMAL и ZONE_HIGHMEM. Как упоминалось в гл. 6, «Файловые системы», зоны - это линейное разделение физической памяти, используемое в основном для адресации аппаратных ограничений. Стоит заметить, что все зоны строятся именно в этой функции. После того как зоны построены, страницы сохраняются во фреймах страниц, расположенных в зонах.
Вызов build_all_zonelists () представляет nunvnodes и NODE_DATA. Глобальная переменная nunvnodes хранит количество узлов (или разделов) физической памяти.

Вызов schedjnit()

Строка 422
Вызов sched_init () помечает инициализацию всех объектов, с которыми работает планировщик, для назначения процессорного времени системным процессам. Имейте в виду, что в этой точке существует только один процесс, а именно процесс init, выполняемый shed_init ().

kernel/sched.с
3896 void init sched_init(void)
3897 {

3898 runqueue_t *rq;
3899 int i, j, k; 3900
3919 for (i = 0; i < NR_CPUS; i++) {
3920 prio_array_t *array;
3921
3 922 rq = cpu_rq(i);
3923 spin_lock_init (&rq->lock) ,-
3924 3925 3926

Вызов smp_prepare_boot_cpu()

Строка 415
Аналогично smp_per_cpu_areas (), smp_per_boot_cpu () заменяется в случае, если ядро Linux не поддерживает SMP:

include/1inux/srap.h
106 tdefine smp_prepare_boot_cpu()

do {} while (0)

Тем не менее, если ядро Linux откомпилировано без поддержки SMP, нам нужно позволить загрузочному процессору получить доступ к драйверу консоли и хранилищу для процессора, которое мы только что инициализировали. Это выполняется с помощью битовой маски для процессора.
Битовая маска процессора определяется следующим образом
include/asm-generic/cpumask.h

Вызов sehjp_per_cpu_areas()

Строка 409
Функция setup_per_cpu_areas () существует для настройки многопроцессорного окружения. Если ядро Linux скомпилировано без поддержки SMP, setup_per_cpu_areas () замещается ничегонеделанием следующим образом:
init/main.с
317 static inline void setup_per_cpu_areas(void) { }

Если ядро Linux компилируется с поддержкой SMP, setup_per_cpu_areas () определяется следующим образом:

init/main.с
327 static void init setup_per_cpu_areas(void)
328 {

329 unsigned long size, i;
330 char *ptr;
331 /* Создание с помощью магии компоновщика */

Вызов setupjarch

Строка 408
Функция setup_arch() в arch/i386/kernel/setup.c преобразуется в тип
init (обратитесь к описанию init в гл. 2), запускаемый только один раз во
время инициализации системы. Функция setup_arch () получает указатель на заданные во время загрузки в командной строке Linux данные и инициализирует множество архитектурно-зависимых подсистем, таких, как память, ввод-вывод, процессоры и консоли.

arch/
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112

Вызов printk(linux_banner)

Строка 407
Вызов отвечает за первый вывод в консоль, выполняемый ядром Linux. Он представлен глобальной переменной linux_banner:
init/version.с
31 const char *linux_banner =
32 "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@»
LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";
Файл version. с определяет linux_banner, как показано выше. Эта строка информирует пользователя о версии ядра Linux, версии дсс, с помощью которой оно откомпилировано, и название релиза.

Вызов page_address_init()

Стщюка 406
Вызов page_address_init () является первой функцией, связанной с инициализацией подсистемы памяти в архитектурно-зависимой части кода. Определение page_address_init () варьируется в зависимости от определения трех параметров компиляции. Первые два отключают page_address_init (), замещая тело функции на do {} while(0), как показано в следующем коде. Третью операцию мы рассмотрим подробнее. Давайте рассмотрим их определение и способ включения.

5—clude/1inux/mm.h
J76 #if defined(WANT_PAGE_VIRTUAL)
&& !def ined(WANT_PAGE_VTRTUAL) } while(0)

RSS-материал