Linux Kernel (Ядро линукса) (часть 3)


Средние века: функция setupO

Код ассемблерной функции setupO записан компоновщиком в файл с образом ядра со смещением 0x2оо. Загрузчик легко находит этот код и копирует его в оперативную память, начиная с адреса 0х00090200.

Функция setupO должна инициализировать аппаратные устройства компьютера и установить окружение для выполнения программы ядра. Хотя система BIOS уже проинициализировала большинство аппаратных устройств, Linux не полагается на нее и заново инициализирует устройства по-своему, чтобы усилить переносимость и устойчивость. Функция setupO выполняет следующие действия:
1. В системах, удовлетворяющих стандарту ACPI, она вызывает процедуру BIOS, которая строит в оперативной памяти таблицу, описывающую схему расположения физических областей памяти в системе (эту таблицу можно увидеть среди сообщений ядра на этапе загрузки, если поискать метку ”BIOS-e820”). В старых версиях операционной системы эта функция вызывает процедуру BIOS, которая просто возвращает размер оперативной памяти в системе.
2. Настраивает параметры клавиатуры. (Если пользователь держит клавишу нажатой в течение установленного времени, клавиатура начинает снова и снова отправлять процессору соответствующий код клавиши через установленные интервалы.)
3. Инициализирует видеоадаптер.
4. Заново инициализирует контроллер диска и определяет параметры диска.
5. Проверяет шину IBM Micro Channel (MCA).
6. Проверяет устройство PS/2 (мышь).
7. Проверяет, поддерживает ли BIOS систему управления питанием АРМ (Advanced Power Management).
8. Если BIOS поддерживает EDD (Enhanced Disk Drive Services, Расширенные службы дисковых приводов), функция вызывает необходимую процедуру, чтобы построить оперативной памяти таблицу, описывающую жесткие диски, доступные в системе. Информация, содержащаяся в таблице, доступна в файлах каталога firmware/edd специальной файловой системы sysfs.
9. Если образ ядра был загружен в память низко (начиная с физического адреса охоооюооо), функция перемещает его по адресу охооооюоо. Если же образ ядра был загружен высоко, функция оставляет его на месте. Этот шаг необходим, потому что с целью хранения образа ядра на дискете и для ускорения загрузки образ ядра хранится на диске в упакованном виде, а процедуре распаковки нужно свободное место в памяти вслед за образом ядра под временный буфер.
10. Настраивает вход А20 контроллера клавиатуры 8042. Вход А20 был специально создан в системах 80286, для совместимости физических адресов с адресами старых процессоров 8088. К сожалению, настройка А20 необходима до включения защищенного режима, иначе центральный процессор будет считать, что двадцать первый бит любого физического адреса равен нулю. Настройка А20 нарушает стройность описываемой процедуры.
11. Устанавливает временную таблицу дескрипторов прерываний (IDT) и временную глобальную таблицу дескрипторов (GDT).
12. Настраивает блок операций с плавающей точкой (FPU), если таковой имеется.
13. Перепрограммирует программируемые контроллеры прерываний (PIC), чтобы замаскировать все прерывания, кроме IRQ2, которое является каскадным прерыванием между двумя Р1С-контроллерами.
14. Переключает центральный процессор с реального режима на защищенный, устанавливая без ре в регистре состояния его. Бит pg в регистре его сброшен, поэтому управление страницами по-прежнему не работает.
15. Передает управление ассемблерной функции startup_32 .
Эпоха Возрождения: функции startup_320
Существуют две различные функции startup_32 о. Та, о которой мы будем
говорить, находится в файле arch/i386/boot/compressed/head.S. По окончании
работы функции setup о функция startup_32 находится по адресу либо
охооюоооо, либо охооооюоо, в зависимости от того, высоко или низко загружен образ ядра.

Эта функция выполняет следующие действия:

1. Инициализирует регистры сегментации и временный стек.
2. Сбрасывает все биты регистра efiags.
3. Заполняет нулями область неинициализированных данных ядра, идентифицируемую символами edata и end
4. Вызывает функцию decompress kernei о для распаковки образа ядра. Вначале появляется сообщение "Uncompressing Linux.” (Распаковка Linux). По окончании распаковки выводится сообщение "OK, booting the kernel” (Все в порядке, загружается ядро). Если образ ядра был загружен низко, распакованное ядро помещается по физическому адресу охооюоооо. В противном случае оно помещается во временный буфер после упакованного образа. Затем распакованный образ переносится в окончательное положение, начинающееся с физического адреса охооюоооо.
5. Переходит по физическому адресу охооюоооо.
Распакованный образ ядра начинается со второй функции startup_32 о, которая находится в файле arch/i386/kemel/head.S. Совпадение имен функций не создает проблем (разве что при чтении этого раздела), потому что обе они вызываются путем передачи управления по конкретным физическим адресам.
Вторая функция startup_32 устанавливает среду выполнения для первого процесса Linux (процесса 0). Она выполняет следующие действия:
1. Инициализирует регистры сегментации их окончательными значениями.
2. Заполняет нулями bss-сегмент ядра
3. Инициализирует временные Таблицы Страниц ядра, содержащиеся в swapper pg dir и рдО, чтобы точно отобразить линейные адреса в те же самые физические адреса
4. Сохраняет адрес глобального каталога страниц в регистре сгЗ и включает управление страницами, устанавливая бит pg в регистре его.
5. Подготавливает стек режима ядра для процесса 0
6. Еще раз сбрасывает все биты в регистре efiags.
7. Вызывает функцию setup idto для заполнения таблицы IDT пустыми” обработчиками прерываний
8. Записывает параметры системы, полученные от BIOS, и параметры, переданные операционной системе, в первый страничный кадр
9. Идентифицирует модель процессора.
10. Загружает в регистры gdtr и idtr адреса таблиц GDT и IDT.
11. Передает управление функции start kernei

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...